Почему не заменяется макет печатной формы в расширении 1С и как это исправить?

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

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

Причины, по которым макет из расширения не подменяет типовой

Проанализируем ключевые факторы, из-за которых платформа 1С или типовые подсистемы игнорируют изменения в заимствованном макете:

  1. Режим «Способ расширения»: При заимствовании макета типа «Табличный документ» платформа по умолчанию присваивает свойству Способ расширения значение Объединять. В таком режиме система пытается склеить строки, колонки и области исходного макета с расширенным. Это часто приводит к непредсказуемым коллизиям, дублированию элементов либо полному игнорированию правок.
  2. Ограничения релиза платформы: Заимствование и полноценное замещение макетов поддерживаются начиная с определенных версий платформы 1С:Предприятие (с 8.3.14 при соответствующем режиме совместимости). Более того, до релиза 8.3.22 механизм замещения работал исключительно для табличных документов. Если база работает на более старой платформе или режиме совместимости, заимствование макета в расширение не сработает корректно на уровне метаданных.
  3. Приоритет пользовательских макетов БСП: Библиотека стандартных подсистем (БСП) содержит механизм «Макеты печатных форм». Если ранее этот макет хотя бы один раз открывался и сохранялся в режиме 1С:Предприятие, система сохранила его в служебный регистр сведений. Для БСП пользовательский макет всегда имеет наивысший приоритет, поэтому изменения из конфигуратора (как основной базы, так и расширения) попросту не доходят до вывода на печать.
  4. Кэширование данных сеанса: Механизмы печати типовых конфигураций кэшируют макеты и структуры параметров печати. При отладке и обновлении расширения печатная форма может продолжать формироваться из кэша до полного перезапуска сеанса пользователя.

Способ 1. Создание нового макета в расширении и явная подмена в коде

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

Разберем реализацию по шагам:

  1. Открываем исходный макет в основной конфигурации, выделяем все ячейки (комбинация Ctrl + A) и копируем их.
  2. В расширении конфигурации находим нужный объект (документ, обработку или справочник), добавляем новый макет с уникальным именем, например ПФ_MXL_Накладная_Расширение, и вставляем скопированное содержимое. Вносим все необходимые доработки: добавляем поле комментария, меняем параметры и форматирование ячеек.
  3. Заимствуем в расширение процедуру формирования печатных форм из модуля менеджера объекта (обычно это процедура Печать или вспомогательная функция формирования табличного документа) с аннотацией &Вместо или &ИзменениеИАвтоматика.
  4. В коде формирования печатной формы заменяем получение стандартного макета на вызов нашего добавленного макета из расширения.

Посмотрим на пример перехвата метода печати в модуле менеджера объекта:


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

    ТабличныйДокумент = Новый ТабличныйДокумент;
    ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_НАКЛАДНАЯ";

    // Заполнение областей макета данными
    ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
    ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
    ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");

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

        // Формирование табличной части и подвала
        // ...
    КонецЦикла;

    Возврат ТабличныйДокумент;
КонецФункции

Способ 2. Переключение свойства «Способ расширения» в режим «Замещать»

Если используется современная версия платформы (8.3.14 и выше с актуальным режимом совместимости), можно использовать штатный механизм замещения без создания дублирующих макетов.

Разберем правильный порядок действий:

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

Способ 3. Программная доработка макета «на лету» через директиву &После

Если требуется добавить лишь одну строку или изменить существующую область (например, вывести комментарий под шапкой), можно обойтись без полной подмены макета. Достаточно программно дописать данные в результирующий табличный документ после того, как отработает типовая печать.

Посмотрим на пример реализации с аннотацией &После:


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

Способ 4. Проверка и сброс пользовательских настроек макетов БСП

Если макет настроен верно, но печатная форма все равно не меняется, обязательно проверим состояние пользовательских макетов в режиме предприятия:

  1. Запускаем базу в режиме 1С:Предприятие под правами администратора.
  2. Переходим в раздел НСИ и администрирование → Печатные формы, отчеты и обработки → Макеты печатных форм.
  3. Находим в списке нужный документ и его макет.
  4. Если макет отмечен специальной пиктограммой или изменен вручную, выделяем его и нажимаем команду Использовать стандартный макет (или Отменить исправление). Это удалит сохраненную пользовательскую копию из служебного регистра, и система снова начнет считывать актуальный макет из метаданных и подключенного расширения.
← На главную