К статье
Практический материал

Разработка и Конфигурация · 11 мин

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

Как получить макет внешней обработки в 1С 8: методы ПолучитьМакет и ЭтотОбъект.ПолучитьМакет, работа через ЭтотОбъект, типичные ошибки и примеры кода.

При разработке внешних обработок и отчётов для 1С:Предприятие 8 часто требуется обратиться к макету — табличному документу, схеме компоновки данных, двоичным данным или текстовому шаблону, хранящемуся внутри самой обработки. Главная особенность в том, что стандартный вызов ПолучитьМакет(), привычный по работе с объектами конфигурации, во внешней обработке ведёт себя иначе, и это становится источником ошибок у начинающих разработчиков.

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

Ниже разобраны все рабочие способы получения макета: из модуля объекта обработки, из модуля формы, из внешнего кода, а также особенности работы с разными типами макетов и типичные ошибки, которые приводят к сообщению «Макет не найден».

Где хранится макет внешней обработки и как его создать

Макет добавляется в структуру внешней обработки в конфигураторе. Откройте файл обработки (.epf или .erf), в дереве объектов найдите ветку «Макеты» и через контекстное меню выберите «Добавить». Конструктор предложит выбрать тип макета: табличный документ, схема компоновки данных, текстовый документ, двоичные данные, HTML-документ и другие варианты.

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

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

Получение макета в модуле объекта обработки

Самый простой сценарий — обращение к макету из модуля объекта самой обработки. Здесь доступен контекст ЭтотОбъект, и вызов выглядит так:

Функция ПолучитьТабличныйДокумент() Экспорт

Макет = ЭтотОбъект.ПолучитьМакет("МакетПечати");

Возврат Макет;

КонецФункции

Метод возвращает значение, тип которого зависит от типа макета: для табличного документа — объект ТабличныйДокумент, для схемы компоновки — СхемаКомпоновкиДанных, для двоичных данных — ДвоичныеДанные, для текстового макета — ТекстовыйДокумент. Дальнейшая работа (заполнение параметров, вывод областей) выполняется уже с этим объектом.

Обратите внимание: в толстом клиенте в модуле объекта иногда можно вызвать просто ПолучитьМакет("ИмяМакета") без ЭтотОбъект, и код сработает. Однако при переносе в тонкий клиент или веб-клиент такой вызов может перестать работать. Явное указание ЭтотОбъект.ПолучитьМакет() — безопасная универсальная форма, которую стоит использовать всегда.

1c
Макет = ЭтотОбъект.ПолучитьМакет("МакетПечати");
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьШапка.Параметры.НомерДокумента = НомерДок;
ТабДок.Вывести(ОбластьШапка);

Получение макета из модуля формы обработки

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

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

&НаСервере

Функция ПолучитьМакетНаСервере()

ОбъектОбработки = РеквизитФормыВЗначение("Объект");

Макет = ОбъектОбработки.ПолучитьМакет("МакетПечати");

Возврат Макет;

КонецФункции

Табличный документ при этом можно вернуть на клиент и показать пользователю, а вот схему компоновки данных передавать между сервером и клиентом нельзя — с ней работают только на сервере. Учитывайте это при проектировании отчётов на СКД во внешних обработках.

Получение макета из внешнего кода

Когда к макету нужно обратиться не из самой обработки, а из другого места — например, из общего модуля конфигурации или из команды печати — сначала создают объект обработки, а затем вызывают его метод.

Если обработка подключена к информационной базе (зарегистрирована в справочнике дополнительных отчётов и обработок или открыта как внешняя), используют менеджер внешних обработок:

ОбработкаОбъект = ВнешниеОбработки.Создать("C:\Обработки\ПечатьЗаказа.epf", Ложь);

Макет = ОбработкаОбъект.ПолучитьМакет("МакетПечати");

Второй параметр метода Создать() определяет режим безопасности: Ложь — обычный режим, Истина — безопасный режим с ограничением привилегированных операций. Для обработок из недоверенных источников используйте безопасный режим.

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

Порядок действий
  1. 1
    Создайте макет в ветке «Макеты» внешней обработки и запомните его имя
  2. 2
    В модуле объекта или серверной процедуре формы вызовите ЭтотОбъект.ПолучитьМакет("ИмяМакета")
  3. 3
    Из внешнего кода создайте объект: ВнешниеОбработки.Создать(ПутьКФайлу, Ложь)
  4. 4
    Вызовите ПолучитьМакет у созданного объекта и работайте с результатом по его типу
  5. 5
    Проверьте результат: табличный документ выводится, СКД компонуется без ошибок

Особенности для разных типов макетов

Тип возвращаемого значения определяет дальнейшие действия. Для табличного документа типовой сценарий — получение областей по именам, заполнение параметров и вывод в итоговый документ. Имена областей задаются в свойствах ячеек макета в конфигураторе.

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

Макеты типа «Двоичные данные» часто используют для хранения шаблонов Word, Excel или картинок. Полученные двоичные данные сохраняют во временный файл методом Записать() либо передают напрямую в COM-объект или пакет OpenXML. Текстовые макеты удобны для хранения запросов, шаблонов XML и JSON.

Сравнение вариантов

ЭтотОбъект.ПолучитьМакет()

Подходит внутри модуля объекта и серверных процедур формы. Ограничение: недоступен на клиенте управляемой формы.

ВнешниеОбработки.Создать().ПолучитьМакет()

Для обращения из внешнего кода к файлу .epf. Ограничение: нужен путь к файлу, работает не во всех контекстах клиента.

Обработки.Имя.Создать().ПолучитьМакет()

Для обработок, встроенных в конфигурацию. Не подходит для файлов .epf, не подключённых к базе.

Типичные ошибки и способы их устранения

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

Вторая группа ошибок связана с контекстом выполнения: попытка получить макет на клиенте управляемой формы, вызов серверной процедуры без директивы &НаСервере, передача несериализуемых типов (например, схемы компоновки) с сервера на клиент. Диагностируется по тексту ошибки о недоступности метода в данном контексте.

Третья группа — проблемы с безопасностью и правами. В файловом режиме с ограниченными правами чтение файла обработки может быть запрещено, а в безопасном режиме часть операций с полученным макетом (запись файлов, COM-объекты) окажется недоступна. Проверяйте права пользователя и режим создания обработки.

Типичные ошибки
01
Вызов ПолучитьМакет() без ЭтотОбъект в модуле формы — платформа ищет макет в конфигурации и выдаёт «Макет не найден»
02
Опечатка в имени макета или лишний пробел — та же ошибка; сверяйте имя с деревом обработки
03
Получение макета в клиентской процедуре управляемой формы — ошибка контекста; переносите вызов на сервер
04
Передача СхемыКомпоновкиДанных с сервера на клиент — тип не сериализуется, компонуйте отчёт на сервере

Проверка результата и отладка

Убедиться, что макет получен корректно, можно простой проверкой: вывести тип значения через ТипЗнч(Макет) в сообщение или посмотреть переменную в отладчике. Для табличного документа дополнительно проверьте высоту таблицы — пустой макет вернёт документ нулевой высоты, что укажет на проблему ещё до вывода областей.

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

Контрольные точки

Как проверить результат

Тип возвращаемого значения
Норма

ТабличныйДокумент, СхемаКомпоновкиДанных или иной ожидаемый тип

Тревожный признак

Неопределено или ошибка «Макет не найден»

Содержимое табличного документа
Норма

ВысотаТаблицы больше нуля, области доступны по именам

Тревожный признак

Пустой документ, область не найдена

Контекст выполнения
Норма

Вызов в модуле объекта или серверной процедуре

Тревожный признак

Ошибка о недоступности метода на клиенте

FAQ

Почему ПолучитьМакет() без ЭтотОбъект выдаёт «Макет не найден»?

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

Как получить макет внешней обработки в управляемой форме?

На клиенте объект обработки недоступен, поэтому создайте серверную процедуру с директивой &НаСервере, получите объект через РеквизитФормыВЗначение("Объект") и вызовите у него ПолучитьМакет(). Табличный документ можно вернуть на клиент для показа.

Можно ли получить макет обработки, не создавая её объект?

Нет. Макет — часть объекта обработки, поэтому сначала нужно получить сам объект: через ЭтотОбъект внутри обработки, через ВнешниеОбработки.Создать() для файла .epf или через Обработки.Имя.Создать() для обработки конфигурации.

Что вернёт ПолучитьМакет для макета типа «Двоичные данные»?

Метод вернёт значение типа ДвоичныеДанные. Его можно записать во временный файл методом Записать(), поместить во временное хранилище или передать в механизмы работы с файлами, например для распаковки шаблона Word или Excel.

Работает ли ПолучитьМакет в безопасном режиме?

Да, получение макета разрешено в безопасном режиме — это операция чтения внутреннего ресурса обработки. Ограничения коснутся дальнейших действий: записи файлов, COM-объектов и доступа к файловой системе.

Как получить макет внешнего отчёта на СКД?

Точно так же: в модуле объекта отчёта вызовите ЭтотОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных"). Полученную схему передайте в компоновщик макета компоновки данных и выполняйте формирование отчёта на сервере.

Итог

Что важно запомнить

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