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