Как настроить формирование отчета из документа через БСП с автоматическим отбором?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке конфигураций на базе Библиотеки стандартных подсистем (БСП) часто возникает задача интеграции отчета непосредственно в форму документа. Стандартные механизмы БСП позволяют легко добавить кнопку отчета в подменю «Печать» или «Отчеты», однако разработчики часто сталкиваются с тем, что открывшийся отчет выводит данные по всем документам базы, игнорируя контекст текущей формы. Рассмотрим подробно, как реализовать механизм автоматической фильтрации, чтобы отчет формировался строго по тому документу, из которого он был вызван.

Регистрация команды в модуле менеджера документа

Первым шагом нам необходимо сообщить системе, что конкретный отчет должен быть доступен из формы определенного документа. Для этого мы будем использовать процедуру ДобавитьКомандыОтчетов. Проанализируем пример кода, который необходимо разместить в модуле менеджера вашего документа:


Процедура ДобавитьКомандыОтчетов(КомандыОтчетов, Параметры) Экспорт
    
    // Проверяем права пользователя на просмотр отчета
    Если ПравоДоступа("Просмотр", Метаданные.Отчеты.М_СостояниеЗаказовНарядов) Тогда
        
        КомандаОтчет = КомандыОтчетов.Добавить();
        // Указываем полное имя метаданных отчета
        КомандаОтчет.Менеджер = Метаданные.Отчеты.М_СостояниеЗаказовНарядов.ПолноеИмя;
        КомандаОтчет.Представление = НСтр("ru = 'Состояние заказа-наряда'");
        КомандаОтчет.МножественныйВыбор = Ложь;
        КомандаОтчет.Важность = "Обычное";
        
        // Важный момент: идентификатор команды для связи
        КомандаОтчет.ДополнительныеПараметры.Вставить("ИмяКоманды", "М_СостояниеЗаказовНарядов");
        
        // Способ автоматической настройки отбора (вариант А)
        КомандаОтчет.ИмяПараметраФормы = "Отбор.Ссылка";
        
    КонецЕсли;
    
КонецПроцедуры

Обратите внимание на свойство ИмяПараметраФормы. Если в системе компоновки данных (СКД) (удобно через инструментарий разработчика для отладки СКД и запросов) вашего отчета есть поле или параметр с именем Ссылка, БСП попытается автоматически передать туда значение текущего документа. Однако этот метод не всегда срабатывает, если структура отчета сложная, поэтому мы разберем более универсальный способ ниже.

Подключение команд в форме документа

Чтобы зарегистрированная команда физически появилась в интерфейсе, необходимо добавить вызов подсистемы в модуль формы документа — есть готовая панель отчетов для встраивания в формы документов. Разберем, как это сделать в обработчике ПриСозданииНаСервере:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Инициализация подключаемых команд БСП
    ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
    
КонецПроцедуры

После этого на форме появится кнопка. Но, как мы выяснили, нажатие на нее может привести к открытию пустого или общего отчета без фильтра. Выясним причину и настроим передачу параметров программно.

Настройка модуля объекта отчета для перехвата параметров

Для того чтобы отчет «услышал» команду из документа, нам нужно переопределить логику его открытия. Это делается в модуле объекта отчета. Нам потребуется реализовать две ключевые экспортные процедуры: ОпределитьНастройкиФормы и ПриСозданииНаСервере.

Проанализируем ситуацию: когда БСП открывает форму отчета, она передает структуру параметров. Наша задача — разрешить отчету обрабатывать события формы на стороне сервера и внедрить нужный нам отбор в КомпоновщикНастроек (подробнее о применении отбора компоновки данных к запросу читайте в профильных материалах).

Рассмотрим реализацию в модуле объекта отчета:


// Определяем, какие события формы отчета будут обрабатываться в модуле объекта
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
    
    // Включаем обработку серверного события создания формы
    Настройки.События.ПриСозданииНаСервере = Истина;
    
КонецПроцедуры

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

Нюансы работы с внешними отчетами

Если вы подключаете этот отчет как внешний (через справочник «Дополнительные отчеты и обработки»), механизм остается практически таким же, но добавляется необходимость описать его в функции СведенияОВнешнейОбработке. Посмотрим, на что стоит обратить внимание:

В структуре параметров регистрации необходимо явно указать использование настроек формы. Также рекомендуется использовать шаблон обработки с удобной системой хранения настроек. Рассмотрим фрагмент кода:


Функция СведенияОВнешнейОбработке() Экспорт
    
    ПараметрыРегистрации = Новый Структура;
    // ... заполнение стандартных полей (Вид, Наименование, Версия) ...
    
    // Указываем БСП, что отчет использует переопределение настроек формы
    ПараметрыРегистрации.Вставить("ОпределитьНастройкиФормы", Истина);
    
    // Описываем команду
    Команда = ПараметрыРегистрации.Команды.Добавить();
    Команда.Представление = "Отчет по текущему документу";
    Команда.Идентификатор = "ОсновнойВариант";
    Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОтчет();
    
    Возврат ПараметрыРегистрации;
    
КонецФункции

Автоматическое формирование отчета при открытии

Часто пользователю неудобно нажимать кнопку «Сформировать» после того, как он уже нажал на кнопку вызова отчета в документе. Разберем, как сделать работу с отчетом бесшовной. В БСП для этого предусмотрен специальный флаг в дополнительных параметрах команды.

Вернемся в модуль менеджера документа и дополним нашу команду:


// В процедуре ДобавитьКомандыОтчетов
КомандаОтчет.ДополнительныеПараметры.Вставить("СформироватьПриОткрытии", Истина);

Теперь при нажатии на кнопку в документе отчет не просто откроется с заполненным фильтром, но и сразу отобразит данные пользователю (если отчет тяжелый, не забывайте про использование длительных операций в БСП).

Важные рекомендации и типичные ошибки

  1. Обновление кэша: После внесения изменений в ДобавитьКомандыОтчетов или СведенияОВнешнейОбработке обязательно нужно обновить информацию о командах в режиме «1С:Предприятие». Это можно сделать через специальные обработки (например, «Обновление вспомогательных данных») или запустив базу с параметром /C ЗапуститьОбновлениеИнформационнойБазы.
  2. Соответствие имен полей: Убедитесь, что в процедуре ПриСозданииНаСервере вы обращаетесь к полю компоновки данных, которое реально существует в вашей схеме (СКД). Если в СКД поле называется Объект, а в коде вы прописали Ссылка, отбор не сработает (в некоторых случаях удобно использовать отборы по шаблону в списке).
  3. Права доступа: Команда не появится на форме, если у пользователя нет прав на объект Отчет.ВашОтчет. Всегда проверяйте это условие в коде регистрации команды.
  4. Использование общих модулей: Если вы планируете использовать этот отчет во многих документах, имеет смысл вынести логику установки отбора в общий модуль, чтобы не дублировать код в каждом отчете.

Проанализировав вышеописанные шаги, мы видим, что интеграция отчетов через БСП — это мощный инструмент, требующий понимания взаимодействия между формой-источником, программным интерфейсом команд и системой компоновки данных. Правильное использование ПараметрКоманды позволяет создавать гибкие и удобные отчеты, работающие в контексте конкретных бизнес-сущностей.

← На главную