Как переопределить макет и процедуру печати в 1С с помощью расширения

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

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

Анализ механизмов печати в расширениях

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

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

Шаг 1: Подготовка макета в расширении

Первым делом мы должны добавить нужный документ и его макет в наше расширение. Выполним следующие действия:

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

Шаг 2: Перехват процедуры печати

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

Разберем пример кода в модуле менеджера расширения:


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

    // Если нужно сохранить формирование остальных типовых форм, вызываем основной код
    ПродолжитьВызов(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);

КонецПроцедуры

Шаг 3: Программная подмена макета

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

Посмотрим на пример перехвата функции в общем модуле через расширение:


&Вместо("МакетПечатнойФормы")
Функция Расш1_МакетПечатнойФормы(ПутьКМакету)
    
    // Проверяем, к какому макету идет обращение
    Если ПутьКМакету = "Документ.РеализацияТоваровУслуг.ПФ_MXL_Накладная" Тогда
        // Возвращаем макет из нашего расширения
        // Обратите внимание: имя макета в расширении должно быть доступно
        Возврат ПолучитьМакет("ПФ_MXL_Накладная_Моя"); 
    КонецЕсли;
    
    // Для всех остальных случаев продолжаем стандартное выполнение
    Возврат ПродолжитьВызов(ПутьКМакету);

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

Шаг 4: Работа с новыми областями и параметрами

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

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


// 1. Получаем макет из расширения
Макет = ПолучитьМакет("ИмяВашегоМакета");

// 2. Получаем нужную нам область
Область = Макет.ПолучитьОбласть("ВашПодвал");

// 3. Заполняем параметры области данными
Область.Параметры.ФИОИсполнителя = "Иванов И.И.";
Область.Параметры.ДатаПодписи = ТекущаяДата();

// 4. Выводим область в готовый табличный документ
// Предположим, ТабличныйДокумент уже содержит основной текст накладной
ТабличныйДокумент.Вывести(Область);

Важные нюансы и рекомендации

При работе с расширениями печати важно помнить о следующих моментах:

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

← На главную