Как реализовать внешнюю печатную форму на основе функционала типового отчета с СКД?

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

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

Понимание архитектурного ограничения

Основная проблема заключается в типизации объектов в системе 1С. Печатные формы должны являться внешними обработками (.epf), тогда как отчеты — внешними отчетами (.erf). Когда вы пытаетесь использовать объект, имеющий структуру отчета, в качестве печатной формы, подсистема БСП блокирует его регистрацию. Попытка «подстроить» отчет под печатную форму, вызывая его модули из формы, часто приводит к созданию запутанного и трудноподдерживаемого кода.

Решение: создание внешней обработки-обертки

Самый надежный и архитектурно верный способ — создание новой внешней обработки (.epf), которая будет выступать в роли «обертки» для логики СКД. В этом случае мы не копируем логику отчета, а используем её программно.

Рассмотрим пошаговый алгоритм реализации:

  1. Создайте внешнюю обработку, предназначенную для печати.
  2. В модуле объекта обработки реализуйте процедуру, которая будет формировать табличный документ.
  3. Внутри этой процедуры программно инициализируйте схему компоновки данных.

Рассмотрим пример того, как программно запустить КомпоновщикМакетаКомпоновкиДанных и получить результат:


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

Программный вызов типового отчета

Если логика отчета крайне сложна и перенос СКД внутрь обработки трудозатратен, можно использовать подход программного создания экземпляра типового отчета:

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

Этот метод позволяет избежать дублирования «грязного» кода внутри внешней печатной формы, позволяя использовать уже отлаженные алгоритмы типового решения.

Рекомендации по поддержке кода

Чтобы избежать превращения кода в «грязный» и неуправляемый, следуйте этим рекомендациям:

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

← На главную