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