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

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

Как получить макет в управляемой форме 1С

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

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

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

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

Где физически хранится макет и какие виды бывают

Макет в 1С — это объект метаданных, вложенный в конкретный объект конфигурации (справочник, документ, обработку, отчёт) либо размещённый в ветке «Общие → Макеты». От места хранения зависит способ обращения к нему в коде.

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

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

Базовый синтаксис: ПолучитьМакет на сервере

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

&НаСервере

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

Возврат Документы.РеализацияТоваровУслуг.ПолучитьМакет("МакетПечати");

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

&НаКлиенте

Процедура Печать(Команда)

ТабДок = ПолучитьМакетПечатиНаСервере();

ТабДок.Показать("Печать документа");

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

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

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

bsl
&НаСервере
Функция ПолучитьМакетПечатиНаСервере()
    Возврат Документы.РеализацияТоваровУслуг.ПолучитьМакет("МакетПечати");
КонецФункции

Получение общего макета конфигурации

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

&НаСервере

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

Возврат ПолучитьОбщийМакет("ШаблонПисьма");

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

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

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

Макет внешней обработки или отчёта

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

&НаСервере

Функция ПолучитьМакетВнешнейОбработки(ИмяФайла)

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

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

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

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

Получение макета из формы объекта: типовой сценарий печати

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

Порядок действий
  1. 1
    Создайте макет типа «Табличный документ» в ветке «Макеты» нужного документа в конфигураторе
  2. 2
    Разметьте области (Шапка, Строка, Подвал) и задайте параметры в ячейках
  3. 3
    В форме документа добавьте команду и клиентский обработчик
  4. 4
    В серверной функции получите макет через Документы.Имя.ПолучитьМакет(), заполните области и верните табличный документ
  5. 5
    На клиенте вызовите Показать() или откройте форму печати БСП
&НаСервере

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

Макет = Документы.РеализацияТоваровУслуг.ПолучитьМакет("МакетПечати");

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

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

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

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

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

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

Если в конфигурации внедрена Библиотека стандартных подсистем, предпочтительнее регистрировать печатную форму через механизм «Управление печатью» — тогда макет получается внутри процедуры Печать() модуля менеджера, а форма документа получает кнопку автоматически.

Макет как реквизит формы и работа без серверного вызова

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

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Макет = ПолучитьОбщийМакет("ИнструкцияПользователя");

РеквизитПредпросмотр.Очистить();

РеквизитПредпросмотр.Вывести(Макет);

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

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

Проверка результата и типичные ошибки

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

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

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

Вызов ПолучитьМакет
Норма

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

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

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

Получение области
Норма

Область получена, параметры заполняются

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

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

Вывод на клиенте
Норма

Табличный документ открывается через Показать()

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

Пустое окно — макет получен, но области не выведены в итоговый документ

Типичные ошибки
01
Вызов ПолучитьМакет в процедуре &НаКлиенте — метод недоступен, нужен серверный вызов
02
Опечатка в имени макета или области — проверяйте имя в конфигураторе посимвольно
03
Обращение Документы.Имя.ПолучитьМакет к макету, который создан как общий — для общих макетов нужен ПолучитьОбщийМакет
04
Использование ЭтотОбъект.ПолучитьМакет() в форме объекта — в управляемой форме нет прямого доступа к объекту, обращайтесь через менеджер или РеквизитФормыВЗначение
05
Ожидание табличного документа от макета типа «Двоичные данные» — тип результата определяется типом макета в конфигураторе
Если макет нужен только для чтения текста или двоичных данных (шаблон файла, картинка), храните его как общий макет — так его проще переиспользовать и обновлять без изменения кода нескольких объектов. Печатные формы, наоборот, лучше держать внутри объекта: при выгрузке объекта в поставку макет уедет вместе с ним.
ПЗ
Практическое замечание

FAQ

Как получить макет в управляемой форме, если код находится в форме элемента справочника?

Через серверную функцию: &НаСервере Функция ... Возврат Справочники.ИмяСправочника.ПолучитьМакет("ИмяМакета"); КонецФункции. Альтернатива — РеквизитФормыВЗначение("Объект").ПолучитьМакет("ИмяМакета"), но это создаёт лишнюю сериализацию объекта и оправдано только если нужны ещё и данные объекта.

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

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

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

Нет, в тонком и веб-клиенте ПолучитьМакет доступен только на сервере. Если нужно избежать повторных вызовов, получите макет один раз при создании формы и сохраните результат в реквизит формы (например, табличный документ или текст).

Как получить макет из другого объекта, например макет документа из формы отчёта?

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

Что вернёт ПолучитьМакет, если макет имеет тип «Схема компоновки данных»?

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

Как программно проверить существование макета перед получением?

Через метаданные: Метаданные.Документы.Имя.Макеты.Найти("ИмяМакета") <> Неопределено. Для общих макетов — Метаданные.ОбщиеМакеты.Найти("ИмяМакета"). Это полезно, когда имя макета приходит из настроек и может отсутствовать в конфигурации.

Итог

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

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