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

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

Как получить макет обработки в 1С: ПолучитьМакет и практические примеры

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

Макет внешней обработки в 1С — это ресурс, хранящийся внутри файла .epf: табличный документ, схема компоновки данных, двоичные данные, HTML, текст или ActiveX-компонент. Чтобы использовать его в коде, нужно получить макет программно. Способ зависит от того, где выполняется код: в модуле самой обработки, в модуле формы или во внешнем контексте.

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

Ниже разобраны все рабочие сценарии: получение макета из модуля объекта и формы, работа с табличным документом и двоичными данными, обращение к макету извне, типичные ошибки компиляции и способы проверить результат.

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

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

Имя макета задаётся при создании и именно по нему выполняется обращение из кода. Имя чувствительно к регистру только формально — платформа ищет макет без учёта регистра, но лучше использовать точное написание, чтобы не путаться при отладке. Если макет переименовали, все вызовы ПолучитьМакет со старым именем начнут вызывать исключение.

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

Самый простой случай — код находится в модуле объекта внешней обработки. Здесь доступен контекст объекта, и макет получается одним вызовом:

Функция ПолучитьПечатнуюФорму() Экспорт

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

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

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

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

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

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

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

В модуле формы прямого доступа к ПолучитьМакет нет — форма и объект обработки это разные контексты. Нужно сначала получить объект обработки, а уже через него обратиться к макету. В обычных формах для этого есть метод ОбъектОбработки(), в управляемых формах — получение объекта через реквизит формы.

// Обычная форма

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

// Управляемая форма (реквизит Объект типа ВнешняяОбработкаОбъект)

&НаСервере

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

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

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

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

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

Распространённый приём — вынести всю работу с макетом в экспортные функции модуля объекта, а из формы только вызывать их. Так код формы остаётся тонким, а логику проще тестировать и переносить.

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

Работа с разными типами макетов

Табличный документ

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

Двоичные данные и файлы

Макет типа «Двоичные данные» используют для хранения файлов внутри обработки: шаблонов Word и Excel, картинок, внешних компонент. ПолучитьМакет вернёт адрес во временном хранилище, а не сами данные:

Адрес = ЭтотОбъект.ПолучитьМакет("ШаблонДоговора");

ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);

ДвоичныеДанные.Записать(ПутьКФайлу);

Адрес действует в рамках текущего сеанса и вызова. Если данные нужны позже, извлеките их сразу и сохраните в файл или в собственное хранилище значения.

Схема компоновки данных

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

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

Макет в обработке

Подходит для внешних обработок: всё в одном файле .epf, легко распространять. Ограничение — макет правится только в конфигураторе.

Макет в конфигурации (общие макеты)

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

Внешний файл-шаблон

Подходит, когда шаблон часто меняют пользователи. Минус — нужно контролировать наличие файла и его версию.

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

Если обработку открывают программно — например, из другой обработки или через Выполнить в фоновом задании — макет получают через созданный объект. Для внешней обработки объект создаётся методом ВнешниеОбработки.Создать с указанием пути к файлу или имени подключённой обработки:

Обработка = ВнешниеОбработки.Создать(ПутьКФайлу, Ложь);

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

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

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

Ошибка «Макет не найден» почти всегда означает опечатку в имени или то, что макет создан в другом объекте — например, в конфигурации, а не в обработке. Проверьте закладку «Макеты» и точное написание имени. Вторая частая причина — вызов ПолучитьМакет в модуле формы без получения объекта обработки: компилятор выдаст «Процедура или функция с указанным именем не определена».

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

Ещё одна проблема — попытка получить макет на клиенте в управляемой форме. Перенесите вызов в серверную процедуру с директивой &НаСервере. Для тонкого и веб-клиента это обязательное условие.

Типичные ошибки
01
Вызов ПолучитьМакет в модуле формы без получения объекта обработки — метод не определён, код не компилируется
02
Опечатка в имени макета или области — исключение «Макет не найден» в момент выполнения
03
Использование адреса временного хранилища после завершения серверного вызова — данные уже удалены
04
Попытка получить макет на клиенте в управляемой форме — метод недоступен на тонком клиенте
05
Переименование макета без правки всех вызовов ПолучитьМакет — обработка падает у пользователей

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

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

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

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

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

Табличный документ
Норма

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

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

Исключение «Область не найдена» или пустые поля вместо данных

Двоичные данные
Норма

Файл записывается и открывается в целевой программе

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

Ошибка доступа к хранилищу или повреждённый файл

Вызов из формы
Норма

Код в серверной процедуре, объект получен через РеквизитФормыВЗначение

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

Ошибка компиляции или «метод не обнаружен»

Часто задаваемые вопросы

Чем ПолучитьМакет обработки отличается от ПолучитьОбщийМакет?

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

Можно ли получить макет на тонком клиенте?

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

Почему ПолучитьМакет вернул строку, а не табличный документ?

Так происходит с макетами типа «Двоичные данные», «ActiveDocument» и некоторыми другими: метод возвращает адрес во временном хранилище. Извлеките содержимое через ПолучитьИзВременногоХранилища в том же серверном вызове.

Как получить макет обработки, подключённой через БСП?

Сначала получите объект обработки через ДополнительныеОтчетыИОбработки.ПолучитьОбъектВнешнейОбработки по ссылке на элемент справочника, затем вызовите ПолучитьМакет у этого объекта, как в модуле обычной обработки.

Что делать, если макет нужно менять без пересборки обработки?

Вынесите шаблон во внешний файл и загружайте его методом ТабличныйДокумент.Прочитать или как двоичные данные. Тогда пользователи смогут править шаблон самостоятельно, но придётся контролировать наличие и версию файла.

Итог

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

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