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