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

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

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

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

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

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

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

Где выполняется код и почему это важно

В управляемом приложении процедуры и функции помечаются директивами компиляции: &НаКлиенте, &НаСервере, &НаСервереБезКонтекста, &НаКлиентеНаСервереБезКонтекста. Директива определяет, какие объекты и методы доступны внутри кода. Методы получения макетов работают на сервере, поэтому вызов из клиентской процедуры напрямую невозможен — платформа выдаст ошибку компиляции или выполнения.

Типичная схема выглядит так: клиентская процедура (например, обработчик команды «Печать») вызывает серверную процедуру, та получает макет, заполняет табличный документ и возвращает его на клиент для показа или печати. Серверный вызов может быть реализован в общем модуле с флагом «Сервер» либо в процедуре &НаСервере формы.

Получение макета объекта метаданных через ПолучитьМакет

Если макет создан внутри конкретного объекта конфигурации (документа, справочника, обработки, отчёта), его получают через менеджер объекта. Синтаксис одинаков для всех типов метаданных:

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

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

МакетСправочника = Справочники.Номенклатура.ПолучитьМакет("Этикетка");

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

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

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

Получение общего макета через ПолучитьОбщийМакет

Общие макеты лежат в ветке конфигурации «Общие → Общие макеты» и не привязаны к конкретному объекту. Их удобно использовать для шаблонов, которые нужны в нескольких местах: типовые печатные формы, макеты обмена, шаблоны Excel. Получение выполняется глобальным методом:

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

Метод доступен на сервере и в толстом клиенте, но недоступен в тонком и веб-клиенте. Поэтому даже если макет нужен для показа пользователю, получать его следует на сервере, а на клиент передавать уже готовый результат — табличный документ или двоичные данные.

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

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

В модуле формы

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

В процедуре &НаСервереБезКонтекста метод ЭтотОбъект недоступен, поэтому там работает только обращение через менеджер: Обработки.МояОбработка.ПолучитьМакет("Шаблон"). Это ограничение часто становится причиной ошибки «Метод объекта не обнаружен» при рефакторинге серверных процедур.

В общем серверном модуле

Общий модуль с флагами «Сервер» и «Вызов сервера» — стандартное место для процедур печати. Внутри него доступны оба метода получения макетов. Пример типовой процедуры:

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

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

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

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

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

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

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

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

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

Порядок действий для печати из формы
  1. 1
    Создайте клиентскую команду и её обработчик &НаКлиенте
  2. 2
    В обработчике вызовите серверную функцию общего модуля или процедуру &НаСервере
  3. 3
    На сервере получите макет через ПолучитьМакет или ПолучитьОбщийМакет
  4. 4
    Заполните области табличного документа параметрами
  5. 5
    Верните табличный документ на клиент и выведите его методом Показать

Передача результата на клиент

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

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

&НаСервере

Функция ПолучитьАдресШаблона()

ДвоичныеДанные = ПолучитьОбщийМакет("ШаблонЗагрузки");

Возврат ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификаторФормы);

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

Сравнение способов получения макета

ПолучитьМакет через менеджер объекта

Подходит для макетов конкретных документов, справочников, обработок. Работает в любом серверном контексте, но требует знания имени объекта метаданных.

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

Для макетов из ветки «Общие макеты». Удобен для шаблонов, общих для всей конфигурации. Не привязан к объектам.

ЭтотОбъект.ПолучитьМакет в форме

Самый короткий путь для макетов своей обработки или отчёта, но недоступен в процедурах БезКонтекста и в общих модулях.

Типичные ошибки и их причины

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

Вторая группа ошибок связана с контекстом компиляции: попытка вызвать получение макета в клиентской процедуре тонкого клиента приводит к ошибке «Процедура или функция с указанным именем не определена» ещё на этапе проверки модуля. Лечится переносом вызова в серверную процедуру.

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

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

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

После получения макета полезно убедиться, что объект имеет ожидаемый тип. Для табличного макета проверка выглядит так: Если ТипЗнч(Макет) = Тип("ТабличныйДокумент") Тогда .... Это защищает от ситуации, когда макет с нужным именем существует, но имеет другой вид — например, разработчик создал текстовый макет вместо табличного.

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

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

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

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

Тип возвращённого объекта
Норма

ТабличныйДокумент для табличного макета, ДвоичныеДанные для двоичного

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

Тип не совпадает с ожидаемым — макет создан с другим видом

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

Макет.Области содержит нужные области: Шапка, Строка, Подвал

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

Областей нет или имена отличаются — код ПолучитьОбласть выдаст ошибку

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

В сформированном табличном документе видны данные документа

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

Ячейки пустые — параметры не присвоены или имена параметров не совпадают

FAQ

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

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

Чем ПолучитьМакет отличается от ПолучитьОбщийМакет?

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

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

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

Почему возникает ошибка «Макет не найден», хотя макет есть в конфигураторе?

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

Можно ли передать макет на клиент, не формируя табличный документ?

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

Как получить макет схемы компоновки данных для отчёта?

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

Итог

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

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