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

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

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

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

Макеты во внешних обработках 1С используются для печатных форм, табличных документов, текстовых шаблонов, схем компоновки данных и двоичных данных. Главная сложность для разработчика — понять, откуда именно вызывается метод получения макета: из модуля объекта обработки или из модуля формы. От этого зависит, какой синтаксис сработает, а какой выдаст ошибку «Метод объекта не обнаружен».

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

Какие макеты бывают во внешней обработке

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

Внешняя обработка поддерживает те же типы макетов, что и объекты конфигурации:

  • Табличный документ — печатные формы, области с параметрами;
  • Текстовый документ — шаблоны запросов, XML, произвольный текст;
  • Схема компоновки данных — для отчётов на СКД;
  • Двоичные данные — картинки, шаблоны Word/Excel, внешние компоненты;
  • HTML-документ, Active Document — редкие специальные сценарии;
  • Географическая схема, графическая схема — специализированные макеты.

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

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

Самый простой случай — код находится в модуле объекта внешней обработки. Здесь метод ПолучитьМакет доступен напрямую через ЭтотОбъект или вообще без префикса.

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

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

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

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

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

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

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

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

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

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

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

Получение макета в управляемой форме

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

&НаСервере

Процедура СформироватьНаСервере()

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

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

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

// дальнейшее заполнение табличного документа

КонецПроцедуры

Важные ограничения этого подхода:

  • Преобразование РеквизитФормыВЗначение выполняется только на сервере — оборачивайте код в директиву &НаСервере;
  • Каждый вызов создаёт новый экземпляр объекта, что при частых обращениях влияет на производительность;
  • Если обработка подключена через механизм дополнительных отчётов и обработок (БСП), получать макет лучше в модуле объекта, а не в форме.

Альтернатива без преобразования — вызвать серверную функцию модуля объекта, которая вернёт уже готовый табличный документ или макет. Для этого функция в модуле объекта должна быть объявлена с директивой компиляции &НаСервере либо без директив (если модуль объекта компилируется на сервере).

bsl
&НаСервере
Функция ПолучитьМакетОбработки(ИмяМакета)
    ОбъектОбработки = РеквизитФормыВЗначение("Объект");
    Возврат ОбъектОбработки.ПолучитьМакет(ИмяМакета);
КонецФункции

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

В обычных формах (режим обычного приложения, платформа 8.2/8.3 в толстом клиенте) механика проще: реквизит формы Объект недоступен, но сам объект обработки доступен через свойство ЭтотОбъект в модуле формы.

Процедура КнопкаСформироватьНажатие(Кнопка)

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

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

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

ТабДок.Показать();

КонецПроцедуры

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

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

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

Самый простой и надёжный способ; подходит для централизованной печати и подключения через БСП. Ограничение — нет доступа к данным формы напрямую

Управляемая форма: РеквизитФормыВЗначение

Нужен, когда макет заполняется данными формы. Требует серверного контекста и создаёт копию объекта при каждом вызове

Обычная форма: ЭтотОбъект.ПолучитьМакет()

Работает напрямую без преобразований, но применим только в режиме обычного приложения

Получение макета из внешнего файла без открытия обработки

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

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

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

Второй параметр (Ложь) отключает безопасный режим. В безопасном режиме (Истина) доступ к файловой системе и внешним компонентам из обработки будет ограничен, но само получение макета работает, поскольку макет — часть самого файла обработки.

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

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

Большинство проблем при получении макета сводится к нескольким повторяющимся ситуациям. Знание их признаков экономит время отладки.

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

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

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

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

Вызов ПолучитьМакет выполняется без исключения
Норма

Возвращён объект ожидаемого типа (ТабличныйДокумент и др.)

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

Ошибка «Макет не найден» — имя или место вызова неверны

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

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

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

Возвращено Неопределено — макет не существует или имя пустое

Заполнение параметров области
Норма

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

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

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

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

Быстрый способ убедиться, что макет получен корректно, — вывести его тип и показать табличный документ:

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

Сообщить(ТипЗнч(Макет)); // Табличный документ

Макет.Показать("Проверка макета"); // выведет макет как есть

Вывод макета «как есть» без заполнения параметров — удобный приём: вы сразу видите структуру областей и имена параметров в квадратных скобках, что помогает сверить их с кодом заполнения.

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

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

FAQ: частые вопросы о макетах внешних обработок

Почему в управляемой форме возникает ошибка «Метод объекта не обнаружен (ПолучитьМакет)»?

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

Можно ли получить макет внешней обработки на клиенте в тонком клиенте?

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

Как получить макет, если обработка хранится в справочнике дополнительных отчётов БСП?

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

Макет изменён в конфигураторе, но печатная форма выводится старая — в чём причина?

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

Как получить макет типа «Двоичные данные», например шаблон Word?

Тем же методом ПолучитьМакет — он вернёт объект ДвоичныеДанные. Сохраните их во временный файл методом Записать(ИмяФайла) и далее работайте с файлом, например откройте через COM-объект Word.Application.

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

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

Итог

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

Макет внешней обработки получается методом ПолучитьМакет("ИмяМакета"). В модуле объекта — напрямую через ЭтотОбъект, в управляемой форме — через РеквизитФормыВЗначение("Объект") на сервере, в обычной форме — через ЭтотОбъект. Чаще всего ошибки вызваны неверным контекстом вызова, опечаткой в имени макета или устаревшей версией обработки в базе.