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