При разработке внешних отчетов в конфигурациях на обычных формах, таких как Зарплата и Управление Персоналом 2.5, часто возникает задача выйти за рамки стандартного поведения платформы. Вместо обычного открытия карточки документа или справочника при двойном клике по ячейке, нам может потребоваться запустить другую обработку, сформировать уточняющий отчет или вывести диалоговое окно с выбором действий. В этой статье мы подробно разберем, как перехватить стандартное событие расшифровки и реализовать собственную логику обработки данных.
Прежде всего, проанализируем важный технический нюанс, с которым сталкиваются многие разработчики. В платформе 1С существует два похожих, но принципиально разных элемента управления для форм:
ОбработкаРасшифровки.Для реализации нашей задачи на форме отчета обязательно должен присутствовать элемент ПолеТабличногоДокумента. Если вы по ошибке добавили ТабличноеПоле, вы просто не найдете нужного события в свойствах элемента.
Рассмотрим, как подготовить макет отчета. Чтобы платформа понимала, что ячейка является интерактивной, ей нужно назначить параметр расшифровки. Разберем это по шагам:
СотрудникДляРасшифровки.Теперь в программном коде формирования отчета нам нужно заполнить этот параметр данными. Рассмотрим пример заполнения области макета:
Область = Макет.ПолучитьОбласть("Строка");
Область.Параметры.ФИО = ТекущийСотрудник.Наименование;
// Присваиваем расшифровке ссылку на объект или структуру данных
Область.Параметры.СотрудникДляРасшифровки = ТекущийСотрудник.Ссылка;
ТабДок.Вывести(Область);
Чтобы событие ОбработкаРасшифровки срабатывало, необходимо правильно настроить элемент управления на форме. Выясним, какие свойства критически важны:
Во-первых, свойство Только просмотр (ReadOnly) должно быть установлено в значение Истина. Если поле будет доступно для редактирования, двойной клик по ячейке активирует режим ввода текста, и расшифровка не сработает.
Во-вторых, желательно установить свойство Защита (Protection) в значение Истина, чтобы пользователь не мог случайно изменить структуру выведенного отчета.
Теперь перейдем к самому главному — написанию кода в модуле формы. Откроем свойства нашего ПоляТабличногоДокумента на форме, перейдем на закладку События и нажмем на лупу рядом с событием ОбработкаРасшифровки. Платформа создаст процедуру-заготовку.
Проанализируем сигнатуру этой процедуры:
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
// Элемент - это наше поле табличного документа
// Расшифровка - значение, которое мы записали в ячейку в макете
// СтандартнаяОбработка - булево, управляющее системным поведением
КонецПроцедуры
Если мы хотим полностью заменить стандартное поведение (например, не открывать карточку сотрудника, а запустить свою обработку), мы должны первым делом установить СтандартнаяОбработка = Ложь;. Рассмотрим пример, где в зависимости от типа переданных данных выполняются разные действия:
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
Если Расшифровка = Неопределено Тогда
Возврат;
КонецЕсли;
// Отменяем стандартное открытие объектов
СтандартнаяОбработка = Ложь;
// Проверяем, что к нам пришла ссылка на сотрудника
Если ТипЗнч(Расшифровка) = Тип("СправочникСсылка.СотрудникиОрганизаций") Тогда
// Пример: запуск внешней обработки с передачей параметра
ПутьКФайлу = "C:\Reports\ДополнительныйАнализ.epf";
ВнешняяОбработка = ВнешниеОбработки.Создать(ПутьКФайлу);
ФормаОбр = ВнешняяОбработка.ПолучитьФорму("Форма");
ФормаОбр.Сотрудник = Расшифровка; // Передаем данные в обработку
ФормаОбр.Открыть();
КонецЕсли;
КонецПроцедуры
Зачастую одной ссылки недостаточно для корректного запуска другой обработки. Нам может понадобиться дата отчета, организация или подразделение. Посмотрим на пример, как передать в расшифровку целый набор данных с помощью Структуры.
В коде формирования отчета:
ДанныеРасшифровки = Новый Структура;
ДанныеРасшифровки.Вставить("Сотрудник", ТекущийСотрудник);
ДанныеРасшифровки.Вставить("ДатаНачала", ПериодРегистрации);
ДанныеРасшифровки.Вставить("ВидРасчета", ТекущийВидРасчета);
Область.Параметры.СотрудникДляРасшифровки = ДанныеРасшифровки;
В обработчике расшифровки на форме:
Если ТипЗнч(Расшифровка) = Тип("Структура") Тогда
Сотрудник = Расшифровка.Сотрудник;
ДатаОтчета = Расшифровка.ДатаНачала;
// Выполняем действия с полученными данными...
Сообщить("Выполняем анализ по сотруднику: " + Сотрудник);
КонецЕсли;
Иногда удобно предоставить пользователю выбор: хочет он просто открыть документ или запустить дополнительный алгоритм. Выясним, как это реализовать через СписокЗначений и метод ВыбратьИзСписка.
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
СписокДействий = Новый СписокЗначений;
СписокДействий.Добавить("ОткрытьКарточку", "Открыть личную карточку сотрудника");
СписокДействий.Добавить("РасчетныйЛисток", "Сформировать расчетный листок");
ВыбранноеДействие = ВыбратьИзСписка(СписокДействий, Элемент);
Если ВыбранноеДействие <> Неопределено Тогда
Если ВыбранноеДействие.Значение = "ОткрытьКарточку" Тогда
// Открываем форму справочника программно
ПараметрыФормы = Новый Структура("Ключ", Расшифровка);
ОткрытьФорму("Справочник.СотрудникиОрганизаций.ФормаОбъекта", ПараметрыФормы);
ИначеЕсли ВыбранноеДействие.Значение = "РасчетныйЛисток" Тогда
// Логика запуска отчета расчетного листка
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Таким образом, мы проанализировали ситуацию и выяснили, что для управления расшифровкой необходимо использовать ПолеТабличногоДокумента, правильно заполнять параметры в макете и грамотно манипулировать флагом СтандартнаяОбработка в модуле формы. Эти инструменты позволяют превратить обычный статичный отчет в мощный интерактивный инструмент управления данными в ЗУП 2.5.