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