Как получить путь к макету внешней печатной формы в 1С 8.3

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

При разработке внешних печатных форм в среде 1С:Предприятие 8.3 (особенно в конфигурациях на базе БСП, таких как УНФ, ERP или Бухгалтерия) разработчики часто сталкиваются с логической ловушкой. Попытка использовать стандартные механизмы получения макета через строку пути (например, "Документ.СчетНаОплату.ПФ_MXL_Счет") приводит к ошибке, если макет находится внутри внешней обработки. Рассмотрим подробнее, почему это происходит и как правильно организовать работу с макетами в таких случаях.

Почему стандартный путь к макету не работает во внешней обработке

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

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

Решение 1: Прямое получение макета внутри обработки

Самый простой и правильный способ получить макет, находясь в контексте модуля внешней обработки — это использование встроенных методов объекта. Выясним, как это реализовать программно. Если код выполняется в модуле объекта (что типично для процедур печати), нам достаточно обратиться к ЭтотОбъект.

Рассмотрим пример кода для получения макета на стороне сервера:


// В модуле объекта внешней обработки
Функция ПолучитьТабличныйДокументМакета()
    
    // Прямое обращение к макету по его имени в структуре обработки
    Макет = ЭтотОбъект.ПолучитьМакет("ИмяВашегоМакета");
    
    // Далее идет логика заполнения табличного документа
    ТабДок = Новый ТабличныйДокумент;
    // ...
    Возврат ТабДок;
    
КонецФункции

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


&НаСервере
Функция ПолучитьМакетНаСервере()
    
    // Преобразуем реквизит формы "Объект" в прикладной объект внешней обработки
    ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
    
    // Теперь у нас есть доступ к методу ПолучитьМакет()
    Макет = ОбработкаОбъект.ПолучитьМакет("ПФ_MXL_СчетНаОплату");
    
    Возврат Макет;
    
КонецФункции

Решение 2: Адаптация типовых функций заполнения (Copy-Paste логика)

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

Рассмотрим шаги по адаптации кода для внешней печатной формы, особенно это актуально для публикации в 1С:Фреш:

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

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

Особенности для работы в 1С:Фреш (Облачные версии)

При подготовке формы для аудита в 1С:Фреш крайне важно соблюдать требования безопасности и автономности. Проанализируем ключевые моменты:

Программный перебор всех макетов обработки

Иногда требуется узнать имена макетов динамически, не прописывая их жестко в коде. Разберем, как обратиться к метаданным самого объекта обработки:


Процедура ВывестиСписокМакетов()
    
    МетаданныеОбъекта = ЭтотОбъект.Метаданные();
    
    Для Каждого ТекущийМакет Из МетаданныеОбъекта.Макеты Цикл
        Сообщить("Найден макет: " + ТекущийМакет.Имя + " Тип: " + ТекущийМакет.ТипМакета);
    КонецЦикла;
    
КонецПроцедуры

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

Резюме и рекомендации

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

  1. Использовать метод ЭтотОбъект.ПолучитьМакет("Имя") в модуле объекта.
  2. Передавать полученный объект макета (а не его имя) в функции заполнения.
  3. Если типовые функции заполнения жестко привязаны к путям метаданных, переносить их логику в модуль обработки, адаптируя под работу с внутренним макетом.

Такой подход гарантирует стабильную работу вашей печатной формы как в локальных версиях 1С:УНФ, так и в облачных сервисах.

← На главную