Как обратиться к макету внешней печатной формы при вызове типовых процедур печати в 1С?

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

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

В чем причина ошибки и почему не работает путь к макету?

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


ЧастиПути = СтрЗаменить(ПолныйПутьКМакету, ".", Символы.ПС);

Если СтрЧислоСтрок(ЧастиПути) = 3 Тогда
    ПутьКМетаданным = СтрПолучитьСтроку(ЧастиПути, 1) + "." + СтрПолучитьСтроку(ЧастиПути, 2);
    ПутьКОбъектуМетаданных = СтрПолучитьСтроку(ЧастиПути, 3);
ИначеЕсли СтрЧислоСтрок(ЧастиПути) = 2 Тогда
    ПутьКМетаданным = СтрПолучитьСтроку(ЧастиПути, 1);
    ПутьКОбъектуМетаданных = СтрПолучитьСтроку(ЧастиПути, 2);
Иначе
    ВызватьИсключение НСтр("ru = 'Неверный формат полного пути к макету'");
КонецЕсли;

Далее подсистема печати пытается найти объект с помощью метода Метаданные.НайтиПоПолномуИмени(ПутьКМетаданным). И здесь кроется фундаментальное ограничение:

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

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

Способ 1. Адаптация кода формирования в модуле объекта ВПФ

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

Выясним алгоритм действий:

  1. В модуле объекта внешней печатной формы создаем стандартную экспортную процедуру Печать, требуемую стандартами БСП.
  2. Копируем основной алгоритм заполнения макета из модуля менеджера соответствующего документа (например, счета-фактуры) к себе в обработку.
  3. Заменяем вызов УправлениеПечатью.МакетПечатнойФормы(...) на прямое получение макета из контекста самой внешней обработки: Макет = ЭтотОбъект.ПолучитьМакет("ИмяВашегоМакета");
  4. При этом все вспомогательные вычисления (расчет сумм, получение контактной информации, склонение строк, структуры реквизитов контрагентов) не нужно дублировать — продолжаем вызывать типовые экспортные методы общих модулей конфигурации.

Способ 2. Объединение двух готовых табличных документов

Часто задача модификации сводится к тому, чтобы к одной типовой форме (например, счету-фактуре) «прилепить» второй документ (например, акт, протокол или накладную). Если сами макеты менять не требуется, а нужно лишь объединить две стандартные печатные формы в один документ, нет необходимости переносить код заполнения к себе.

Посмотрим на пример того, как получить два табличных документа через штатные механизмы и объединить их:


// Формируем первый документ стандартным методом
ТабДок1 = Документы.СчетФактураВыданный.ПечатьСчетаФактуры(МассивОбъектов);

// Формируем второй документ стандартным методом
ТабДок2 = Документы.РеализацияТоваровУслуг.ПечатьАкта(МассивОбъектов);

// Объединяем их в один результирующий документ
ТабДок1.ВывестиГоризонтальныйРазделительСтраниц();
ТабДок1.Вывести(ТабДок2);

// Возвращаем объединенный документ в коллекцию печатных форм

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

Способ 3. Использование расширения конфигурации

Если политика предприятия допускает использование расширений (.cfe), этот способ является наиболее чистым и современным с точки зрения архитектуры 1С:

  1. Макет становится частью метаданных. Если добавить макет в расширение или заимствовать документ и добавить макет туда, он получает полноценное имя в метаданных. К нему функция УправлениеПечатью.МакетПечатнойФормы сможет обратиться без каких-либо ошибок.
  2. Перехват через аннотации. С помощью директивы &Вместо или &ИзменениеИКонтроль в модуле менеджера перехватывается только получение макета, а весь алгоритм заполнения выполняется типовым кодом конфигурации, сохраняя простоту последующих обновлений.
← На главную