Разработка и Конфигурация · 10 мин
Как получить общий макет в 1С 8
Как получить общий макет в 1С 8: метод ПолучитьОбщийМакет, работа с табличными документами, типовые ошибки и проверка результата.
Общие макеты в 1С 8 хранятся в ветке «Общие» конфигуратора и доступны из любого модуля приложения. Их используют для печатных форм, шаблонов отчётов, схем компоновки данных, двоичных файлов и текстовых заготовок. Чтобы получить общий макет программно, применяется метод ПолучитьОбщийМакет() с указанием имени макета.
Главное отличие общего макета от макета объекта — область видимости. Макет справочника или документа доступен через менеджер этого объекта, а общий макет вызывается напрямую, без привязки к конкретному объекту метаданных. Это удобно, когда одна печатная форма или шаблон используется сразу в нескольких документах.
Ниже разобраны способы создания общего макета, программное получение его в разных контекстах — на сервере, на клиенте, во внешнем соединении — а также типовые ошибки, из-за которых платформа возвращает ошибку вместо макета.
Что такое общий макет и когда он нужен
Общий макет — это объект конфигурации, расположенный в дереве метаданных по пути «Общие» → «Общие макеты». Внутри макета может храниться табличный документ, текст, схема компоновки данных, макет оформления, двоичные данные, HTML-документ, географическая схема, графическая схема или ActiveDocument.
Типичные сценарии применения: единая печатная форма для нескольких видов документов, шаблон договора, файл Excel для загрузки данных, схема компоновки для универсального отчёта, текстовый шаблон письма. Если макет логически принадлежит одному объекту — его лучше разместить в макетах самого объекта; если он общий для всей конфигурации — в общих макетах.
Как создать общий макет в конфигураторе
Откройте конфигуратор, разверните ветку «Общие» и найдите пункт «Общие макеты». Через контекстное меню выберите «Добавить». В конструкторе макета задайте имя (например, МакетПечатиСчета) и выберите тип макета — чаще всего это «Табличный документ».
После создания заполните макет: выделите область ячеек, задайте ей имя через свойства табличного документа, в ячейках с переменными данными установите тип заполнения «Параметр» и укажите имя параметра. Именно эти параметры потом заполняются из кода при формировании печатной формы.
Имя макета должно быть допустимым идентификатором: без пробелов, начинаться с буквы. Опечатка в имени — самая частая причина ошибки при получении макета, поэтому имя удобно копировать прямо из дерева метаданных.
- 1Откройте конфигуратор, ветка «Общие» → «Общие макеты» → «Добавить»
- 2Задайте имя макета и выберите тип (например, «Табличный документ»)
- 3Создайте именованные области и задайте параметры в ячейках
- 4Обновите конфигурацию базы данных (F7)
- 5В коде вызовите ПолучитьОбщийМакет("ИмяМакета") и проверьте результат
Как получить общий макет программно
Базовый вызов выглядит так: Макет = ПолучитьОбщийМакет("МакетПечатиСчета");. Метод возвращает объект того типа, который был выбран при создании макета, — чаще всего ТабличныйДокумент. Дальше из макета получают области, заполняют параметры и выводят в итоговый табличный документ.
Типовой фрагмент формирования печатной формы на основе общего макета:
Функция СформироватьПечатнуюФорму(СсылкаНаДокумент) Экспорт
Макет = ПолучитьОбщийМакет("МакетПечатиСчета");
ТабДок = Новый ТабличныйДокумент;
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьШапка.Параметры.НомерДокумента = СсылкаНаДокумент.Номер;
ОбластьШапка.Параметры.Контрагент = СсылкаНаДокумент.Контрагент;
ТабДок.Вывести(ОбластьШапка);
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
Для Каждого СтрокаТовара Из СсылкаНаДокумент.Товары Цикл
ОбластьСтрока.Параметры.Заполнить(СтрокаТовара);
ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;
Возврат ТабДок;
КонецФункции
Обратите внимание: метод ПолучитьОбласть() каждый раз возвращает новую область, поэтому в цикле её можно получать один раз до цикла, а параметры заполнять на каждой итерации. Для заполнения параметров по совпадающим именам удобен метод Параметры.Заполнить().
Макет = ПолучитьОбщийМакет("МакетПечатиСчета");
Область = Макет.ПолучитьОбласть("Шапка");
Область.Параметры.НомерДокумента = Документ.Номер;
ТабДок.Вывести(Область);Получение макета на клиенте и на сервере
В управляемом приложении код делится на клиентский и серверный. Метод ПолучитьОбщийМакет() недоступен в тонком и веб-клиенте — там он работает только в толстом клиенте. Поэтому правильный шаблон для управляемых форм: серверная функция формирует табличный документ, а клиентская процедура лишь показывает его пользователю.
На форме это выглядит так: клиентская команда вызывает серверную функцию СформироватьНаСервере(), та получает общий макет, заполняет табличный документ и возвращает его (или помещает в реквизит формы типа «ТабличныйДокумент»). Клиент открывает результат через ТабДок.Показать() или отображает в поле формы.
Во внешнем соединении (COM, HTTP-сервисы, веб-сервисы) общий макет получается так же — методом ПолучитьОбщийМакет() в контексте сервера. Ограничений здесь нет, но помните, что табличный документ нельзя напрямую сериализовать в JSON или XML: наружу передают готовый файл (PDF, MXL, HTML) или двоичные данные.
Работа с разными типами общих макетов
Тип возвращаемого значения зависит от вида макета. Табличный документ используют для печатных форм, текстовый документ — для шаблонов писем и скриптов, схему компоновки данных — для программно формируемых отчётов, двоичные данные — для хранения файлов (например, шаблона Excel).
Для макета типа «Двоичные данные» типичный приём — сохранить файл во временный каталог и открыть его прикладной программой: ДвоичныеДанные = ПолучитьОбщийМакет("ШаблонExcel"); ДвоичныеДанные.Записать(ИмяВременногоФайла);. Для макета типа «Схема компоновки данных» полученную схему передают в КомпоновщикМакетаКомпоновкиДанных вместе с настройками.
Текстовый макет читают через объект ТекстовыйДокумент: метод ПолучитьОбщийМакет() возвращает уже готовый текстовый документ, из которого методом ПолучитьТекст() получают строку шаблона и подставляют в неё значения через СтрЗаменить() или форматирование.
Сравнение вариантов
Подходит, когда шаблон используется несколькими объектами или не привязан к ним. Доступен из любого модуля через ПолучитьОбщийМакет().
Подходит для печатной формы конкретного документа или справочника. Получается через менеджер объекта: Справочники.Номенклатура.ПолучитьМакет().
Подходит для внешних печатных форм без изменения конфигурации. Получается через ЭтотОбъект.ПолучитьМакет() в модуле обработки.
Типичные ошибки и их устранение
Ошибка «Макет не найден» или «Ошибка при вызове метода контекста» почти всегда означает одно из трёх: опечатка в имени макета, макет создан, но конфигурация базы данных не обновлена, либо макет находится не в общих, а в макетах объекта — тогда нужен другой метод получения.
Вторая частая ситуация — попытка получить несуществующую область: Макет.ПолучитьОбласть("Шапка") вызывает ошибку, если области «Шапка» в макете нет или имя задано с пробелом. Проверяйте имена областей в самом макете через свойства выделенного диапазона.
Третья группа проблем — контекст выполнения. Общий модуль без признака «Сервер», вызов из клиентской процедуры тонкого клиента, фоновое задание без права на объект метаданных — всё это приводит к ошибкам доступа или отсутствия метода. Проверяйте флажки «Сервер» и «Вызов сервера» у общего модуля и права роли на общий макет.
Как проверить результат
Минимальная проверка — вывести сформированный табличный документ на экран и убедиться, что все области присутствуют, параметры заполнены, а пустые значения не оставили «дырок» в печатной форме. Для отладки удобно временно вывести макет целиком, без заполнения, чтобы увидеть структуру областей.
Если макет используется в регламентном задании или фоновом процессе, добавьте запись в журнал регистрации с фактом успешного получения макета и количеством выведенных строк — это упростит диагностику, когда пользователь сообщит, что «печатная форма не сформировалась».
Как проверить результат
Переменная содержит объект нужного типа (ТабличныйДокумент, ТекстовыйДокумент и др.)
Ошибка «Макет не найден» или Неопределено
ПолучитьОбласть() возвращает область без исключения
Ошибка — имени области нет в макете
В итоговом документе вместо шаблонов стоят реальные значения
На печати видны квадратные скобки или пустые места
Код выполняется на сервере, общий модуль имеет признак «Сервер»
Ошибка «Метод объекта не обнаружен» на клиенте
FAQ
Чем ПолучитьОбщийМакет отличается от ПолучитьМакет?
ПолучитьОбщийМакет() обращается к макетам из ветки «Общие» и доступен глобально. ПолучитьМакет() вызывается через менеджер конкретного объекта (например, Документы.РеализацияТоваровУслуг.ПолучитьМакет("Счет")) и возвращает макет, хранящийся внутри этого объекта метаданных.
Можно ли получить общий макет в тонком клиенте?
Напрямую — нет, метод недоступен в клиентском контексте тонкого и веб-клиента. Стандартное решение: вынести получение макета и формирование табличного документа в серверную процедуру, а на клиент вернуть готовый результат.
Почему возникает ошибка «Макет не найден», хотя макет есть?
Проверьте три вещи: точное совпадение имени (регистр значения не имеет, но имеют пробелы и опечатки), обновление конфигурации базы данных после добавления макета и то, что макет действительно общий, а не макет объекта.
Как получить из общего макета файл Excel?
Создайте общий макет типа «Двоичные данные» и загрузите в него файл. В коде получите его методом ПолучитьОбщийМакет(), затем запишите двоичные данные во временный файл методом Записать() и откройте или передайте пользователю.
Нужны ли специальные права для получения общего макета?
Да, в ролях конфигурации для общих макетов есть право «Получение». Если у пользователя его нет, вызов ПолучитьОбщийМакет() завершится ошибкой нарушения прав доступа. Проверьте настройку ролей, если код работает у разработчика, но не у пользователя.
Можно ли изменить общий макет программно и сохранить?
Полученный макет — это копия в памяти: её можно менять и выводить, но сохранить изменения обратно в конфигурацию штатными средствами встроенного языка нельзя. Изменение макета конфигурации выполняется только в конфигураторе.
Что важно запомнить
Общий макет создаётся в ветке «Общие» → «Общие макеты», а получается методом ПолучитьОбщийМакет("Имя"). В управляемом приложении вызывайте метод только на сервере. Большинство ошибок связано с опечаткой в имени, необновлённой конфигурацией БД или клиентским контекстом вызова.