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