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