Хоть в задаче был более сложный отчёт, но так как здесь рассматривается не способ создания отчёта на СКД, а способ его формирования для печати из документа, то реализуем такую возможность на примере простого отчёта, который придумаем сами.
Предположим, что необходимо создать отчёт по заказам клиента для конфигурации "Управление торговлей 11". В отчёт выводится товар из заказа, заказанное количество, остаток по заказу и остаток на складе с группировкой по заказам. Дополнительно необходимо распечатывать отчёт непосредственно из документа "Заказ клиента". В таком случае отчёт должен формироваться только по этому заказу и должны присутствовать шапка и подвал с подписью ответственного.
Итак, приступим. Для начала разработаем сам отчёт.
Создадим новый отчет и добавим основную схему компоновки данных.
Добавим в наборы данных запрос с типом "запрос" ЗаказыКлиентов.
Добавим ещё один набор данных с типом "запрос" ОстаткиТоваров.
Настроим связи наборов данных.
Определим ресурсы.
И настроим основной вариант отчёта.
Добавим в модуль отчёта функцию СведенияОВнешнейОбработке для возможности подключения его, как дополнительный отчёт в ИБ.
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительныйОтчет();
ПараметрыРегистрации.Наименование = НСтр("ru='Анализ заказов клиентов'");
ПараметрыРегистрации.Информация = НСтр("ru='Анализ заказов клиентов'");
ПараметрыРегистрации.Версия = "1.0";
Команда = ПараметрыРегистрации.Команды.Добавить();
Команда.Идентификатор = "АнализЗаказовКлиентов";
Команда.Представление = НСтр("ru='Анализ заказов клиентов'");
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
Возврат ПараметрыРегистрации;
КонецФункции
Теперь можно добавить отчёт в список дополнительных отчётов и обработок, и пользователи могут им пользоваться.
Настало время добавить возможность печати отчета из документов "Заказ клиента" согласно поставленной задачи.
Для начала, создадим и настроим новый вариант отчета ПоЗаказуКлиента.
Для шапки и подвала зададим макет.
Осталось добавить возможность печати нового варианта из формы документа или списка документов по команде Печать. Для этого необходимо создать новую внешнюю обработку с видом Печатная форма, задача которой будет вызывать созданный выше отчёт, устанавливать отбор по заказу и добавлять результат отчёта в табличный документ.
Создадим новую внешнюю обработку.
Для подключения обработки как дополнительной в ИБ реализуем функцию СведенияОВнешнейОбработке.
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
ПараметрыРегистрации.Версия = "1.0";
ПараметрыРегистрации.Наименование = НСтр("ru='Анализ заказа клиента (печ. форма)'");
ПараметрыРегистрации.Информация = НСтр("ru='Печатная форма ""Анализ заказа клиента""'");
ПараметрыРегистрации.БезопасныйРежим = Ложь;
ПараметрыРегистрации.Назначение.Добавить("Документ.ЗаказКлиента");
Команда = ПараметрыРегистрации.Команды.Добавить();
Команда.Идентификатор = "АнализЗаказаКлиента";
Команда.Представление = НСтр("ru='Анализ заказа клиента'");
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
Команда.Модификатор = "ПечатьMXL";
Команда.ПоказыватьОповещение = Ложь;
Возврат ПараметрыРегистрации;
КонецФункции
Добавим процедуру печати, которая будет вызывать функцию формирования печатной формы.
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "АнализЗаказаКлиента") Тогда
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
"АнализЗаказаКлиента",
НСтр("ru='Анализ заказа клиента'"),
ПечатьАнализЗаказаКлиента(МассивОбъектов, ОбъектыПечати));
КонецЕсли;
КонецПроцедуры
Теперь необходимо в функции печати ПечатьАнализЗаказаКлиента реализовать формирование отчета.
Для начала необходимо получить ссылку на дополнительный отчет АнализЗаказовКлиентов, добавленный в дополнительные отчеты и обработки.
Запрос = Новый Запрос(
"ВЫБРАТЬ ПЕРВЫЕ 1
| ДополнительныеОтчетыИОбработки.Ссылка КАК Ссылка,
| ДополнительныеОтчетыИОбработки.Публикация КАК Публикация,
| ДополнительныеОтчетыИОбработки.ПометкаУдаления КАК ПометкаУдаления
|ИЗ
| Справочник.ДополнительныеОтчетыИОбработки КАК ДополнительныеОтчетыИОбработки
|ГДЕ
| ДополнительныеОтчетыИОбработки.ИмяОбъекта = ""АнализЗаказовКлиентов""");
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
ВызватьИсключение НСтр("ru='Отсутствует дополнительный отчет ""Анализ заказов клиентов"".'");
КонецЕсли;
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
Можно дополнительно проверить, чтобы отчёт был не помечен на удаление и опубликован.
Если Выборка.ПометкаУдаления Тогда
ВызватьИсключение НСтр("ru='Дополнительный отчет ""Анализ заказов клиентов"" помечен на удаление.'");
ИначеЕсли Выборка.Публикация = Перечисления.ВариантыПубликацииДополнительныхОтчетовИОбработок.Отключена Тогда
ВызватьИсключение НСтр("ru='Публикация дополнительного отчета ""Анализ заказов клиентов"" отключена.'");
КонецЕсли;
Подключим найденный отчёт для возможности его использования.
ИмяОтчета = ДополнительныеОтчетыИОбработки.ПодключитьВнешнююОбработку(Выборка.Ссылка);
Создадим объект отчета.
ОтчетОбъект = ВнешниеОтчеты.Создать(ИмяОтчета);
Загрузим настройки варианта отчета ПоЗаказуКлиента.
СхемаКомпоновкиДанных = ОтчетОбъект.СхемаКомпоновкиДанных;
ВариантОтчетаПоЗаказу = СхемаКомпоновкиДанных.ВариантыНастроек.ПоЗаказуКлиента;
ОтчетОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(ВариантОтчетаПоЗаказу.Настройки);
Инициализируем табличный документ, в который будут выводиться результаты отчета.
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_АнализЗаказаКлиента";
ТабличныйДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
ТабличныйДокумент.АвтоМасштаб = Истина;
Осталось пройти по массиву документов (пользователь может выбрать несколько документов в списке) и по каждому сформировать отчёт с выводом в табличный документ.
ПервыйДокумент = Истина;
Для каждого ЗаказКлиента ИЗ МассивОбъектов Цикл
Если Не ПервыйДокумент Тогда
ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
ПервыйДокумент = Ложь;
// Установим отбор по заказу клиента.
КомпоновкаДанныхКлиентСервер.ДобавитьОтбор(
ОтчетОбъект.КомпоновщикНастроек,
"ЗаказКлиента",
ЗаказКлиента);
НомерСтрокиНачало = ТабличныйДокумент.ВысотаТаблицы + 1;
// Скомпонуем отчет и добавим результаты в табличный документ.
ОтчетОбъект.СкомпоноватьРезультат(ТабличныйДокумент);
УправлениеПечатью.ЗадатьОбластьПечатиДокумента(
ТабличныйДокумент,
НомерСтрокиНачало,
ОбъектыПечати,
ЗаказКлиента);
КонецЦикла;
Задача решена.
Далее всё стандартно. Пользователь может распечатать отчёт из формы документа.
Или из формы списка, выбрав несколько документов.
Таким образом мы создали отчёт, который можно использовать, как печатную форму документа и при этом нам удалось избежать дублирования кода в печатной форме.