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