Как программно заполнить значение дополнительного реквизита в управляемой форме 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке под управляемые формы 1С, особенно в конфигурациях на базе Библиотеки стандартных подсистем (БСП), часто возникает задача программного заполнения дополнительных реквизитов. Многие разработчики сталкиваются с тем, что простое добавление строки в табличную часть ДополнительныеРеквизиты объекта не приводит к отображению данных на форме. Давайте разберем, почему это происходит и как правильно решить данную задачу.

Почему прямой метод не работает?

В типовых конфигурациях 1С дополнительные реквизиты являются «виртуальными» полями для формы. Когда форма открывается, система БСП анализирует список доступных свойств для конкретного объекта и автоматически генерирует элементы управления на форме. При этом данные выводятся не напрямую из табличной части, а из специальных реквизитов формы, которые создаются динамически.

Если вы меняете данные в Объект.ДополнительныеРеквизиты, вы меняете данные объекта, но не меняете значения, привязанные к полям ввода на форме. Чтобы изменения стали видны пользователю, необходимо обновить именно эти динамические реквизиты формы.

Пошаговое решение задачи

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

  1. Определяем свойство, которое хотим заполнить.
  2. Используем служебные функции БСП для получения описания свойств текущего набора.
  3. Формируем имя реквизита формы по внутреннему алгоритму БСП.
  4. Присваиваем значение найденному реквизиту формы.

Рассмотрим пример программного кода, который решает эту задачу внутри управляемой формы:


ДопРеквизитыСоответствие = Новый Соответствие();
Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "МойДопРеквизит");
ДопРеквизитыСоответствие.Вставить(Свойство, НовоеЗначениеМоегоДопРеквизита); 

ОписаниеОбъекта = ЭтаФорма.Объект;
ОписаниеСвойств = УправлениеСвойствамиСлужебный.ЗначенияСвойств(
    ОписаниеОбъекта.ДополнительныеРеквизиты.Выгрузить(),
    ЭтаФорма.Свойства_НаборыДополнительныхРеквизитовОбъекта,
    Ложь);  

Для Каждого ДопРеквизит Из ДопРеквизитыСоответствие Цикл     
    ОписаниеСвойства = ОписаниеСвойств.Найти(ДопРеквизит.Ключ, "Свойство"); 
    Если ЗначениеЗаполнено(ОписаниеСвойства) Тогда
        
        ИмяРеквизитаЗначение = "ДополнительныйРеквизитЗначение_" 
        + СтрЗаменить(ВРег(Строка(ОписаниеСвойства.Набор.УникальныйИдентификатор())), "-", "x")
        + "_"
        + СтрЗаменить(ВРег(Строка(ОписаниеСвойства.Свойство.УникальныйИдентификатор())), "-", "x");
        
        ЭтаФорма[ИмяРеквизитаЗначение] = ДопРеквизит.Значение;        
    КонецЕсли;
КонецЦикла;

Важные аспекты реализации

При использовании данного подхода обратите внимание на следующие моменты:

Использование методов УправлениеСвойствамиСлужебный — это наиболее безопасный способ работы с дополнительными реквизитами, так как он учитывает архитектуру типовых конфигураций и позволяет избежать проблем с отображением данных при обновлении конфигураций.

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

← На главную