При разработке функционала в типовых конфигурациях (например, 1С:Управление торговлей 11) часто возникает задача заполнить дополнительные реквизиты объекта еще до его записи в базу данных. Попытки просто изменить табличную часть ДополнительныеРеквизиты объекта на сервере и вызвать метод ЭтаФорма.ОбновитьОтображениеДанных() не дают результата — значения на форме не отображаются.
Проанализируем причину такого поведения подсистемы и разберем практические способы решения этой проблемы.
Выясним причину, почему стандартное обновление данных формы не работает для дополнительных реквизитов:
Объект.ДополнительныеРеквизиты. При открытии формы подсистема динамически генерирует реквизиты формы и создает соответствующие элементы интерфейса.ОбновитьОтображениеДанных() перечитывает только те данные, которые жестко связанны с элементами формы. Динамические реквизиты формы, созданные БСП, он не затрагивает.Рассмотрим штатное решение с использованием подсистемы БСП. Если табличная часть ДополнительныеРеквизиты уже заполнена на сервере, необходимо принудительно обновить динамические элементы формы.
Для обновления значений на форме при сохранении текущего состава реквизитов выполним следующий код:
&НаСервере
Процедура ЗаполнитьИОбновитьДопРеквизитыНаСервере()
// Заполняем табличную часть объекта нужными значениями
// ...
// Обновляем динамические элементы формы БСП
УправлениеСвойствами.ОбновитьЭлементыДополнительныхРеквизитов(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьДопРеквизиты(Команда)
ЗаполнитьИОбновитьДопРеквизитыНаСервере();
УправлениеСвойствамиКлиент.ОбновитьЗависимостиДополнительныхРеквизитов(ЭтаФорма);
КонецПроцедуры
Если при изменении данных (например, при выборе вида номенклатуры или родителя) меняется сам набор свойств, необходимо полностью пересоздать элементы формы на сервере с помощью процедуры:
УправлениеСвойствами.ЗаполнитьДополнительныеРеквизитыВФорме(ЭтаФорма);
Посмотрим на вариант, когда данные для заполнения известны в момент создания объекта. В этом случае логику заполнения табличной части ДополнительныеРеквизиты рекомендуется переносить в модуль объекта в процедуру ОбработкаЗаполнения.
Если объект создается с уже заполненной табличной частью до момента открытия формы, подсистема БСП при инициализации формы автоматически построит динамические элементы и отобразит нужные значения пользователю.
Разберем еще один подход, когда данные до момента записи хранятся в обычных реквизитах формы.
ПередЗаписьюНаСервере или ПриЗаписи переносим значения из реквизитов формы в табличную часть Объект.ДополнительныеРеквизиты перед непосредственным сохранением объекта в базу данных.