Как объединить несколько внешних печатных форм в одну и программно управлять макетами в 1С 8.2

Программист 1С:Управление торговлей
← На главную

При активной работе в «1С:Управление торговлей 10.3» или других конфигурациях на платформе 8.2 с обычными формами часто возникает ситуация, когда внешних печатных форм (ВПФ) становится слишком много. Часто они отличаются лишь незначительными деталями: наличием логотипа, цветом заголовка или дополнительной надписью. Содержать десяток почти одинаковых файлов .epf крайне неудобно, так как любое изменение в логике расчета данных приходится тиражировать во все файлы. Рассмотрим, как объединить все варианты в одну универсальную обработку и научить её переключаться между макетами.

Анализ механизма подключения внешних печатных форм

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

Главная задача при объединении форм — передать в этот модуль информацию о том, какой именно вариант печати выбрал пользователь. В конфигурациях, использующих УниверсальныеМеханизмы, предусмотрен штатный способ передачи контекста вызова через специальные реквизиты обработки.

Шаг 1: Подготовка внешней обработки (создание реквизита)

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

Выясним, как правильно подготовить объект:

  1. Откроем внешнюю обработку в конфигураторе.
  2. В дереве метаданных объекта перейдем в раздел Реквизиты.
  3. Добавим новый реквизит с именем ДополнительныеПараметры.
  4. Установим тип значения для этого реквизита — Произвольный (или Структура).

Теперь, когда система будет инициализировать вашу обработку, она автоматически заполнит этот реквизит данными. Если вы регистрируете одну и ту же обработку в справочнике под разными именами (например, «ТОРГ-12 с логотипом» и «ТОРГ-12 без логотипа»), система передаст название выбранного пункта в эту структуру.

Шаг 2: Реализация логики выбора макета в коде

Теперь проанализируем, как использовать полученные данные внутри модуля объекта. В функции Печать() мы можем проверить содержимое реквизита ДополнительныеПараметры и на основании этого решить, какой макет загружать или какие области выводить. Рассмотрим пример кода:


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

    ТабДокумент = Новый ТабличныйДокумент;
    
    // Выбираем макет в зависимости от названия
    Если Найти(ИмяВыбраннойФормы, "с логотипом") > 0 Тогда
        Макет = ПолучитьМакет("МакетСЛоготипом");
    Иначе
        Макет = ПолучитьМакет("ОсновнойМакет");
    КонецЕсли;

    // Далее идет стандартный код формирования печатной формы
    // ...
    Возврат ТабДокумент;

КонецФункции

Такой подход позволяет хранить в одной обработке неограниченное количество макетов. Вы просто добавляете их на вкладку «Макеты» вашей обработки и вызываете нужный через ПолучитьМакет().

Шаг 3: Динамическое изменение оформления (логотип и шрифты)

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

Разберем ситуацию, с которой часто сталкиваются программисты: как программно изменить шрифт в области макета. Важно помнить, что обращение к ТекущаяОбласть в процессе формирования документа может вернуть неочевидные результаты, так как фокус может стоять не на той ячейке. Правильнее обращаться к конкретным координатам области.

Посмотрим на пример управления шрифтом:


ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");

// Если нужно изменить шрифт в конкретной ячейке области (например, первая строка, первая колонка)
// Используем адресацию R1C1 (строка 1, колонка 1) внутри полученной области
ОбластьЗаголовок.Область("R1C1").Шрифт = Новый Шрифт(ОбластьЗаголовок.Область("R1C1").Шрифт, , 14, Истина);

// Если нужно скрыть картинку (логотип)
Если Не НужноПечататьЛоготип Тогда
    Попытка
        ОбластьЗаголовок.Рисунки.Логотип.Видимость = Ложь;
    Исключение
        // Рисунок не найден или уже скрыт
    КонецПопытки;
КонецЕсли;

ТабДокумент.Вывести(ОбластьЗаголовок);

Обратите внимание: при использовании метода Область("R1C1") нумерация строк и колонок идет относительно самой области, а не всего макета. Это позволяет точно попадать в нужные ячейки даже в сложных печатных формах.

Шаг 4: Подключение в интерфейсе 1С

Чтобы всё заработало, нам нужно правильно зарегистрировать обработку в базе данных. Выполним следующие действия:

  1. Зайдем в меню Сервис — Дополнительные отчеты и обработки — Дополнительные внешние печатные формы.
  2. Создадим новую запись и выберем наш файл .epf.
  3. В табличной части «Принадлежность печатной формы» добавим столько строк, сколько вариантов печати мы хотим видеть в меню.
  4. В каждой строке укажем один и тот же объект (например, документ «Реализация товаров и услуг»), но в колонке «Представление объекта» напишем разные названия: «ТОРГ-12 (универсальная)», «ТОРГ-12 (без реквизитов)» и т.д.

При выборе любого из этих пунктов будет запускаться одна и та же обработка, но в ДополнительныеПараметры.Наименование будет попадать именно тот текст, который вы написали в «Представлении объекта». Это и есть ключ к управлению логикой внутри кода.

Дополнительные советы по оптимизации

Рассмотрим еще несколько важных моментов, которые помогут сделать вашу печатную форму профессиональной:

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

← На главную