В практике разработчика 1С часто возникает задача выноса стандартного функционала печати во внешнюю печатную форму (ВПФ). Особенно это актуально для таких конфигураций, как УПП 1.3, где внесение изменений непосредственно в конфигурацию затрудняет последующие обновления. Рассмотрим ситуацию, когда нам необходимо взять Общий макет, используемый сразу в нескольких документах, и превратить его во внешнюю форму, добавив или изменив логику заполнения параметров.
Проанализируем ситуацию: у нас есть общий макет (например, накладная на отпуск материалов), который вызывается из разных документов. Нам нужно создать внешнюю обработку, которая будет не просто содержать этот макет, но и «умным» способом использовать существующий код заполнения, чтобы не копировать сотни строк запросов и условий. Основная сложность заключается в том, что макет содержит Параметры, которые должны заполняться данными из информационной базы.
Разберем первый, самый простой технический шаг. Если макет в конфигурации является общим, мы можем обратиться к нему напрямую из программного кода внешней обработки. Для этого используется метод ПолучитьОбщийМакет(). Это позволяет не копировать сам макет в обработку физически, если вы не планируете менять его визуальную структуру.
Посмотрим на пример кода в модуле объекта внешней печатной формы:
Функция Печать() Экспорт
// Получаем макет из конфигурации
Макет = ПолучитьОбщийМакет("М11");
// Создаем новый табличный документ
ТабДокумент = Новый ТабличныйДокумент;
ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_М11";
// Здесь будет логика заполнения
ЗаполнитьПараметрыМакета(ТабДокумент, Макет);
Возврат ТабДокумент;
КонецФункции
Однако, как справедливо замечено в обсуждении, если нам нужно внести изменения в сам макет (добавить колонки или изменить шрифты), его все же придется скопировать во внешнюю обработку. В этом случае мы будем использовать ЭтотОбъект.ПолучитьМакет("ИмяМакета").
Выясним причину, почему простое копирование кода — не всегда лучший вариант. В 1С:УПП 1.3 логика печати часто скрыта в модулях объектов документов или в общих модулях (например, УниверсальныеМеханизмы). Чтобы сделать все «по уму», проанализируем, как штатно вызывается печать.
Рассмотрим вариант вызова экспортных процедур. Если в конфигурации процедура заполнения макета вынесена в общий модуль и имеет модификатор Экспорт, мы можем вызвать ее из нашей ВПФ, передав свой макет в качестве параметра. Это идеальный вариант, так как основной код запроса остается в конфигурации и поддерживается вендором.
Если же код находится в модуле объекта документа, воспользуемся следующей схемой:
Печать(), которая является точкой входа.Структуру или ТаблицуЗначений с данными для печати.Разберем возможность автоматизации процесса. Существует Конструктор внешних печатных форм (иногда его называют «Конструктор ВПФ NEW»). Это специализированные обработки, которые умеют «вытягивать» макет и связанный с ним код печати из метаданных и упаковывать их в готовый файл .epf.
Посмотрим, как это упрощает работу:
Печать() в модуле документа.ДополнительныеВнешниеПечатныеФормы.Проанализируем ситуацию, когда вам нужно изменить лишь пару параметров в штатном макете. Вместо того чтобы переписывать всю логику, можно применить метод «пост-обработки».
Рассмотрим алгоритм:
ТабличныйДокумент.Этот способ позволяет избежать копирования кода заполнения вовсе. Мы работаем уже с результатом, который выдала система, и «дошлифовываем» его под свои нужды.
// Пример модификации готового документа
ТабДокумент = УниверсальныеМеханизмы.НапечататьВнешнююФорму(СсылкаНаОбъект);
Область = ТабДокумент.НайтиТекст("Итого:");
Если Область <> Неопределено Тогда
// Добавляем свои данные рядом с итогом
ТабДокумент.Область(Область.Верх, Область.Лево + 1).Текст = "Дополнительный параметр";
КонецЕсли;
Если ваша задача — превратить не просто макет, а целый отчет или обработку во внешние, воспользуйтесь стандартной возможностью конфигуратора. В дереве метаданных нажмите правой кнопкой мыши на нужный объект и выберите пункт «Сохранить как внешнюю обработку, отчет...». Это создаст файл, который можно редактировать отдельно от основной базы. Обратный процесс (загрузка внешней обработки в конфигурацию) выполняется аналогично через замену объекта.
Для того чтобы преобразовать общий макет во внешнюю форму «по уму», придерживайтесь следующего плана: сначала проверьте возможность использования штатных экспортных процедур заполнения; затем рассмотрите вариант программной модификации уже сформированного документа; и только в крайнем случае прибегайте к полному копированию кода заполнения, используя инструменты автоматизации, чтобы не упустить важные зависимости и вспомогательные функции.