Содержание:
1. Что такое реквизиты формы в конфигурации системы 1С
2. Ошибка «Нельзя изменять поле содержащее объект данных формы» и два способа ее решения
1. Что такое реквизиты формы в конфигурации системы 1С
Реквизиты формы в 1С – это поля, отображаемые на форме, существующие для заполнения их данными пользователем. Это могут быть поля, предназначенные для указания в них справочников или документов, списки значений, таблицы значений. Они могут быть как привязанными к реквизитам объекта 1С, хранящемся в базе данных 1С Предприятие, так и просто реквизитами формы 1С, существующими лишь на время, пока форма открыта. Каждый такой реквизит имеет уникальное имя.
Реквизиты формы 1С являются списком типизированных значений ДанныеФормыКоллекция 1С. Для того, чтобы оптимизировать передачу данных 1С между клиентом и сервером, в 1С используется особая передача объектов базы данных формы. Можно менять свойства и выполнять различные метода, но нельзя напрямую изменять само значение элемента данных формы.
Но рассмотрим ситуацию, когда изменение элемента формы 1С не столь очевидно и при которой возникают ошибки, говорящие, что мы пытаемся изменить этот самый объект базы данных формы. Предположим, нам нужно получить договор в зависимости от выбранного на форме контрагента в базе 1С.
Реквизит формы 1С имеет имя Контрагент. При его изменении на форме вызывается серверная процедура 1С, которая в зависимости от переданного в параметрах данной процедуры контрагента будет искать по нему нужный договор и проставлять его в реквизит объекта 1С.
&НаКлиенте
Процедура КонтрагентПриИзменении(Элемент)
КонтрагентПриИзмененииНаСервере(Контрагент);
КонецПроцедуры
&НаСервере
Процедура КонтрагентПриИзмененииНаСервере(ВыбранныйКонтрагент)
// Вставить содержимое обработчика.
2. Ошибка «Нельзя изменять поле содержащее объект данных формы» и два способа ее решения
В описанном выше варианте реализации проставления договора вылетит ошибка «Нельзя изменять поле содержащее объект данных формы».
Так как мы передаем элемент коллекции данных формы как параметр процедуры, то система считает, что данный переданный параметр будет изменяться, а изменять элемент нельзя, поэтому выходит ошибка.
Избежать вышеописанной ошибки можно двумя способами, первый – создать новую переменную и присвоить данной переменной значение 1С выбранного элемента, в таком случае передаваться параметром будет созданная переменная, а ее можно изменять. Пример:
&НаКлиенте
Процедура КонтрагентПриИзменении(Элемент)
ПеременнаяКонтрагент = Контрагент;
КонтрагентПриИзмененииНаСервере(ПеременнаяКонтрагент);
КонецПроцедуры
&НаСервере
Процедура КонтрагентПриИзмененииНаСервере(ВыбранныйКонтрагент)
// Вставить содержимое обработчика.
КонецПроцедуры
Второй вариант, способный помочь избежать ошибки – использовать возможность передачи элемента по значению, т.е. не сам элемент формы, а только его значение.
&НаКлиенте
Процедура КонтрагентПриИзменении(Элемент)
КонтрагентПриИзмененииНаСервере(Контрагент);
КонецПроцедуры
&НаСервере
Процедура КонтрагентПриИзмененииНаСервере(Знач ВыбранныйКонтрагент)
// Вставить содержимое обработчика.
КонецПроцедуры
Описанными выше способами можно избежать ошибок.
Специалист компании "Кодерлайн"
Александр Суворов