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