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

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

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

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

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

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

Где хранится макет и как это влияет на код

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

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

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

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

Функция СформироватьПечатнуюФорму(СсылкаНаДокумент) Экспорт

ТабДок = Новый ТабличныйДокумент;

Макет = ПолучитьМакет("ПечатнаяФорма");

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

ОбластьШапка.Параметры.НомерДокумента = СсылкаНаДокумент.Номер;

ТабДок.Вывести(ОбластьШапка);

Возврат ТабДок;

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

Метод возвращает объект, тип которого соответствует виду макета. Для табличного макета это ТабличныйДокумент, для схемы компоновки — СхемаКомпоновкиДанных, для текстового — ТекстовыйДокумент, для двоичных данных — ДвоичныеДанные. Имя макета указывается точно так, как оно задано в конфигураторе, с учётом регистра.

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

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

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

Второй способ — обратиться через менеджер обработки по имени:

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

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

Работа с общими макетами конфигурации

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

Макет = ПолучитьОбщийМакет("ОбщаяПечатнаяФорма");

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

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

Макет во внешней обработке (.epf)

Во внешней обработке макет добавляется в конфигураторе в ветку «Макеты» самой обработки и сохраняется внутри файла .epf. В модуле объекта внешней обработки вызов идентичен встроенной: ПолучитьМакет("ИмяМакета"). Из формы внешней обработки объект доступен через РеквизитФормыВЗначение("Объект") в управляемой форме или напрямую в обычной:

// Управляемая форма внешней обработки

&НаСервере

Функция СформироватьНаСервере()

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

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

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

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

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

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

Получение макета СКД и макетов других типов

Для отчётов на основе обработки макетом часто служит схема компоновки данных. Получается она тем же методом, но используется иначе — передаётся в компоновщик:

СхемаКомпоновки = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновки, Настройки);

Макет типа ActiveDocument (Word) возвращает объект ДвоичныеДанные или специальный объект в зависимости от платформы — его сохраняют во временный файл через Записать() и открывают COM-объектом Word. Текстовый макет удобен для шаблонов XML, JSON и файлов обмена: полученный ТекстовыйДокумент заполняется подстановкой параметров.

Какой способ выбрать

ПолучитьМакет() в модуле объекта

Основной вариант, когда код и макет в одной обработке. Минимум кода, но недоступен из формы напрямую

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

Когда макет нужен извне: из документов, общих модулей, других обработок. Работает только для встроенных обработок конфигурации

ПолучитьОбщийМакет()

Когда шаблон используют несколько объектов. Минус — изменение влияет на всех потребителей

РеквизитФормыВЗначение + ПолучитьМакет

Для управляемых форм внешних обработок. Требует серверного вызова и пересоздания объекта

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

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

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

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

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

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

ТипЗнч(Макет) соответствует виду макета в конфигураторе

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

Получен другой тип — значит, взят не тот макет или неверно задан его вид

Наличие областей
Норма

Макет.ПолучитьОбласть("Шапка") возвращает область без ошибки

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

Ошибка «Область не найдена» — имя области не совпадает с макетом

Подстановка параметров
Норма

В выведенном табличном документе видны реальные значения вместо [Параметр]

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

В результате остались квадратные скобки — параметр не заполнен или имя не совпадает

FAQ

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

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

Почему ПолучитьМакет() возвращает ошибку, хотя макет есть в конфигураторе?

Чаще всего макет лежит не в той ветке: он добавлен в «Общие → Макеты», а вызывается метод обработки, или наоборот. Также проверьте точное имя — платформа сравнивает его посимвольно, лишний пробел или другой регистр некоторых букв приводят к ошибке.

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

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

Можно ли изменить макет программно и сохранить его обратно в конфигурацию?

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

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

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

Работает ли Обработки.Имя.ПолучитьМакет() для внешней обработки?

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

Итог

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

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