Ошибка при установке значения атрибута контекста объект

Содержание:

1.       Ошибка при установке значения атрибута контекста

2.       Ошибка при получении значения атрибута контекста

Одной из наиболее частых ошибок исполнения кода 1С являются ошибки, связанные с установкой реквизита либо получением реквизита через точку, либо ошибка при вызове функции или процедуры через точку. Все данные объекты являются атрибутами информационных объектов-владельцев, к которым они принадлежат. Рассмотрим примеры таких ошибок и причины их возникновения.  

1.    Ошибка при установке значения атрибута контекста

Ошибка при установке значения атрибута контекста говорит нам о невозможности присвоить выбранное значение определенному атрибуту информационного объекта. Вызвано это либо несовпадением типа атрибута и присваиваемого ей значения, отсутствием возможности присвоить значение выбранному атрибуту, так как его можно только читать, но не записывать в него, отсутствием прав у текущего пользователя на запись значений в данный атрибут. Например, в реквизит «ДатаДокумента» с типом «Дата» пытаемся записать строку, в реквизит с типом данных ссылки на документ пытаемся записать не ссылку, а объект, полученный по ссылке, что невозможно из-за несоответствия типов, что приводит к ошибке установки значения атрибута. 

Другой пример – проходя циклом выборку запроса, пытаемся в колонку выборки записать значение, что невозможно, так как значения выборки запроса можно только считывать, а для того, чтобы можно было полученные из запроса данные изменять в коде, нужно пользоваться не выборкой, а выгружать результат запроса в таблицу значений, в таком случае в цикле по ней можно будет менять значения в колонках, но только на значения, соответствующие типу колонки. Либо у пользователя, под которым выполняется код, нет прав на изменение даты документа, при попытке записать в данный реквизит новую дату, будет выведено сообщение об ошибке установке значения, но в причине будет указано отсутствие прав у пользователя.  

2.    Ошибка при получении значения атрибута контекста

Ошибка при получении значения атрибута контекста указывает на невозможность прочитать значение атрибута объекта в силу его отсутствия, либо отсутствия прав на его чтение. Например, обращение к несуществующему реквизиту объекта, несуществующему полю выборки из запроса, несуществующему свойству элемента формы и т.п. Так же как пример можно рассмотреть получение текущего пользователя из параметров сеанса — если данный параметр сеанса не установлен, то тоже будет выведена ошибка получения значения атрибута контекста, но в причине будет указана попытка получения неинициализированного значения параметра сеанса.

При возникновении данных ошибок значения атрибута в 1Св первую очередь следует проверить существование атрибута, к которому обращаются, затем проверить совпадение типов значений атрибута и присваиваемого ему значения, затем уже проверить права на установку либо чтение значения. Проверить, является ли дело в правах либо дать права на действия с атрибутом, можно, установив привилегированный режим для совершения действия с данным атрибутом, прописав перед строчкой с ошибкой УстановитьПривилегированныйРежим(Истина), после строчки — УстановитьПривилегированныйРежим(Ложь).  

Специалист компании «Кодерлайн»

Александр Суворов

Содержание:

1.       Ошибка при установке значения атрибута контекста

2.       Ошибка при получении значения атрибута контекста

Одной из наиболее частых ошибок исполнения кода 1С являются ошибки, связанные с установкой реквизита либо получением реквизита через точку, либо ошибка при вызове функции или процедуры через точку. Все данные объекты являются атрибутами информационных объектов-владельцев, к которым они принадлежат. Рассмотрим примеры таких ошибок и причины их возникновения.  

1.    Ошибка при установке значения атрибута контекста

Ошибка при установке значения атрибута контекста говорит нам о невозможности присвоить выбранное значение определенному атрибуту информационного объекта. Вызвано это либо несовпадением типа атрибута и присваиваемого ей значения, отсутствием возможности присвоить значение выбранному атрибуту, так как его можно только читать, но не записывать в него, отсутствием прав у текущего пользователя на запись значений в данный атрибут. Например, в реквизит «ДатаДокумента» с типом «Дата» пытаемся записать строку, в реквизит с типом данных ссылки на документ пытаемся записать не ссылку, а объект, полученный по ссылке, что невозможно из-за несоответствия типов, что приводит к ошибке установки значения атрибута. 

Другой пример – проходя циклом выборку запроса, пытаемся в колонку выборки записать значение, что невозможно, так как значения выборки запроса можно только считывать, а для того, чтобы можно было полученные из запроса данные изменять в коде, нужно пользоваться не выборкой, а выгружать результат запроса в таблицу значений, в таком случае в цикле по ней можно будет менять значения в колонках, но только на значения, соответствующие типу колонки. Либо у пользователя, под которым выполняется код, нет прав на изменение даты документа, при попытке записать в данный реквизит новую дату, будет выведено сообщение об ошибке установке значения, но в причине будет указано отсутствие прав у пользователя.  

2.    Ошибка при получении значения атрибута контекста

Ошибка при получении значения атрибута контекста указывает на невозможность прочитать значение атрибута объекта в силу его отсутствия, либо отсутствия прав на его чтение. Например, обращение к несуществующему реквизиту объекта, несуществующему полю выборки из запроса, несуществующему свойству элемента формы и т.п. Так же как пример можно рассмотреть получение текущего пользователя из параметров сеанса — если данный параметр сеанса не установлен, то тоже будет выведена ошибка получения значения атрибута контекста, но в причине будет указана попытка получения неинициализированного значения параметра сеанса.

При возникновении данных ошибок значения атрибута в 1Св первую очередь следует проверить существование атрибута, к которому обращаются, затем проверить совпадение типов значений атрибута и присваиваемого ему значения, затем уже проверить права на установку либо чтение значения. Проверить, является ли дело в правах либо дать права на действия с атрибутом, можно, установив привилегированный режим для совершения действия с данным атрибутом, прописав перед строчкой с ошибкой УстановитьПривилегированныйРежим(Истина), после строчки — УстановитьПривилегированныйРежим(Ложь).  

Специалист компании «Кодерлайн»

Александр Суворов

Нельзя изменять поле, содержащее объект данных формы

Я
   AnisaL

08.08.19 — 12:59

Добрый день!

Скажите пожалуйста, такая ошибка: {UDS_GAME Документ.ЧекККМ.Форма.ФормаДокумента_РМК.Форма(328)}: Ошибка при установке значения атрибута контекста (Запасы)

    ЗаполнитьСуммуВсегоВТаблице(Объект.Запасы, Объект.СуммаВключаетНДС);

по причине:

Нельзя изменять поле, содержащее объект данных формы

Что делать?

   Кац

1 — 08.08.19 — 13:00

(0) Что делать?

Не изменять поле содержащее объект данных формы

   RomanYS

2 — 08.08.19 — 13:01

(0) Сделать ЗаполнитьСуммуВсегоВТаблице контектсной и не передавать туда Объект.Запасы, оно и так будет доступно в контексте

   AnisaL

3 — 08.08.19 — 13:02

(2) а как сделать контекстной?

   hhhh

4 — 08.08.19 — 13:03

(3) показывайте уже вашу функцию

   Кац

5 — 08.08.19 — 13:04

&НаСервере

ЗаполнитьСуммуВсегоВТаблице()

   AnisaL

6 — 08.08.19 — 13:08

(4)// Заполняет поле СуммаВсего в зависимости от признака включения НДС в цену.

//
// Параметры:

// Таблица         - ДанныеФормыКоллекция - Таблица, в которой необходимо заполнить колонку СуммаВсего.
// ЦенаВключаетНДС - Булево - признак включения НДС в цену.

//
Процедура ЗаполнитьСуммуВсегоВТаблице(Таблица, ЦенаВключаетНДС) Экспорт
    
    Для Каждого СтрокаТаблицы Из Таблица Цикл
        ЗаполнитьСуммуВсегоВСтрокеТаблицы(СтрокаТаблицы, ЦенаВключаетНДС);
    КонецЦикла;
    
КонецПроцедуры// ЗаполнитьСуммуВсегоВТаблице()
   AnisaL

7 — 08.08.19 — 13:16

(2) все-таки как сделать контекстной?

   RomanYS

8 — 08.08.19 — 13:20

(7) смотри (5)

Но в данном случае не поможет (слишком универсальная функция). Твоя функция проста, сделай её &НаКлиенте вместе с ЗаполнитьСуммуВсегоВСтрокеТаблицы

   AnisaL

9 — 08.08.19 — 14:44

(8) я сделала функцию без параметров, и вот такой:

&НаСервере

Процедура ЗаполнитьСуммуВсегоВТаблице()
    
    Для Каждого СтрокаТаблицы Из Объект.Запасы Цикл
        ЗаполнитьСуммуВсегоВСтрокеТаблицы(СтрокаТаблицы, Объект.СуммаВключаетНДС);
    КонецЦикла;
    
КонецПроцедуры

ЗаполнитьСуммуВсегоВСтрокеТаблицы тоже сделала &НаСервере
   RomanYS

10 — 08.08.19 — 14:48

(9) Это и имелось в виду в (2), но процедура сталане универсальной.

Проще (и вероятно правильнее) делать такие (простые) расчеты на клиенте — проблема вообще не возникла бы.

   hhhh

11 — 08.08.19 — 15:15

(9) оно и было на сервере. Потому что если ничего не указано, значит на сервере. То есть и было на сервере, и ты указала на сервере, ничего не изменилось.

   RomanYS

12 — 08.08.19 — 15:18

(11) >> ничего не изменилось.

изменялись параметры, их больше нет

  

palsergeich

13 — 08.08.19 — 15:23

Настало время рефакторинга

ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку «Обновить» в браузере.

Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.



1 февраля, 2017
21 апреля, 2017

Дано

  • 1С конфигурация бухгалтерия предприятия 2.0
  • Ошибка печати ПКО (приходный кассовый ордер):

{ОбщаяФорма.ФормаПечати.Форма(18)}: Ошибка при установке значения атрибута контекста

   ЭлементыФормы.ПолеДокумента.ПолеСверху

по причине:

Несоответствие типов

Анализ проблемы

На первый взгляд все ужасно:

  • в конфигураторе видно, что система пытается выполнить строчку кода:

ЭлементыФормы.ПолеДокумента.ПолеСверху          = ПечатныйДокумент.ПолеСверху;

  • в отладке видно, что обе переменные типа “Число”,
  • синтакс-помощник говорит что:

ТабличныйДокумент (SpreadsheetDocument)

ПолеСверху (TopMargin)

Использование:

Чтение и запись.

То есть ПолеСверху доступно для записи и обе переменные типа число и все тут корректно, но система говорит “Несоответствие типов” – полный бред.

Решение

На решение проблемы натолкнула фраза “Ошибка при установке значения атрибута контекста”, значит что-то не так с доступом.
Оказалось в базе нет ни одного пользователя и работа осуществлялась под пользователем НеАвторизован. После создания пользователя с необходимыми правами все заработало.

Дополнено 2017.04.10

Проблема повторилась, но уже при печати РТУ и с использованием уже настроенной учетной записи.

Помогло создание нового пользователя с такими же правами доступа. То есть нового создаем, старого удаляем и после этого все работает.

Ошибка при установке значения атрибута контекста (СписокВыбора)

Данная ошибка возникает при попытке установить полю с типом «СписокЗначений» значение неподходящего типа. Например: Неопределено. 

Полная ошибка

Ошибка при установке значения атрибута контекста (СписокВыбора)
ЭлементыФормы.Поставщик.СписокВыбора = КЭШируемые.СписокПоставщиков(Контрагент);
по причине:
Несоответствие типов

Скриншот:oshibka-ustanovki-spiska-vybora

Причина: В функции, которая формировала данный список (КЭШируемые.СписокПоставщиков()) отсутствовал возврат значения.


В экспериментальных целях:

передал значение с типом «Массив»  — текст ошибки не поменялся.

В итоге переписал на более универсальный метод ЗагрузитьЗначения() самого элемента диалога:

ЭлементыФормы.Поставщик.СписокВыбора.ЗагрузитьЗначения(КЭШируемые.СписокПоставщиков(Контрагент));

Впервые в истории планеты Земля все люди во всех странах задались единой целью: заработать столько денег, чтобы уподобиться героям рекламы.

turboq

159 / 158 / 13

Регистрация: 14.01.2010

Сообщений: 1,488

1

Нельзя изменить поле, содержащее данные формы. Почему?

17.01.2013, 12:44. Показов 29565. Ответов 12

Метки нет (Все метки)


Всем привет
Почему 1й код не работает, пишет
{Документ.дктГилевТабЧасть.Форма.ФормаДокумента.Фо рма(76)}: Ошибка при установке значения атрибута контекста (Объект): Нельзя изменять поле, содержащее объект данных формы
с(Объект);
по причине:
Нельзя изменять поле, содержащее объект данных формы

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
&НаКлиенте
Процедура ПечатьТЧ(Команда)
    с(Объект);
КонецПроцедуры
 
&НаСервере
функция С(о)
    тч = О.тчМатериалы;   
    Для каждого стр Из тч Цикл
 
        сообщить(стр.ркМатериал);
    
    КонецЦикла;
    
КонецФункции

а 2й код работает

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
&НаКлиенте
Процедура ПечатьТЧ(Команда)
    с();
КонецПроцедуры
 
&НаСервере
функция С()
    тч = Объект.тчМатериалы; 
    Для каждого стр Из тч Цикл
 
        сообщить(стр.ркМатериал);
    
    КонецЦикла;
    
КонецФункции

8.2
Модуль формы

0

856 / 655 / 111

Регистрация: 01.11.2012

Сообщений: 2,410

17.01.2013, 13:37

2

Ну в 1-м примере бессмысленно передавать Объект, ибо он итак доступен в контексте модуля формы, я думаю первый пример заработает. если написать

функция С(Знач о)

А если так заработает, то, имхо, передача Объекта по ссылке в другую процедуру или функцию считается в 1С как попытка изменения.

Добавлено через 5 минут
Да еще наскока я помню нельзя передавать между клиентом и сервером мутабельные значения, а Объект как раз мутабелен

1

159 / 158 / 13

Регистрация: 14.01.2010

Сообщений: 1,488

17.01.2013, 17:38

 [ТС]

3

Это как раз оно и есть.
Хотя не понятно как это передавать объект по значению.

0

90 / 90 / 17

Регистрация: 26.10.2012

Сообщений: 249

17.01.2013, 19:29

4

Если тебе нужен конкретный объект, его можно получить по ссылке: ссылка.ПолучитьОбъект(). При этом объект должен существовать в базе (т.е. записан).

0

159 / 158 / 13

Регистрация: 14.01.2010

Сообщений: 1,488

18.01.2013, 11:11

 [ТС]

5

В том то и дело я хотел распечатать не сохраненный док

0

856 / 655 / 111

Регистрация: 01.11.2012

Сообщений: 2,410

18.01.2013, 12:24

6

Через форму, а не через объект тогда.

0

159 / 158 / 13

Регистрация: 14.01.2010

Сообщений: 1,488

18.01.2013, 14:37

 [ТС]

7

Примерчик можно?

0

Xomych

856 / 655 / 111

Регистрация: 01.11.2012

Сообщений: 2,410

18.01.2013, 15:37

8

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
&НаСервере
Процедура ПечДок(Таб)
    Об=РеквизитФормыВЗначение("Объект");
    М=Об.ПолучитьМакет("Макет");
    Обл=М.ПолучитьОбласть("Заг");
    Таб.Вывести(Обл);
    
    
    ИтК=0; ИтС=0;
    for each Стр in Об.Товары do
        Обл=М.ПолучитьОбласть("Строка");
        Обл.Параметры.Тов=Стр.Товар;
        Обл.Параметры.Кол=Стр.Количество;
        Обл.Параметры.Ц=Стр.Цена;
        Обл.Параметры.Сум=Стр.Сумма;
        Таб.Вывести(Обл);
        ИтК=ИтК+Обл.Параметры.Кол;
        ИтС=ИтС+Обл.Параметры.Сум;
    enddo;  
    Обл=М.ПолучитьОбласть("Итого");
    Обл.Параметры.ИтК=ИтК;
    Обл.Параметры.ИтС=ИтС;
    Таб.Вывести(Обл);
КонецПроцедуры    
 
&НаКлиенте
Процедура Печать(Команда)
    Таб=Новый ТабличныйДокумент;
    ПечДок(Таб);
    Таб.Показать();
КонецПроцедуры

Печатает не сохраненный документ на тонком клиенте, тока что у себя написал.

1

159 / 158 / 13

Регистрация: 14.01.2010

Сообщений: 1,488

20.01.2013, 15:45

 [ТС]

9

Хотя с таким же успехом можно просто обратиться к Объекту.

0

856 / 655 / 111

Регистрация: 01.11.2012

Сообщений: 2,410

20.01.2013, 16:06

10

Если документ не сохранен, объекта ещё нет

0

159 / 158 / 13

Регистрация: 14.01.2010

Сообщений: 1,488

20.01.2013, 16:57

 [ТС]

11

Поставил в ваш цикл перебора
Сообщить(объект.тчМатериалы[н].ркМатериал);
Все работает, док не сохранял

0

856 / 655 / 111

Регистрация: 01.11.2012

Сообщений: 2,410

20.01.2013, 17:14

12

Мистика, у меня так не заработало.

Добавлено через 8 минут
А, у меня не работало ПолучитьМакет. Остальное действительно работает через Объект

0

Dethmontt

Модератор

Эксперт 1С

3697 / 2897 / 569

Регистрация: 10.03.2011

Сообщений: 11,398

Записей в блоге: 1

21.01.2013, 11:59

13

Зарезервированное ОБЪЕКТ в модуле формы имеет тип ДанныеФормыСтруктура, соответственно что бы обращаться к эспортным процедурам этого объекта (обработки в данном случае) и получить макет в конкретном случае необходимо привести тип Формы в прикладной тип
Пример:

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
&НаКлиенте
Процедура Команда1(Команда)
    
    ПолучитьМакетСервер();
    
    
КонецПроцедуры
 
&наСервере
Процедура ПолучитьМакетСервер()
    
    гОбъект = РеквизитФормыВЗначение("Объект");
    Макет = гОбъект.ПолучитьМакет("Макет");
    
КонецПроцедуры

1

Код 1C v 8.3

 // Реквизиты
ДобавляемыеРеквизиты = Новый Массив;

ИмяТаблицы = "КомандыДополнительныхОбработок";
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяТаблицы, Новый ОписаниеТипов("ТаблицаЗначений")));
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Ссылка", Новый ОписаниеТипов("СправочникСсылка.ДополнительныеОтчетыИОбработки"), ИмяТаблицы));
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ВариантЗапуска", Новый ОписаниеТипов("ПеречислениеСсылка.СпособыВызоваДополнительныхОбработок"), ИмяТаблицы));
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ИмяЭлемента", Новый ОписаниеТипов("Строка"), ИмяТаблицы));
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"), ИмяТаблицы));
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Представление", Новый ОписаниеТипов("Строка"), ИмяТаблицы));
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Идентификатор", Новый ОписаниеТипов("Строка"), ИмяТаблицы));
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ЭтоОтчет", Новый ОписаниеТипов("Булево"), ИмяТаблицы));

Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);

//реквизит
ИмяЭлемента = "Добавлен" + ИндексЭлемента;
Реквизит = Новый РеквизитФормы(ИмяЭлемента, ОписаниеТипов);
ДобавляемыеРеквизиты.Добавить(Реквизит);
ИзменитьРеквизиты(ДобавляемыеРеквизиты);

//команда печать
ИмяКомандыПечать = "ДобавленПечать" + ИндексЭлемента;
КомандаПечать = Команды.Добавить(ИмяКомандыПечать);
КомандаПечать.Действие = "ПечатьДокумента";
КомандаПечать.Подсказка = НСтр("ru = 'Печать документа...'");

//элемент формы
//Родитель                     = Элементы.ГруппаСформированныеДокументы;
Элемент                      = Элементы.Добавить(ИмяЭлемента, Тип("ПолеФормы"), ЭлементГруппа);
Элемент.Вид                  = ВидПоляФормы.ПолеНадписи;
Элемент.ПутьКДанным          = ИмяЭлемента;
Элемент.Гиперссылка          = Истина;
Элемент.ПоложениеЗаголовка   = ПоложениеЗаголовкаЭлементаФормы.Нет;

ЭтаФорма[ИмяЭлемента] = Документ;

//кнопка печать
ИмяЭлементаПечать = "ДобавленПечать" + ИндексЭлемента;
ЭлементПечать = Элементы.Добавить(ИмяЭлементаПечать, Тип("КнопкаФормы"), ЭлементГруппа);
ЭлементПечать.Картинка = БиблиотекаКартинок.Печать;
ЭлементПечать.Отображение = ОтображениеКнопки.Картинка;
ЭлементПечать.ИмяКоманды = ИмяКомандыПечать;

Утро доброе. Установил 1с на новый компьютер, захожу под любым пользователем, выдает такую ошибку: {МодульПриложения}: Ошибка при установке значения атрибута контекста (***): Несоответствие типов В инете, нашел подобную проблему, только, приравнивание идет к ТекущийПользователь. Там проблема решается чисткой профиля в windows. А как решить, данную, проблему? Комп находиться на расстоянии, профиль почищу, как доберусь, просто хотел узнать, может загвоздка в другом.

Компьютер=Неопределено у тебя скорее всего.

Хм, база одна на 20 компов, проблема только с этим. Неопределенность смотреть в том же модуле?

Смотри  где определяется переменная Компьютер

Переменная Компьютер берется из запроса. Вот кусок кода:

Что будет, если Выборка.Следующий = Ложь?

На моем компе, ни чего не меняется =) На том, посмотреть не могу, плюс, если поменяю код, придется выгонять всех пользователей, что бы обновить, либо ждать, пока ночью обновиться.

Я же написал, что не могу проверить. У себя изменил, в тестовой, все работает.

может получится так, что в справочнике смсКомпьютеры нет наименования проблемного компьютера.

Думал над этим, только, почему программа его не добавляет.

А как, по другому, имя компьютера там появится? =) Перед этим, устанавливал на другие компьютеры 1с, делал все тоже самое — все работает. У меня есть подозрение, что не порядки с правами в винде. С админами сейчас поговорю, они как раз, в том здании, где комп.

[А как, по другому, имя компьютера там появится? =)] Например, пользователь руками создаст элемент справочника. Для это нужно запустить приложение в режиме 1с:Предприятие.

Сейчас попробую. Просто не делал ни когда такого, не требовалось.

Справочник заполняется программой. Таки думаю, что с правами косяк.

так есть в справочнике элемент с наименованием того компьютера?

В справочнике нет наименования. Зашел в другую базу, с этого же сервера — все работает (правда не создавал нового пользователя в этой базе, зашел под админом). Зашел в другую базу, с другого сервера — аналогично, все работает. Не работает одна единственная база, хотя, базы, у которых идентичный код, с неработающей и находящиеся на том же сервере, так же работают. Добавил в справочник наименование компьютера. Пойду смотреть.

Помогло добавление справочника. Не понятно, из-за чего сие чудо было.

[Помогло добавление справочника.] Ну вообще это очевидно сразу было — первым делом проверить есть ли в этом справочнике элемент с именем этого компьютера;)

Мысля то была, просто, при установки программы на новый комп и добавлении нового пользователя ни когда его не заполнял.

Тэги: 1С 8

Комментарии доступны только авторизированным пользователям

Нельзя изменять поле, содержащее объект данных формы

Я
   AnisaL

08.08.19 — 12:59

Добрый день!

Скажите пожалуйста, такая ошибка: {UDS_GAME Документ.ЧекККМ.Форма.ФормаДокумента_РМК.Форма(328)}: Ошибка при установке значения атрибута контекста (Запасы)

    ЗаполнитьСуммуВсегоВТаблице(Объект.Запасы, Объект.СуммаВключаетНДС);

по причине:

Нельзя изменять поле, содержащее объект данных формы

Что делать?

   Кац

1 — 08.08.19 — 13:00

(0) Что делать?

Не изменять поле содержащее объект данных формы

   RomanYS

2 — 08.08.19 — 13:01

(0) Сделать ЗаполнитьСуммуВсегоВТаблице контектсной и не передавать туда Объект.Запасы, оно и так будет доступно в контексте

   AnisaL

3 — 08.08.19 — 13:02

(2) а как сделать контекстной?

   hhhh

4 — 08.08.19 — 13:03

(3) показывайте уже вашу функцию

   Кац

5 — 08.08.19 — 13:04

&НаСервере

ЗаполнитьСуммуВсегоВТаблице()

   AnisaL

6 — 08.08.19 — 13:08

(4) // Заполняет поле СуммаВсего в зависимости от признака включения НДС в цену.

//

// Параметры:

// Таблица         — ДанныеФормыКоллекция — Таблица, в которой необходимо заполнить колонку СуммаВсего.

// ЦенаВключаетНДС — Булево — признак включения НДС в цену.

//

Процедура ЗаполнитьСуммуВсегоВТаблице(Таблица, ЦенаВключаетНДС) Экспорт

    
    Для Каждого СтрокаТаблицы Из Таблица Цикл

        ЗаполнитьСуммуВсегоВСтрокеТаблицы(СтрокаТаблицы, ЦенаВключаетНДС);

    КонецЦикла;

    
КонецПроцедуры // ЗаполнитьСуммуВсегоВТаблице()

   AnisaL

7 — 08.08.19 — 13:16

(2) все-таки как сделать контекстной?

   RomanYS

8 — 08.08.19 — 13:20

(7) смотри (5)

Но в данном случае не поможет (слишком универсальная функция). Твоя функция проста, сделай её &НаКлиенте вместе с ЗаполнитьСуммуВсегоВСтрокеТаблицы

   AnisaL

9 — 08.08.19 — 14:44

(8) я сделала функцию без параметров, и вот такой:

&НаСервере

Процедура ЗаполнитьСуммуВсегоВТаблице()

    
    Для Каждого СтрокаТаблицы Из Объект.Запасы Цикл

        ЗаполнитьСуммуВсегоВСтрокеТаблицы(СтрокаТаблицы, Объект.СуммаВключаетНДС);

    КонецЦикла;

    
КонецПроцедуры

ЗаполнитьСуммуВсегоВСтрокеТаблицы тоже сделала &НаСервере

   RomanYS

10 — 08.08.19 — 14:48

(9) Это и имелось в виду в (2), но процедура сталане универсальной.

Проще (и вероятно правильнее) делать такие (простые) расчеты на клиенте — проблема вообще не возникла бы.

   hhhh

11 — 08.08.19 — 15:15

(9) оно и было на сервере. Потому что если ничего не указано, значит на сервере. То есть и было на сервере, и ты указала на сервере, ничего не изменилось.

   RomanYS

12 — 08.08.19 — 15:18

(11) >> ничего не изменилось.

изменялись параметры, их больше нет

  

palsergeich

13 — 08.08.19 — 15:23

Настало время рефакторинга

turboq

159 / 158 / 13

Регистрация: 14.01.2010

Сообщений: 1,495

1

Нельзя изменить поле, содержащее данные формы. Почему?

17.01.2013, 12:44. Показов 30538. Ответов 12

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Всем привет
Почему 1й код не работает, пишет
{Документ.дктГилевТабЧасть.Форма.ФормаДокумента.Форма(76)}: Ошибка при установке значения атрибута контекста (Объект): Нельзя изменять поле, содержащее объект данных формы
с(Объект);
по причине:
Нельзя изменять поле, содержащее объект данных формы

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
&НаКлиенте
Процедура ПечатьТЧ(Команда)
    с(Объект);
КонецПроцедуры
 
&НаСервере
функция С(о)
    тч = О.тчМатериалы;   
    Для каждого стр Из тч Цикл
 
        сообщить(стр.ркМатериал);
    
    КонецЦикла;
    
КонецФункции

а 2й код работает

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
&НаКлиенте
Процедура ПечатьТЧ(Команда)
    с();
КонецПроцедуры
 
&НаСервере
функция С()
    тч = Объект.тчМатериалы; 
    Для каждого стр Из тч Цикл
 
        сообщить(стр.ркМатериал);
    
    КонецЦикла;
    
КонецФункции

8.2
Модуль формы



0



856 / 655 / 111

Регистрация: 01.11.2012

Сообщений: 2,410

17.01.2013, 13:37

2

Ну в 1-м примере бессмысленно передавать Объект, ибо он итак доступен в контексте модуля формы, я думаю первый пример заработает. если написать

функция С(Знач о)

А если так заработает, то, имхо, передача Объекта по ссылке в другую процедуру или функцию считается в 1С как попытка изменения.

Добавлено через 5 минут
Да еще наскока я помню нельзя передавать между клиентом и сервером мутабельные значения, а Объект как раз мутабелен



1



159 / 158 / 13

Регистрация: 14.01.2010

Сообщений: 1,495

17.01.2013, 17:38

 [ТС]

3

Это как раз оно и есть.
Хотя не понятно как это передавать объект по значению.



0



90 / 90 / 17

Регистрация: 26.10.2012

Сообщений: 249

17.01.2013, 19:29

4

Если тебе нужен конкретный объект, его можно получить по ссылке: ссылка.ПолучитьОбъект(). При этом объект должен существовать в базе (т.е. записан).



0



159 / 158 / 13

Регистрация: 14.01.2010

Сообщений: 1,495

18.01.2013, 11:11

 [ТС]

5

В том то и дело я хотел распечатать не сохраненный док



0



856 / 655 / 111

Регистрация: 01.11.2012

Сообщений: 2,410

18.01.2013, 12:24

6

Через форму, а не через объект тогда.



0



159 / 158 / 13

Регистрация: 14.01.2010

Сообщений: 1,495

18.01.2013, 14:37

 [ТС]

7

Примерчик можно?



0



Xomych

856 / 655 / 111

Регистрация: 01.11.2012

Сообщений: 2,410

18.01.2013, 15:37

8

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
&НаСервере
Процедура ПечДок(Таб)
    Об=РеквизитФормыВЗначение("Объект");
    М=Об.ПолучитьМакет("Макет");
    Обл=М.ПолучитьОбласть("Заг");
    Таб.Вывести(Обл);
    
    
    ИтК=0; ИтС=0;
    for each Стр in Об.Товары do
        Обл=М.ПолучитьОбласть("Строка");
        Обл.Параметры.Тов=Стр.Товар;
        Обл.Параметры.Кол=Стр.Количество;
        Обл.Параметры.Ц=Стр.Цена;
        Обл.Параметры.Сум=Стр.Сумма;
        Таб.Вывести(Обл);
        ИтК=ИтК+Обл.Параметры.Кол;
        ИтС=ИтС+Обл.Параметры.Сум;
    enddo;  
    Обл=М.ПолучитьОбласть("Итого");
    Обл.Параметры.ИтК=ИтК;
    Обл.Параметры.ИтС=ИтС;
    Таб.Вывести(Обл);
КонецПроцедуры    
 
&НаКлиенте
Процедура Печать(Команда)
    Таб=Новый ТабличныйДокумент;
    ПечДок(Таб);
    Таб.Показать();
КонецПроцедуры

Печатает не сохраненный документ на тонком клиенте, тока что у себя написал.



1



159 / 158 / 13

Регистрация: 14.01.2010

Сообщений: 1,495

20.01.2013, 15:45

 [ТС]

9

Хотя с таким же успехом можно просто обратиться к Объекту.



0



856 / 655 / 111

Регистрация: 01.11.2012

Сообщений: 2,410

20.01.2013, 16:06

10

Если документ не сохранен, объекта ещё нет



0



159 / 158 / 13

Регистрация: 14.01.2010

Сообщений: 1,495

20.01.2013, 16:57

 [ТС]

11

Поставил в ваш цикл перебора
Сообщить(объект.тчМатериалы[н].ркМатериал);
Все работает, док не сохранял



0



856 / 655 / 111

Регистрация: 01.11.2012

Сообщений: 2,410

20.01.2013, 17:14

12

Мистика, у меня так не заработало.

Добавлено через 8 минут
А, у меня не работало ПолучитьМакет. Остальное действительно работает через Объект



0



Dethmontt

Модератор

Эксперт 1С

3722 / 2917 / 574

Регистрация: 10.03.2011

Сообщений: 11,489

Записей в блоге: 1

21.01.2013, 11:59

13

Зарезервированное ОБЪЕКТ в модуле формы имеет тип ДанныеФормыСтруктура, соответственно что бы обращаться к эспортным процедурам этого объекта (обработки в данном случае) и получить макет в конкретном случае необходимо привести тип Формы в прикладной тип
Пример:

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
&НаКлиенте
Процедура Команда1(Команда)
    
    ПолучитьМакетСервер();
    
    
КонецПроцедуры
 
&наСервере
Процедура ПолучитьМакетСервер()
    
    гОбъект = РеквизитФормыВЗначение("Объект");
    Макет = гОбъект.ПолучитьМакет("Макет");
    
КонецПроцедуры



1





1 февраля, 2017
21 апреля, 2017

Дано

  • 1С конфигурация бухгалтерия предприятия 2.0
  • Ошибка печати ПКО (приходный кассовый ордер):
{ОбщаяФорма.ФормаПечати.Форма(18)}: Ошибка при установке значения атрибута контекста
   ЭлементыФормы.ПолеДокумента.ПолеСверху
по причине:
Несоответствие типов

Анализ проблемы

На первый взгляд все ужасно:

  • в конфигураторе видно, что система пытается выполнить строчку кода:
ЭлементыФормы.ПолеДокумента.ПолеСверху          = ПечатныйДокумент.ПолеСверху;
  • в отладке видно, что обе переменные типа “Число”,
  • синтакс-помощник говорит что:
ТабличныйДокумент (SpreadsheetDocument)
ПолеСверху (TopMargin)
Использование:

Чтение и запись.

То есть ПолеСверху доступно для записи и обе переменные типа число и все тут корректно, но система говорит “Несоответствие типов” – полный бред.

Решение

На решение проблемы натолкнула фраза “Ошибка при установке значения атрибута контекста”, значит что-то не так с доступом.
Оказалось в базе нет ни одного пользователя и работа осуществлялась под пользователем НеАвторизован. После создания пользователя с необходимыми правами все заработало.

Дополнено 2017.04.10

Проблема повторилась, но уже при печати РТУ и с использованием уже настроенной учетной записи.

Помогло создание нового пользователя с такими же правами доступа. То есть нового создаем, старого удаляем и после этого все работает.

Ошибка при установке значения атрибута контекста (СписокВыбора)

Данная ошибка возникает при попытке установить полю с типом «СписокЗначений» значение неподходящего типа. Например: Неопределено. 

Полная ошибка

Ошибка при установке значения атрибута контекста (СписокВыбора)
ЭлементыФормы.Поставщик.СписокВыбора = КЭШируемые.СписокПоставщиков(Контрагент);
по причине:
Несоответствие типов

Скриншот:oshibka-ustanovki-spiska-vybora

Причина: В функции, которая формировала данный список (КЭШируемые.СписокПоставщиков()) отсутствовал возврат значения.


В экспериментальных целях:

передал значение с типом «Массив»  — текст ошибки не поменялся.

В итоге переписал на более универсальный метод ЗагрузитьЗначения() самого элемента диалога:

ЭлементыФормы.Поставщик.СписокВыбора.ЗагрузитьЗначения(КЭШируемые.СписокПоставщиков(Контрагент));

Нулевую рекламную идею можно помножить на миллион долларов – все равно получится нуль.

Код 1C v 8.3

 // Реквизиты
ДобавляемыеРеквизиты = Новый Массив;

ИмяТаблицы = "КомандыДополнительныхОбработок";
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяТаблицы, Новый ОписаниеТипов("ТаблицаЗначений")));
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Ссылка", Новый ОписаниеТипов("СправочникСсылка.ДополнительныеОтчетыИОбработки"), ИмяТаблицы));
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ВариантЗапуска", Новый ОписаниеТипов("ПеречислениеСсылка.СпособыВызоваДополнительныхОбработок"), ИмяТаблицы));
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ИмяЭлемента", Новый ОписаниеТипов("Строка"), ИмяТаблицы));
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"), ИмяТаблицы));
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Представление", Новый ОписаниеТипов("Строка"), ИмяТаблицы));
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Идентификатор", Новый ОписаниеТипов("Строка"), ИмяТаблицы));
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ЭтоОтчет", Новый ОписаниеТипов("Булево"), ИмяТаблицы));

Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);

//реквизит
ИмяЭлемента = "Добавлен" + ИндексЭлемента;
Реквизит = Новый РеквизитФормы(ИмяЭлемента, ОписаниеТипов);
ДобавляемыеРеквизиты.Добавить(Реквизит);
ИзменитьРеквизиты(ДобавляемыеРеквизиты);

//команда печать
ИмяКомандыПечать = "ДобавленПечать" + ИндексЭлемента;
КомандаПечать = Команды.Добавить(ИмяКомандыПечать);
КомандаПечать.Действие = "ПечатьДокумента";
КомандаПечать.Подсказка = НСтр("ru = 'Печать документа...'");

//элемент формы
//Родитель                     = Элементы.ГруппаСформированныеДокументы;
Элемент                      = Элементы.Добавить(ИмяЭлемента, Тип("ПолеФормы"), ЭлементГруппа);
Элемент.Вид                  = ВидПоляФормы.ПолеНадписи;
Элемент.ПутьКДанным          = ИмяЭлемента;
Элемент.Гиперссылка          = Истина;
Элемент.ПоложениеЗаголовка   = ПоложениеЗаголовкаЭлементаФормы.Нет;

ЭтаФорма[ИмяЭлемента] = Документ;

//кнопка печать
ИмяЭлементаПечать = "ДобавленПечать" + ИндексЭлемента;
ЭлементПечать = Элементы.Добавить(ИмяЭлементаПечать, Тип("КнопкаФормы"), ЭлементГруппа);
ЭлементПечать.Картинка = БиблиотекаКартинок.Печать;
ЭлементПечать.Отображение = ОтображениеКнопки.Картинка;
ЭлементПечать.ИмяКоманды = ИмяКомандыПечать;

Понравилась статья? Поделить с друзьями:
  • Ошибка при установке значения атрибута контекста номеротправленного
  • Ошибка при установке драйвера geforce game ready driver
  • Ошибка при установке значения атрибута контекста наименование
  • Ошибка при установке драйвера amd ошибка 1603
  • Ошибка при установке значения атрибута контекста картинка