При адаптации типовых конфигураций под нужды бизнеса одной из частых задач является доработка стандартных печатных форм: добавление реквизита, вывод комментария, смена шапки или подвала документа. Чтобы сохранить основную конфигурацию на типовой поддержке, разработчики выносят изменения в расширение. Однако на практике нередко возникает ситуация: макет заимствован в расширение, правки внесены, но при формировании печатной формы программа упорно выводит стандартный вид без изменений. Выясним причину такого поведения платформы и подробно разберем все способы решения проблемы.
Проанализируем ключевые факторы, из-за которых платформа 1С или типовые подсистемы игнорируют изменения в заимствованном макете:
Способ расширения значение Объединять. В таком режиме система пытается склеить строки, колонки и области исходного макета с расширенным. Это часто приводит к непредсказуемым коллизиям, дублированию элементов либо полному игнорированию правок.1С:Предприятие, система сохранила его в служебный регистр сведений. Для БСП пользовательский макет всегда имеет наивысший приоритет, поэтому изменения из конфигуратора (как основной базы, так и расширения) попросту не доходят до вывода на печать.Рассмотрим основной способ, предложенный в обсуждении. Это наиболее надежный и универсальный вариант, который работает независимо от версии платформы и режима слияния макетов. Суть метода заключается в том, чтобы не заимствовать исходный макет, а добавить в расширение свой собственный макет с новым именем и перенаправить алгоритм печати на него.
Разберем реализацию по шагам:
Ctrl + A) и копируем их.ПФ_MXL_Накладная_Расширение, и вставляем скопированное содержимое. Вносим все необходимые доработки: добавляем поле комментария, меняем параметры и форматирование ячеек.Печать или вспомогательная функция формирования табличного документа) с аннотацией &Вместо или &ИзменениеИАвтоматика.Посмотрим на пример перехвата метода печати в модуле менеджера объекта:
&Вместо("СформироватьПечатнуюФорму")
Функция Расш1_СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати, КомплектыПечати = Неопределено)
// Получаем макет, добавленный непосредственно в расширение
Макет = УправлениеПечатью.ИнициализироватьМакетПечатнойФормы(ЭтотОбъект, "ПФ_MXL_Накладная_Расширение");
// Если используется прямое получение табличного документа объекта:
// Макет = ПолучитьМакет("ПФ_MXL_Накладная_Расширение");
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_НАКЛАДНАЯ";
// Заполнение областей макета данными
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
Для Каждого СсылкаНаДокумент Из МассивОбъектов Цикл
// Заполняем параметры шапки, включая добавленный комментарий
ОбластьШапка.Параметры.Заполнить(СсылкаНаДокумент);
ОбластьШапка.Параметры.Комментарий = СсылкаНаДокумент.Комментарий;
ТабличныйДокумент.Вывести(ОбластьШапка);
// Формирование табличной части и подвала
// ...
КонецЦикла;
Возврат ТабличныйДокумент;
КонецФункции
Если используется современная версия платформы (8.3.14 и выше с актуальным режимом совместимости), можно использовать штатный механизм замещения без создания дублирующих макетов.
Разберем правильный порядок действий:
Добавить в расширение.Способ расширения и переключаем его со значения Объединять на значение Замещать.Если требуется добавить лишь одну строку или изменить существующую область (например, вывести комментарий под шапкой), можно обойтись без полной подмены макета. Достаточно программно дописать данные в результирующий табличный документ после того, как отработает типовая печать.
Посмотрим на пример реализации с аннотацией &После:
&После("Печать")
Процедура Расш1_Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода)
ПечатнаяФорма = УправлениеПечатью.СформированныйПечатныйДокумент(КоллекцияПечатныхФорм, "Накладная");
Если ПечатнаяФорма <> Неопределено Тогда
// Находим нужную область или ячейку в готовом документе
ОбластьПоиска = ПечатнаяФорма.НайтиТекст("[Комментарий]");
Если ОбластьПоиска <> Неопределено Тогда
Для Каждого СсылкаНаОбъект Из МассивОбъектов Цикл
ОбластьПоиска.Текст = СсылкаНаОбъект.Комментарий;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Если макет настроен верно, но печатная форма все равно не меняется, обязательно проверим состояние пользовательских макетов в режиме предприятия:
1С:Предприятие под правами администратора.