Как подключить внешний отчет к документу и передать в него параметры?

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием Управленческий учет
← На главную

Часто возникает задача создать пользовательский отчет и сделать так, чтобы его можно было вызывать прямо из формы конкретного документа, например, из «Заказа поставщику» в 1С:ERP — для этого подойдёт модуль интеграции внешних отчетов в формы документов. При этом отчет должен автоматически формироваться по данным именно этого документа. Рассмотрим пошагово, как реализовать такой механизм с помощью стандартных средств Библиотеки стандартных подсистем (БСП), которые используются во всех современных типовых конфигурациях.

Основная задача — не просто добавить кнопку вызова отчета в интерфейс документа, а научить отчет "понимать", из какого документа его вызвали, и использовать ссылку на этот документ для отбора данных.

Основной способ: через механизм дополнительных отчетов и обработок (БСП)

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

Шаг 1. Регистрация внешнего отчета в системе

Чтобы конфигурация "узнала" о нашем отчете и поняла, к каким документам его нужно прикрепить, в модуле объекта внешнего отчета необходимо создать экспортную функцию СведенияОВнешнейОбработке() (в процессе разработки вам может пригодиться отладка внешних печатных форм и обработок — для этого есть универсальный отладчик и конструктор СКД). Эта функция возвращает структуру с параметрами регистрации.

Посмотрим на пример кода:


Функция СведенияОВнешнейОбработке() Экспорт

    ВерсияБСП = СтандартныеПодсистемыСервер.ВерсияБиблиотеки();
    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке(ВерсияБСП);

    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиОтчет;
    ПараметрыРегистрации.Версия = "1.0.0.1";
    ПараметрыРегистрации.Назначение.Добавить("Документ.ЗаказПоставщику");

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

    Возврат ПараметрыРегистрации;

КонецФункции

Разберем ключевые строки:

Шаг 2. Перехват контекста документа при открытии отчета

Теперь нужно научить отчет принимать параметры из документа. Для этого в том же модуле объекта отчета создадим две экспортные процедуры: ОпределитьНастройкиФормы и ПередЗагрузкойВариантаНаСервере — писать и тестировать их логику поможет инструмент пошаговой отладки кода 1С в режиме Предприятия.


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

Процедура ПередЗагрузкойВариантаНаСервере(Форма, НовыеНастройкиКД) Экспорт
    // Проверяем, были ли переданы объекты, из которых вызван отчет
    Если Форма.Параметры.Свойство("ОбъектыНазначения") Тогда
        // Передаем массив ссылок в параметр СКД с именем "МассивСсылок"
        НовыеНастройкиКД.ПараметрыДанных.УстановитьЗначениеПараметра("МассивСсылок", Форма.Параметры.ОбъектыНазначения);
    КонецЕсли;
КонецПроцедуры

Проанализируем этот механизм:

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

Шаг 3. Настройка схемы компоновки данных (СКД)

Последний шаг — подготовить сам отчет к приему данных. В схеме компоновки данных отчета нужно выполнить два действия.

1. Создать параметр. На вкладке «Параметры» создайте новый параметр. Назовем его МассивСсылок (как в коде выше). Для него желательно указать тип, например, ДокументСсылка.ЗаказПоставщику, и установить флажок «Доступен список значений».

2. Использовать параметр в запросе. Теперь в тексте запроса набора данных мы можем использовать этот параметр для отбора. Поскольку мы передаем массив ссылок, условие в секции ГДЕ должно использовать оператор В.

Пример текста запроса в СКД:


ВЫБРАТЬ
    ЗаказПоставщикуТовары.Номенклатура,
    ЗаказПоставщикуТовары.Количество,
    ЗаказПоставщикуТовары.Цена,
    ЗаказПоставщикуТовары.Сумма,
    ЗаказПоставщикуТовары.Ссылка.Контрагент КАК Контрагент,
    ЗаказПоставщикуТовары.Ссылка КАК ДокументОснование
ИЗ
    Документ.ЗаказПоставщику.Товары КАК ЗаказПоставщикуТовары
ГДЕ
    ЗаказПоставщикуТовары.Ссылка В (&МассивСсылок)

Именно такой подход является самым правильным. Мы не передаем из документа по отдельности контрагента, список номенклатуры и другие реквизиты. Мы передаем только ссылку на документ (или массив ссылок), а уже внутри запроса отчета получаем все необходимые данные, обращаясь к реквизитам и табличным частям этого документа.

Альтернативный способ: через параметры команды

Существует и другой, более старый способ, который тоже может быть полезен в некоторых ситуациях. Он не использует процедуры ОпределитьНастройкиФормы и ПередЗагрузкойВариантаНаСервере.

1. В форме отчета создается реквизит, например, ЗаказДокумент с типом нужной ссылки (ДокументСсылка.ЗаказПоставщику).

2. В событии формы ПриСозданииНаСервере пишется код, который извлекает переданный параметр.


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Если Параметры.Свойство("ПараметрыКоманды") Тогда
        // ПараметрыКоманды - это массив, ссылка на документ обычно в первом элементе
        Если Параметры.ПараметрыКоманды.Количество() > 0 Тогда
            Отчет.ЗаказДокумент = Параметры.ПараметрыКоманды[0];
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

3. Далее этот реквизит формы (Отчет.ЗаказДокумент) можно использовать, например, в процедуре ПриКомпоновкеРезультата, чтобы программно установить отбор компоновщика.

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

Подводя итог, использование механизма БСП с функциями СведенияОВнешнейОбработке и процедурами ОпределитьНастройкиФормы / ПередЗагрузкойВариантаНаСервере является наиболее надежным и универсальным способом интеграции внешних отчетов в интерфейс типовых конфигураций 1С.

← На главную