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

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

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

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

Почему элементы формы получают нечитаемые имена?

В подсистеме БСП «Свойства» реквизиты формы и соответствующие им элементы управления создаются динамически при открытии объекта процедурами общего модуля УправлениеСвойствами. Для обеспечения уникальности имен платформа и подсистема генерируют суффиксы на основе шестнадцатеричного представления уникального идентификатора (GUID) ссылки элемента плана видов характеристик ДополнительныеРеквизитыИСведения.

Такой подход защищает систему от конфликтов имен, если пользователь назовет реквизит с пробелами, спецсимволами или продублирует существующее имя реквизита объекта. Однако обращение к элементу через жестко закодированную строку вида "ДополнительныйРеквизитЗначение_0хDADADADADA666" является грубой ошибкой: при переносе данных, удалении или пересоздании реквизита идентификатор изменится, и код перестанет работать.

Способ 1. Получение имени элемента через коллекцию описания свойств формы

На управляемой форме, где выводятся дополнительные реквизиты, БСП создает специальную служебную таблицу — Свойства_ОписаниеДополнительныхРеквизитов. В ней хранятся соответствия между ссылками на свойства, их наименованиями и сгенерированными именами реквизитов и элементов формы.

Рассмотрим структуру колонок этой таблицы:

  1. Свойство — ссылка на элемент плана видов характеристик ДополнительныеРеквизитыИСведения.
  2. ИмяРеквизитаЗначение — имя динамического реквизита формы, в котором хранится значение.
  3. ИмяЭлемента — имя элемента управления на форме.
  4. Видимость, Доступность, Заголовок — параметры отображения.

Посмотрим на пример поиска имени элемента через таблицу описания свойств на форме:


Отбор = Новый Структура("Свойство", СсылкаНаСвойство);
НайденныеСтроки = Свойства_ОписаниеДополнительныхРеквизитов.НайтиСтроки(Отбор);

Если НайденныеСтроки.Количество() > 0 Тогда
    ИмяЭлемента = НайденныеСтроки[0].ИмяЭлемента;
    Элементы[ИмяЭлемента].Видимость = Ложь;
КонецЕсли;

Важное замечание: выполнять поиск строки желательно по ссылке на свойство, а не по его строковому представлению Наименование. Если пользователь переименует реквизит в режиме предприятия, поиск по наименованию вернет пустой массив, что вызовет ошибку обращения по индексу.

Способ 2. Поиск свойства через «Имя для разработчиков»

Чтобы избежать привязки к изменяемому пользовательскому наименованию или жесткому GUID, в актуальных версиях БСП у плана видов характеристик ДополнительныеРеквизитыИСведения предусмотрен специальный реквизит Имя («Имя для разработчиков»).

Разберем по шагам, как использовать этот реквизит:

  1. В режиме «1С:Предприятие» при настройке дополнительного реквизита заполняем поле «Имя для разработчиков» (например, ОсновнойПоставщик).
  2. В программном коде находим ссылку на свойство по этому реквизиту:

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

Если ЗначениеЗаполнено(СсылкаНаСвойство) Тогда
    Отбор = Новый Структура("Свойство", СсылкаНаСвойство);
    НайденныеСтроки = Свойства_ОписаниеДополнительныхРеквизитов.НайтиСтроки(Отбор);
    Если НайденныеСтроки.Количество() > 0 Тогда
        Элементы[НайденныеСтроки[0].ИмяЭлемента].Доступность = Ложь;
    КонецЕсли;
КонецЕсли;

Способ 3. Работа со значениями дополнительных реквизитов без формы

Если задача заключается не в изменении элементов интерфейса, а в чтении или записи значения дополнительного реквизита на сервере, обращаться к элементам формы не требуется. Для этого используются стандартные методы БСП или прямое обращение к табличной части объекта.

Рассмотрим чтение и запись через программный интерфейс БСП:


// Чтение значения свойства
Значение = УправлениеСвойствами.ЗначениеСвойства(СсылкаИлиОбъект, СсылкаНаСвойство);

// Установка значения свойства в объекте
УправлениеСвойствами.УстановитьЗначениеСвойства(Объект, СсылкаНаСвойство, НовоеЗначение);

Также разберем прямой доступ к табличной части ДополнительныеРеквизиты при работе с объектом:


СтрокаРеквизита = Объект.ДополнительныеРеквизиты.Найти(СсылкаНаСвойство, "Свойство");

Если СтрокаРеквизита <> Неопределено Тогда
    ТекущееЗначение = СтрокаРеквизита.Значение;
Иначе
    НоваяСтрока = Объект.ДополнительныеРеквизиты.Добавить();
    НоваяСтрока.Свойство = СсылкаНаСвойство;
    НоваяСтрока.Значение = НовоеЗначение;
КонецЕсли;

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

← На главную