Часто возникает задача создать пользовательский отчет и сделать так, чтобы его можно было вызывать прямо из формы конкретного документа, например, из «Заказа поставщику» в 1С:ERP — для этого подойдёт модуль интеграции внешних отчетов в формы документов. При этом отчет должен автоматически формироваться по данным именно этого документа. Рассмотрим пошагово, как реализовать такой механизм с помощью стандартных средств Библиотеки стандартных подсистем (БСП), которые используются во всех современных типовых конфигурациях.
Основная задача — не просто добавить кнопку вызова отчета в интерфейс документа, а научить отчет "понимать", из какого документа его вызвали, и использовать ссылку на этот документ для отбора данных.
Этот метод является стандартным и наиболее правильным для современных конфигураций. Он состоит из трех ключевых этапов: регистрация отчета, перехват параметров при открытии и настройка запроса в схеме компоновки данных (СКД).
Чтобы конфигурация "узнала" о нашем отчете и поняла, к каким документам его нужно прикрепить, в модуле объекта внешнего отчета необходимо создать экспортную функцию СведенияОВнешнейОбработке() (в процессе разработки вам может пригодиться отладка внешних печатных форм и обработок — для этого есть универсальный отладчик и конструктор СКД). Эта функция возвращает структуру с параметрами регистрации.
Посмотрим на пример кода:
Функция СведенияОВнешнейОбработке() Экспорт
ВерсияБСП = СтандартныеПодсистемыСервер.ВерсияБиблиотеки();
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке(ВерсияБСП);
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиОтчет;
ПараметрыРегистрации.Версия = "1.0.0.1";
ПараметрыРегистрации.Назначение.Добавить("Документ.ЗаказПоставщику");
// Создаем команду, которая будет видна пользователю
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы;
НоваяКоманда.Идентификатор = "МойСуперОтчетПоЗаказу"; // Уникальный идентификатор
НоваяКоманда.Представление = "Мой супер отчет по заказу"; // Как команда будет называться в меню
Возврат ПараметрыРегистрации;
КонецФункции
Разберем ключевые строки:
ПараметрыРегистрации.Вид: здесь мы явно указываем, что подключаем именно отчет (ВидОбработкиОтчет), для чего можно использовать шаблон дополнительной обработки.ПараметрыРегистрации.Назначение.Добавить("Документ.ЗаказПоставщику"): это самая важная строка. Здесь мы "привязываем" наш отчет к конкретному объекту метаданных. В данном случае, к документу «ЗаказПоставщику». Можно добавить несколько назначений, если отчет универсальный.ПараметрыРегистрации.Команды: в эту коллекцию мы добавляем подключаемые команды БСП, которые появятся в меню «Отчеты» в форме документа и форме списка.Теперь нужно научить отчет принимать параметры из документа. Для этого в том же модуле объекта отчета создадим две экспортные процедуры: ОпределитьНастройкиФормы и ПередЗагрузкойВариантаНаСервере — писать и тестировать их логику поможет инструмент пошаговой отладки кода 1С в режиме Предприятия.
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
// Сразу формировать отчет при открытии
Настройки.ФормироватьСразу = Истина;
// Указываем, что нужно вызвать следующую процедуру перед загрузкой настроек СКД
Настройки.События.ПередЗагрузкойВариантаНаСервере = Истина;
КонецПроцедуры
Процедура ПередЗагрузкойВариантаНаСервере(Форма, НовыеНастройкиКД) Экспорт
// Проверяем, были ли переданы объекты, из которых вызван отчет
Если Форма.Параметры.Свойство("ОбъектыНазначения") Тогда
// Передаем массив ссылок в параметр СКД с именем "МассивСсылок"
НовыеНастройкиКД.ПараметрыДанных.УстановитьЗначениеПараметра("МассивСсылок", Форма.Параметры.ОбъектыНазначения);
КонецЕсли;
КонецПроцедуры
Проанализируем этот механизм:
ОпределитьНастройкиФормы вызывается системой перед открытием формы отчета. Мы включаем флаг ФормироватьСразу для удобства пользователя и, что самое главное, активируем событие ПередЗагрузкойВариантаНаСервере.ПередЗагрузкойВариантаНаСервере — это сердце нашего механизма. Система автоматически помещает в параметры формы (Форма.Параметры) ключ ОбъектыНазначения.Форма.Параметры.ОбъектыНазначения — это всегда массив ссылок. Даже если отчет вызывается из формы одного документа, это будет массив с одним элементом. Если выделить несколько документов в списке и вызвать отчет, в массиве будут все выделенные ссылки.МассивСсылок. Критически важно, чтобы имя этого параметра в коде точно совпадало с именем параметра в вашей СКД!Последний шаг — подготовить сам отчет к приему данных. В схеме компоновки данных отчета нужно выполнить два действия.
1. Создать параметр. На вкладке «Параметры» создайте новый параметр. Назовем его МассивСсылок (как в коде выше). Для него желательно указать тип, например, ДокументСсылка.ЗаказПоставщику, и установить флажок «Доступен список значений».
2. Использовать параметр в запросе. Теперь в тексте запроса набора данных мы можем использовать этот параметр для отбора. Поскольку мы передаем массив ссылок, условие в секции ГДЕ должно использовать оператор В.
Пример текста запроса в СКД:
ВЫБРАТЬ
ЗаказПоставщикуТовары.Номенклатура,
ЗаказПоставщикуТовары.Количество,
ЗаказПоставщикуТовары.Цена,
ЗаказПоставщикуТовары.Сумма,
ЗаказПоставщикуТовары.Ссылка.Контрагент КАК Контрагент,
ЗаказПоставщикуТовары.Ссылка КАК ДокументОснование
ИЗ
Документ.ЗаказПоставщику.Товары КАК ЗаказПоставщикуТовары
ГДЕ
ЗаказПоставщикуТовары.Ссылка В (&МассивСсылок)
Именно такой подход является самым правильным. Мы не передаем из документа по отдельности контрагента, список номенклатуры и другие реквизиты. Мы передаем только ссылку на документ (или массив ссылок), а уже внутри запроса отчета получаем все необходимые данные, обращаясь к реквизитам и табличным частям этого документа.
Существует и другой, более старый способ, который тоже может быть полезен в некоторых ситуациях. Он не использует процедуры ОпределитьНастройкиФормы и ПередЗагрузкойВариантаНаСервере.
1. В форме отчета создается реквизит, например, ЗаказДокумент с типом нужной ссылки (ДокументСсылка.ЗаказПоставщику).
2. В событии формы ПриСозданииНаСервере пишется код, который извлекает переданный параметр.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("ПараметрыКоманды") Тогда
// ПараметрыКоманды - это массив, ссылка на документ обычно в первом элементе
Если Параметры.ПараметрыКоманды.Количество() > 0 Тогда
Отчет.ЗаказДокумент = Параметры.ПараметрыКоманды[0];
КонецЕсли;
КонецЕсли;
КонецПроцедуры
3. Далее этот реквизит формы (Отчет.ЗаказДокумент) можно использовать, например, в процедуре ПриКомпоновкеРезультата, чтобы программно установить отбор компоновщика.
Этот способ менее гибок (например, сложнее обработать множественный выбор из списка), и он не является стандартным для БСП, но для простых случаев может оказаться рабочим вариантом.
Подводя итог, использование механизма БСП с функциями СведенияОВнешнейОбработке и процедурами ОпределитьНастройкиФормы / ПередЗагрузкойВариантаНаСервере является наиболее надежным и универсальным способом интеграции внешних отчетов в интерфейс типовых конфигураций 1С.