Разработка и Конфигурация · 10 мин
Как в обработке 1С получить макет: способы и примеры кода
Как в обработке 1С получить макет: метод ПолучитьМакет, табличные документы, макеты СКД и Word, работа с внешними обработками. Примеры кода и типичные ошибки.
Макет в 1С — это шаблон, хранящийся в конфигурации или в составе внешней обработки: табличный документ, схема компоновки данных, макет Word, двоичные данные. В обработке макет чаще всего нужен для печатных форм, отчётов и выгрузок. Получить его можно методом ПолучитьМакет(), но конкретный вызов зависит от того, где лежит макет — в модуле объекта обработки, в общих макетах конфигурации или в составе внешней обработки.
Главная сложность у начинающих разработчиков — понять, откуда именно вызывать метод. В модуле объекта обработки доступен прямой вызов ПолучитьМакет("ИмяМакета"), а из формы или из другого объекта нужно обращаться через менеджер обработки или через объект обработки. Ниже разобраны все рабочие сценарии с готовым кодом.
Где хранится макет и как это влияет на код
Перед написанием кода определите, где физически находится макет. От этого зависит синтаксис получения. В конфигураторе макет может лежать в трёх местах: в ветке «Макеты» самой обработки, в общей ветке «Общие → Макеты» конфигурации или внутри внешней обработки (файла .epf).
Если макет добавлен в саму обработку, он доступен через менеджер этой обработки. Если макет общий — к нему обращаются через глобальный метод ПолучитьОбщийМакет(). Для внешней обработки макет получают только из её собственного модуля объекта или через созданный экземпляр объекта.
Получение макета в модуле объекта обработки
Самый простой сценарий — код находится в модуле объекта той же обработки, где лежит макет. Тогда достаточно вызвать метод ПолучитьМакет() с именем макета в кавычках:
Функция СформироватьПечатнуюФорму(СсылкаНаДокумент) Экспорт
ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("ПечатнаяФорма");
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьШапка.Параметры.НомерДокумента = СсылкаНаДокумент.Номер;
ТабДок.Вывести(ОбластьШапка);
Возврат ТабДок;
КонецФункции
Метод возвращает объект, тип которого соответствует виду макета. Для табличного макета это ТабличныйДокумент, для схемы компоновки — СхемаКомпоновкиДанных, для текстового — ТекстовыйДокумент, для двоичных данных — ДвоичныеДанные. Имя макета указывается точно так, как оно задано в конфигураторе, с учётом регистра.
Обратите внимание: каждый вызов ПолучитьМакет() создаёт новый экземпляр. Поэтому макет, полученный в цикле, можно безопасно модифицировать — исходный шаблон в конфигурации не пострадает.
Получение макета из формы обработки
Из модуля формы прямой вызов ПолучитьМакет() недоступен — форма не имеет такого метода. Есть два рабочих подхода. Первый — вынести функцию формирования в модуль объекта и вызывать её из формы. Для этого в форме обычной обработки обращаются к объекту через ЭтотОбъект (в управляемой форме объект доступен через реквизит или через получение объекта из данных формы).
Второй способ — обратиться через менеджер обработки по имени:
Макет = Обработки.МояОбработка.ПолучитьМакет("ПечатнаяФорма");
Этот вариант работает из любого места конфигурации: из модулей документов, общих модулей, команд. Именно его используют, когда печатная форма обработки вызывается извне, например из подсистемы дополнительных печатных форм.
Работа с общими макетами конфигурации
Если шаблон используется несколькими объектами, его размещают в ветке «Общие → Макеты». Получают такой макет глобальным методом без привязки к обработке:
Макет = ПолучитьОбщийМакет("ОбщаяПечатнаяФорма");
Область = Макет.ПолучитьОбласть("Строка");
Типичный случай — единый фирменный бланк, колонтитулы или стандартная таблица стилей для всех печатных форм. Перенос макета в общие уменьшает дублирование, но усложняет поддержку: изменение общего макета влияет сразу на все обработки, которые его используют.
Макет во внешней обработке (.epf)
Во внешней обработке макет добавляется в конфигураторе в ветку «Макеты» самой обработки и сохраняется внутри файла .epf. В модуле объекта внешней обработки вызов идентичен встроенной: ПолучитьМакет("ИмяМакета"). Из формы внешней обработки объект доступен через РеквизитФормыВЗначение("Объект") в управляемой форме или напрямую в обычной:
// Управляемая форма внешней обработки
&НаСервере
Функция СформироватьНаСервере()
ОбъектОбработки = РеквизитФормыВЗначение("Объект");
Макет = ОбъектОбработки.ПолучитьМакет("ПечатнаяФорма");
Возврат Макет;
КонецФункции
Если обработка подключается через механизм «Дополнительные отчеты и обработки» (БСП), то объект обработки создаётся функцией ДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки(Ссылка), после чего у полученного объекта вызывается ПолучитьМакет().
- 1Откройте внешнюю обработку в конфигураторе и добавьте макет в ветку «Макеты»
- 2Задайте тип макета: табличный документ, СКД, текст или двоичные данные
- 3В модуле объекта напишите функцию с вызовом ПолучитьМакет("ИмяМакета")
- 4Из формы вызовите эту функцию через РеквизитФормыВЗначение("Объект")
- 5Проверьте результат: табличный документ должен содержать области макета, а параметры — подставленные значения
Получение макета СКД и макетов других типов
Для отчётов на основе обработки макетом часто служит схема компоновки данных. Получается она тем же методом, но используется иначе — передаётся в компоновщик:
СхемаКомпоновки = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновки, Настройки);
Макет типа ActiveDocument (Word) возвращает объект ДвоичныеДанные или специальный объект в зависимости от платформы — его сохраняют во временный файл через Записать() и открывают COM-объектом Word. Текстовый макет удобен для шаблонов XML, JSON и файлов обмена: полученный ТекстовыйДокумент заполняется подстановкой параметров.
Какой способ выбрать
Основной вариант, когда код и макет в одной обработке. Минимум кода, но недоступен из формы напрямую
Когда макет нужен извне: из документов, общих модулей, других обработок. Работает только для встроенных обработок конфигурации
Когда шаблон используют несколько объектов. Минус — изменение влияет на всех потребителей
Для управляемых форм внешних обработок. Требует серверного вызова и пересоздания объекта
Типичные ошибки и как их диагностировать
Самая частая ошибка — «Макет "Имя" не найден». Причины: опечатка в имени (платформа чувствительна к точному совпадению), макет лежит в общих макетах, а вызывается метод обработки, или макет добавлен в форму, а не в объект. Проверьте в конфигураторе ветку «Макеты» именно той обработки, чей метод вы вызываете.
Вторая группа проблем — несовпадение типов: код пытается вызвать ПолучитьОбласть() у макета типа «Текстовый документ» или «Двоичные данные». Перед разработкой откройте свойства макета и убедитесь, что его вид соответствует ожидаемому коду. Третья типичная ситуация — в управляемой форме внешней обработки разработчик вызывает ПолучитьМакет() на клиенте: метод работает только на сервере, поэтому логику выносят в серверную процедуру.
Как проверить результат
ТипЗнч(Макет) соответствует виду макета в конфигураторе
Получен другой тип — значит, взят не тот макет или неверно задан его вид
Макет.ПолучитьОбласть("Шапка") возвращает область без ошибки
Ошибка «Область не найдена» — имя области не совпадает с макетом
В выведенном табличном документе видны реальные значения вместо [Параметр]
В результате остались квадратные скобки — параметр не заполнен или имя не совпадает
FAQ
Можно ли получить макет, не создавая объект внешней обработки?
Нет. Макет внешней обработки хранится внутри файла .epf и доступен только через экземпляр объекта этой обработки. Объект создаётся через ВнешниеОбработки.Создать(ПутьКФайлу) или через механизм дополнительных отчётов БСП, после чего у него вызывается ПолучитьМакет().
Почему ПолучитьМакет() возвращает ошибку, хотя макет есть в конфигураторе?
Чаще всего макет лежит не в той ветке: он добавлен в «Общие → Макеты», а вызывается метод обработки, или наоборот. Также проверьте точное имя — платформа сравнивает его посимвольно, лишний пробел или другой регистр некоторых букв приводят к ошибке.
Как получить макет из формы обработки в управляемом приложении?
Создайте серверную функцию в модуле формы, в ней получите объект обработки через РеквизитФормыВЗначение("Объект") и вызовите у него ПолучитьМакет("ИмяМакета"). Либо вынесите формирование в экспортную функцию модуля объекта и вызывайте её из формы.
Можно ли изменить макет программно и сохранить его обратно в конфигурацию?
Нет, в режиме предприятия макеты конфигурации доступны только на чтение. Полученный экземпляр можно свободно менять в памяти — это не затрагивает шаблон. Изменение самого макета выполняется только в конфигураторе.
Что возвращает ПолучитьМакет для макета типа «Двоичные данные»?
Объект типа ДвоичныеДанные. Его можно записать во временный файл методом Записать(ПутьКФайлу), передать в хранилище значения или использовать для открытия внешнего приложения — например, шаблона Word или Excel.
Работает ли Обработки.Имя.ПолучитьМакет() для внешней обработки?
Нет, менеджер Обработки содержит только обработки, встроенные в конфигурацию. Для внешней обработки сначала создайте её объект через ВнешниеОбработки.Создать() и вызывайте ПолучитьМакет() у созданного объекта.
Что важно запомнить
Макет получают методом ПолучитьМакет("Имя") из модуля объекта обработки, через Обработки.Имя.ПолучитьМакет() — извне, и через ПолучитьОбщийМакет() — для общих макетов. В управляемых формах код размещают на сервере. Тип возвращаемого значения совпадает с видом макета, а каждая ошибка «Макет не найден» начинается с проверки имени и места хранения макета.