При разработке внешних печатных форм (ВПФ) для конфигураций на базе БСП (например, «1С:Бухгалтерия предприятия 3.0») разработчики нередко стремятся максимально задействовать существующий типовой функционал. Часто возникает желание вызвать стандартную процедуру формирования печатного документа из модуля менеджера, передав туда свой измененный макет. Однако при попытке указать путь к макету внешней обработки разработчики сталкиваются с непреодолимой ошибкой. Разберем, почему возникает эта проблема и какие существуют способы её правильного решения.
Проанализируем типовой механизм получения макетов, заложенный в подсистеме печати БСП. Стандартные процедуры печати документов обращаются к функции общего модуля УправлениеПечатью.МакетПечатнойФормы(ПолныйПутьКМакету). Внутри этой функции выполняется разбор переданной строки:
ЧастиПути = СтрЗаменить(ПолныйПутьКМакету, ".", Символы.ПС);
Если СтрЧислоСтрок(ЧастиПути) = 3 Тогда
ПутьКМетаданным = СтрПолучитьСтроку(ЧастиПути, 1) + "." + СтрПолучитьСтроку(ЧастиПути, 2);
ПутьКОбъектуМетаданных = СтрПолучитьСтроку(ЧастиПути, 3);
ИначеЕсли СтрЧислоСтрок(ЧастиПути) = 2 Тогда
ПутьКМетаданным = СтрПолучитьСтроку(ЧастиПути, 1);
ПутьКОбъектуМетаданных = СтрПолучитьСтроку(ЧастиПути, 2);
Иначе
ВызватьИсключение НСтр("ru = 'Неверный формат полного пути к макету'");
КонецЕсли;
Далее подсистема печати пытается найти объект с помощью метода Метаданные.НайтиПоПолномуИмени(ПутьКМетаданным). И здесь кроется фундаментальное ограничение:
ДополнительныеОтчетыИОбработки, она хранится в информационной базе в виде двоичных данных и подключается динамически в оперативную память."ВнешняяОбработка.Имя..." или "Справочник.ДополнительныеОтчетыИОбработки...", которую метод платформы НайтиПоПолномуИмени смог бы опознать как контейнер с макетом.ПользовательскиеМакетыПечати также жестко привязан к метаданным конфигурации и не позволяет зарегистрировать макет из изолированного файла обработки.Таким образом, передать макет из внешней обработки напрямую в типовую функцию УправлениеПечатью.МакетПечатнойФормы технически невозможно. Рассмотрим практические пути обхода этой проблемы.
Если решение обязательно должно поставляться в виде внешней обработки без изменения конфигурации, самым надежным путем является перенос логики вывода табличного документа в модуль объекта ВПФ.
Выясним алгоритм действий:
Печать, требуемую стандартами БСП.УправлениеПечатью.МакетПечатнойФормы(...) на прямое получение макета из контекста самой внешней обработки:
Макет = ЭтотОбъект.ПолучитьМакет("ИмяВашегоМакета");
Часто задача модификации сводится к тому, чтобы к одной типовой форме (например, счету-фактуре) «прилепить» второй документ (например, акт, протокол или накладную). Если сами макеты менять не требуется, а нужно лишь объединить две стандартные печатные формы в один документ, нет необходимости переносить код заполнения к себе.
Посмотрим на пример того, как получить два табличных документа через штатные механизмы и объединить их:
// Формируем первый документ стандартным методом
ТабДок1 = Документы.СчетФактураВыданный.ПечатьСчетаФактуры(МассивОбъектов);
// Формируем второй документ стандартным методом
ТабДок2 = Документы.РеализацияТоваровУслуг.ПечатьАкта(МассивОбъектов);
// Объединяем их в один результирующий документ
ТабДок1.ВывестиГоризонтальныйРазделительСтраниц();
ТабДок1.Вывести(ТабДок2);
// Возвращаем объединенный документ в коллекцию печатных форм
Этот подход гарантирует, что при обновлении типовой конфигурации логика заполнения обоих документов не сломается и макеты останутся актуальными законодательству.
Если политика предприятия допускает использование расширений (.cfe), этот способ является наиболее чистым и современным с точки зрения архитектуры 1С:
УправлениеПечатью.МакетПечатнойФормы сможет обратиться без каких-либо ошибок.&Вместо или &ИзменениеИКонтроль в модуле менеджера перехватывается только получение макета, а весь алгоритм заполнения выполняется типовым кодом конфигурации, сохраняя простоту последующих обновлений.