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