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

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

1С: как обратиться к общему макету из программного кода

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

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

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

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

Где находятся общие макеты и какие типы бывают

В конфигураторе общие макеты расположены в дереве конфигурации: ветка «Общие» → «Общие макеты». Каждый макет имеет имя, по которому к нему обращаются из кода, и тип, который определяет, что вернёт метод получения.

Основные типы общих макетов и возвращаемые значения:

  • Табличный документ — возвращается объект ТабличныйДокумент, готовый к заполнению параметров и выводу на печать.
  • Текстовый документ — возвращается ТекстовыйДокумент, из которого читают текст шаблона.
  • Схема компоновки данных — возвращается СхемаКомпоновкиДанных для программного формирования отчёта.
  • Макет компоновки данных — используется при низкоуровневой работе с СКД.
  • Двоичные данные — возвращается объект ДвоичныеДанные (картинки, архивы, внешние компоненты, epf/erf-файлы).
  • HTML-документ, XML, JSON, графическая схема, географическая схема и другие специализированные типы.

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

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

Метод ПолучитьОбщийМакет(<ИмяМакета>) вызывается в серверном контексте. В модуле объекта, общем серверном модуле или серверной процедуре формы доступен прямой вызов:

// Серверная процедура

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

Макет = ПолучитьОбщийМакет("МакетСчетаНаОплату");

Возврат Макет; // ТабличныйДокумент

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

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

Макет = Обработки.ПечатьДокументов.ПолучитьОбщийМакет("УниверсальныйМакет");

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

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

Если Метаданные.ОбщиеМакеты.Найти(ИмяМакета) = Неопределено Тогда

ВызватьИсключение "Макет """ + ИмяМакета + """ не найден в конфигурации";

КонецЕсли;

Работа с табличным документом: заполнение параметров и областей

Чаще всего общий макет — это табличный документ с именованными областями и параметрами вида [НомерДокумента]. Типовой алгоритм: получить макет, извлечь область, заполнить параметры, вывести область в результирующий документ.

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

Макет = ПолучитьОбщийМакет("МакетСчетаНаОплату");

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

// Шапка

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

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

ОбластьШапка.Параметры.ДатаДокумента = Формат(ДанныеДокумента.Дата, "ДЛФ=D");

Результат.Вывести(ОбластьШапка);

// Строки табличной части

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

Для Каждого СтрокаТовара Из ДанныеДокумента.Товары Цикл

ОбластьСтрока.Параметры.Заполнить(СтрокаТовара);

Результат.Вывести(ОбластьСтрока);

КонецЦикла;

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

Обратите внимание на метод Параметры.Заполнить(): он заполняет параметры области из структуры или строки выборки по совпадению имён. Это сокращает код, но требует, чтобы имена параметров в макете точно совпадали с именами полей источника данных — иначе параметр останется пустым без какого-либо сообщения об ошибке.

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

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

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

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

&НаСервере

Функция СформироватьМакетНаСервере()

Возврат ПолучитьОбщийМакет("МакетСчетаНаОплату");

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

&НаКлиенте

Процедура ПоказатьМакет(Команда)

ТабДок = СформироватьМакетНаСервере();

ТабДок.Показать("Предпросмотр макета");

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

Табличный документ сериализуется платформой и спокойно передаётся между сервером и клиентом. То же касается текстовых данных. С двоичными данными на клиенте работают через временное хранилище:

&НаСервере

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

ДвоичныеДанные = ПолучитьОбщийМакет("ЛоготипКомпании");

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

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

Полученный адрес временного хранилища присваивают, например, реквизиту формы типа «Строка», связанному с полем картинки. Хранилище, привязанное к УникальныйИдентификатор формы, живёт, пока открыта форма.

Общий макет vs макет объекта: что выбрать

У справочников, документов, отчётов и обработок есть собственные макеты, которые получают через менеджер объекта: Справочники.Контрагенты.ПолучитьМакет("ПечатьКарточки"). Выбор между общим макетом и макетом объекта — вопрос области применения шаблона.

Общий макет или макет объекта

Общий макет

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

Макет объекта

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

Макет в расширении

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

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

Чтение текстовых и двоичных макетов

Текстовый макет возвращает объект ТекстовыйДокумент. Типовое применение — шаблоны запросов, XML-файлы обмена, скрипты, шаблоны писем:

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

ТекстШаблона = ТекстовыйМакет.ПолучитьТекст();

ТекстЗапроса = СтрЗаменить(ТекстШаблона, "&Склад", "Склады.Основной");

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

ДвоичныеДанные = ПолучитьОбщийМакет("ВнешняяКомпонента");

ИмяФайла = ПолучитьИмяВременногоФайла("zip");

ДвоичныеДанные.Записать(ИмяФайла);

Операции с файловой системой выполняются на сервере, поэтому учитывайте права учётной записи, под которой работает сервер 1С, и антивирусные ограничения на запись во временные каталоги.

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

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

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

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

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

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

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

Переменная содержит объект ожидаемого типа (ТабличныйДокумент, ТекстовыйДокумент, ДвоичныеДанные)

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

Ошибка «макет не найден» — проверьте имя и наличие макета в конфигурации

Области извлекаются
Норма

Макет.Области.Найти("Имя") возвращает область, а не Неопределено

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

Найти() вернул Неопределено — имя области в макете отличается

Параметры заполнены
Норма

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

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

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

FAQ

Можно ли вызвать ПолучитьОбщийМакет в клиентской процедуре управляемой формы?

Нет, метод доступен только на сервере. Создайте серверную функцию формы или обратитесь к серверному общему модулю, получите макет там и верните на клиент результат — табличный документ, текст или адрес двоичных данных во временном хранилище.

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

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

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

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

Можно ли изменить общий макет программно и сохранить его?

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

Работает ли ПолучитьОбщийМакет для макетов, добавленных расширением конфигурации?

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

Как вывести общий макет сразу на печать без предпросмотра?

Сформируйте табличный документ на сервере, передайте его на клиент и вызовите метод Напечатать() с параметром РежимИспользованияДиалогаПечати.БезДиалога, либо используйте стандартную команду печати через интерфейс табличного документа.

Итог

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

Общий макет получают методом ПолучитьОбщийМакет("Имя") только в серверном контексте. Тип возвращаемого значения определяется видом макета в конфигураторе. Для табличных макетов работайте через области и параметры, для двоичных — через временное хранилище. Перед обращением к динамическим именам проверяйте существование макета через метаданные.