Как преобразовать общий макет и логику его заполнения во внешнюю печатную форму

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

В практике разработчика 1С часто возникает задача выноса стандартного функционала печати во внешнюю печатную форму (ВПФ). Особенно это актуально для таких конфигураций, как УПП 1.3, где внесение изменений непосредственно в конфигурацию затрудняет последующие обновления. Рассмотрим ситуацию, когда нам необходимо взять Общий макет, используемый сразу в нескольких документах, и превратить его во внешнюю форму, добавив или изменив логику заполнения параметров.

Анализируем поставленную задачу

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

Способ 1: Получение общего макета программным путем

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

Посмотрим на пример кода в модуле объекта внешней печатной формы:


Функция Печать() Экспорт
    // Получаем макет из конфигурации
    Макет = ПолучитьОбщийМакет("М11");
    
    // Создаем новый табличный документ
    ТабДокумент = Новый ТабличныйДокумент;
    ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_М11";
    
    // Здесь будет логика заполнения
    ЗаполнитьПараметрыМакета(ТабДокумент, Макет);
    
    Возврат ТабДокумент;
КонецФункции

Однако, как справедливо замечено в обсуждении, если нам нужно внести изменения в сам макет (добавить колонки или изменить шрифты), его все же придется скопировать во внешнюю обработку. В этом случае мы будем использовать ЭтотОбъект.ПолучитьМакет("ИмяМакета").

Способ 2: Перенос логики заполнения без «костылей»

Выясним причину, почему простое копирование кода — не всегда лучший вариант. В 1С:УПП 1.3 логика печати часто скрыта в модулях объектов документов или в общих модулях (например, УниверсальныеМеханизмы). Чтобы сделать все «по уму», проанализируем, как штатно вызывается печать.

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

Если же код находится в модуле объекта документа, воспользуемся следующей схемой:

  1. Создаем внешнюю обработку и добавляем в нее макет (копированием из общих макетов).
  2. В модуле обработки создаем функцию Печать(), которая является точкой входа.
  3. Вместо полного переписывания запросов, попробуем найти в конфигурации функцию, которая возвращает Структуру или ТаблицуЗначений с данными для печати.
  4. Если такой функции нет, копируем только часть кода, отвечающую за формирование данных, и адаптируем ее.

Способ 3: Использование конструкторов и инструментов разработчика

Разберем возможность автоматизации процесса. Существует Конструктор внешних печатных форм (иногда его называют «Конструктор ВПФ NEW»). Это специализированные обработки, которые умеют «вытягивать» макет и связанный с ним код печати из метаданных и упаковывать их в готовый файл .epf.

Посмотрим, как это упрощает работу:

Практические советы по работе с параметрами

Проанализируем ситуацию, когда вам нужно изменить лишь пару параметров в штатном макете. Вместо того чтобы переписывать всю логику, можно применить метод «пост-обработки».

Рассмотрим алгоритм:

  1. Внешняя форма вызывает штатную процедуру печати документа.
  2. Получает готовый ТабличныйДокумент.
  3. Программно находит нужные области или ячейки (например, по тексту или имени области).
  4. Заменяет значения параметров или добавляет новые строки/колонки.
  5. Возвращает модифицированный документ пользователю.

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


// Пример модификации готового документа
ТабДокумент = УниверсальныеМеханизмы.НапечататьВнешнююФорму(СсылкаНаОбъект);
Область = ТабДокумент.НайтиТекст("Итого:");
Если Область <> Неопределено Тогда
    // Добавляем свои данные рядом с итогом
    ТабДокумент.Область(Область.Верх, Область.Лево + 1).Текст = "Дополнительный параметр";
КонецЕсли;

Как быстро сохранить обработку или отчет как внешние

Если ваша задача — превратить не просто макет, а целый отчет или обработку во внешние, воспользуйтесь стандартной возможностью конфигуратора. В дереве метаданных нажмите правой кнопкой мыши на нужный объект и выберите пункт «Сохранить как внешнюю обработку, отчет...». Это создаст файл, который можно редактировать отдельно от основной базы. Обратный процесс (загрузка внешней обработки в конфигурацию) выполняется аналогично через замену объекта.

Резюме

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

← На главную