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