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