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