Как сформировать различные печатные формы на основании отчета СКД?

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

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

Рассмотрим несколько способов решения этой задачи: от стандартных возможностей платформы 1С:Предприятие до программных методов компоновки и сборки результирующего табличного документа.

Способ 1. Реализация через отдельные варианты отчета

Наиболее прямолинейный и поддерживаемый путь — использование встроенного механизма вариантов схемы компоновки данных. Для каждого требуемого печатного документа в схеме настраивается собственный вариант отчета.

Разберем, как это работает на практике:

  1. В схеме компоновки данных на вкладке Настройки создаем основной вариант (для интерактивной работы на форме) и дополнительные варианты под каждую печатную форму.
  2. В дополнительных вариантах настраиваются индивидуальные заголовки, группировки или пользовательские макеты оформления подвала.
  3. Если пользователь нажимает команду «Печать», программа программно берет текущие пользовательские настройки (отборы, параметры периода) из текущей формы, применяет их к выбранному печатному варианту и формирует результат без ручного перебивания параметров.

Посмотрим на пример программной компоновки альтернативного варианта отчета:


// Получаем схему компоновки и настройки нужного варианта
Схема = ОтчетОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
НастройкиПечати = Схема.ВариантыНастроек.Найти("ПечатнаяФормаАкта").Настройки;

// Переносим установленные пользователем параметры и отборы
КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(Схема));
КомпоновщикНастроек.ЗагрузитьНастройки(НастройкиПечати);
КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки(ОтчетОбъект.КомпоновщикНастроек.ПользовательскиеНастройки);

// Компонуем макет
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);

// Инициализируем процессор компоновки и процессор вывода
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

ТабличныйДокумент = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабличныйДокумент);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);

ТабличныйДокумент.Показать("Печать");

Способ 2. Параметризация макетов в СКД без дублирования вариантов

Если структура таблицы всегда идентична и не хочется создавать множество вариантов отчета, разберем настройку единого макета оформления в схеме:

  1. Переходим на вкладку Параметры схемы компоновки данных и добавляем параметр ТипПечатнойФормы (тип — Число или Строка).
  2. На вкладке Макеты создаем собственный макет заголовка или подвала для группировки отчета.
  3. В ячейках шапки и подвала в свойствах параметров используем выражения языка СКД с условиями. Например: Выбор Когда &ТипПечатнойФормы = 1 Тогда "Акт сверки расчетов" Иначе "Реестр операций" Конец.
  4. Для подписантов можно добавить строковые параметры (например, &ФИООтветственного, &ДолжностьПодписанта), которые передаются на форму перед формированием.

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

Способ 3. Сборка печатной формы из готового результата (без повторного запроса к БД)

Когда отчет уже сформирован пользователем на экране, повторное выполнение запроса к базе данных для печати создает лишнюю нагрузку на сервер. Если данные таблицы менять не требуется, проанализируем способ объединения готового табличного документа с макетом шапки и подвала.

Разберем по шагам алгоритм склейки:

  1. В объекте отчета создаем классический макет табличного документа с областями ШапкаФормы1, ШапкаФормы2, ПодвалФормы1, ПодвалФормы2.
  2. Создаем новый результирующий ТабличныйДокумент.
  3. Методом Вывести() выводим область шапки из макета.
  4. Вторым шагом выводим сформированный табличный документ отчета целиком: ПечатныйДокумент.Вывести(ТекущийТабличныйДокументОтчета).
  5. Выводим область подвала с подписями.

Важная особенность: при последовательном выводе разных блоков в один табличный документ ширина колонок первого выведенного блока (шапки) определяет сетку колонок всего документа. Чтобы избежать искажения ширины колонок отчета, ячейки шапки и подвала необходимо объединять по всей предполагаемой ширине таблицы либо не задавать для них жесткую сетку колонок.

Способ 4. Управление процессом через ПроцессорВывода

Для полного контроля над визуальной структурой документа можно управлять пошаговым выводом элементов компоновки данных вручную:


// Инициализируем пустой документ для печати
ПечатныйДокумент = Новый ТабличныйДокумент;

// Выводим шапку из классического макета отчета
МакетОформления = ОтчетОбъект.ПолучитьМакет("МакетПечатныхФорм");
ОбластьШапка = МакетОформления.ПолучитьОбласть("ШапкаВариант1");
ПечатныйДокумент.Вывести(ОбластьШапка);

// Настраиваем вывод тела отчета из СКД
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ПечатныйДокумент);
ПроцессорВывода.НачатьВывод();

Пока Истина Цикл
    Элемент = ПроцессорКомпоновки.СледующийЭлемент();
    Если Элемент = Неопределено Тогда
        Прервать;
    КонецЕсли;
    ПроцессорВывода.ВывестиЭлемент(Элемент);
КонецЦикла;

ПроцессорВывода.ЗакончитьВывод();

// Выводим подвал из классического макета
ОбластьПодвал = МакетОформления.ПолучитьОбласть("ПодвалВариант1");
ПечатныйДокумент.Вывести(ОбластьПодвал);

ПечатныйДокумент.Показать("Результат печати");

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

Способ 5. Использование колонтитулов табличного документа

Если отличия между печатными формами заключаются только в служебной информации (наименование организации, номер формы по ОКУД, ответственные лица, номера страниц), менять макет и схему не требуется. Достаточно программно заполнить свойства ВерхнийКолонтитул и НижнийКолонтитул результирующего табличного документа перед печатью.


ТабличныйДокумент.ВерхнийКолонтитул.Выводить = Истина;
ТабличныйДокумент.ВерхнийКолонтитул.ТекстСлева = "Организация: " + ОрганизацияНаименование;
ТабличныйДокумент.ВерхнийКолонтитул.ТекстСправа = "Форма № 2-П";

ТабличныйДокумент.НижнийКолонтитул.Выводить = Истина;
ТабличныйДокумент.НижнийКолонтитул.ТекстСлева = "Ответственный: " + ПользовательИмя;
ТабличныйДокумент.НижнийКолонтитул.ТекстСправа = "Страница [&НомерСтраницы] из [&СтраницВсего]";

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

← На главную