Отчеты и Аналитика · 11 мин
Как получить макет внешнего отчёта в 1С 8
Как получить макет внешнего отчёта в 1С 8: метод ПолучитьМакет, обращение через ЭтотОбъект, работа в модуле формы и объекта, типичные ошибки и примеры кода.
Макет внешнего отчёта в 1С 8 — это шаблон табличного документа, печатной формы или схемы компоновки данных, хранящийся внутри файла .erf. Чтобы использовать его при формировании результата, макет нужно получить программно — методом ПолучитьМакет(). Главная особенность внешних отчётов в том, что метод доступен только в модуле объекта отчёта, а не в модуле формы, и это вызывает больше всего вопросов у разработчиков.
Типовая задача выглядит так: внешний отчёт формирует табличный документ по макету, заполняет области данными и выводит результат пользователю. В обычном приложении и в управляемых формах код различается, а попытка вызвать ПолучитьМакет() из формы напрямую приводит к ошибке «Метод объекта не обнаружен». Ниже разобраны рабочие способы получения макета, ограничения платформы и типичные ошибки.
Где хранится макет внешнего отчёта и как его добавить
Макет добавляется в структуру внешнего отчёта через конфигуратор. Откройте файл .erf, в дереве объекта найдите ветку «Макеты», нажмите «Добавить» и выберите тип: табличный документ, схема компоновки данных, двоичные данные, HTML-документ и другие. После сохранения макет становится частью файла отчёта и доступен из встроенного языка.
Имя макета, заданное в конфигураторе, — это строковый идентификатор, по которому его получают в коде. Если переименовать макет, все вызовы ПолучитьМакет("СтароеИмя") перестанут работать, поэтому после переименования проверьте весь модуль объекта и модуль формы на предмет старых строковых литералов.
Для печатных форм чаще всего используют макет типа «Табличный документ» с именованными областями: «Шапка», «Строка», «Подвал». Для отчётов на СКД макет компоновки обычно не требуется — достаточно основной схемы компоновки данных, которая тоже является макетом и получается тем же методом.
Получение макета в модуле объекта отчёта
Основной и самый надёжный способ — получить макет в модуле объекта внешнего отчёта. Там метод ПолучитьМакет() доступен напрямую, без дополнительных обращений. Это работает и в обычном, и в управляемом приложении.
Функция ПолучитьМакетПечати() Экспорт
Возврат ПолучитьМакет("МакетПечати");
КонецФункции
Процедура СформироватьПечатнуюФорму(ТабДокумент, ПараметрыОтбора) Экспорт
Макет = ПолучитьМакет("МакетПечати");
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
ТабДокумент.Вывести(ОбластьШапка);
// ... заполнение и вывод строк
КонецПроцедуры
Обратите внимание: чтобы процедуры и функции модуля объекта были видны извне, они должны иметь директиву Экспорт. Без неё вызов из формы завершится ошибкой «Процедура или функция с указанным именем не определена».
Аналогично получают схему компоновки данных, если отчёт построен на СКД без использования основной формы отчёта:
СхемаКД = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Макет = ПолучитьМакет("МакетПечати");
Область = Макет.ПолучитьОбласть("Шапка");
ТабДокумент.Вывести(Область);Как получить макет из модуля формы
Метод ПолучитьМакет() недоступен в модуле формы внешнего отчёта — это ограничение платформы. Попытка вызвать его напрямую даёт ошибку «Метод объекта не обнаружен (ПолучитьМакет)». Обойти ограничение можно двумя способами.
Способ 1: вызов экспортной функции модуля объекта
В модуле формы доступен реквизит Отчет (в управляемых формах — через Отчет как свойство объекта), но надёжнее оформить в модуле объекта экспортную функцию, возвращающую макет, и вызывать её. В обычном приложении обращение идёт через объект отчёта:
// Модуль формы (обычное приложение)
Макет = ЭтотОбъект.ПолучитьМакет("МакетПечати");
В обычном приложении ЭтотОбъект в модуле формы ссылается на объект отчёта, поэтому ПолучитьМакет() там работает. Проблема возникает именно в управляемых формах, где такой прямой связи нет.
Способ 2: формирование на сервере в управляемых формах
В управляемом приложении правильный подход — выполнить всю работу с макетом в серверной процедуре. Если отчёт открыт как внешний через «Файл — Открыть», форма не связана с объектом напрямую, и макет получают в модуле объекта, а в форму передают уже готовый табличный документ:
// Модуль объекта
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Макет = ПолучитьМакет("МакетОтчета");
// ... вывод областей в ДокументРезультат
КонецПроцедуры
Получение макета при программном открытии внешнего отчёта
Если внешний отчёт подключается программно из другого кода (например, из обработки или расширения), сначала создают объект отчёта, а затем вызывают его методы. В файловой базе и при отключённой защите это работает так:
ВнешнийОтчет = ВнешниеОтчеты.Создать("C:\Отчеты\МойОтчет.erf", Ложь);
Макет = ВнешнийОтчет.ПолучитьМакет("МакетПечати");
Второй параметр Ложь отключает использование защищённого соединения при создании. В клиент-серверном варианте метод ВнешниеОтчеты.Создать() доступен только на сервере, а путь к файлу должен быть доступен именно с сервера 1С, а не с клиентского компьютера — частая причина ошибки «файл не найден».
Более безопасная альтернатива — зарегистрировать отчёт в справочнике «Дополнительные отчеты и обработки» (подсистема БСП) и получать объект через программный интерфейс подсистемы, например ДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки(). Тогда не нужно хранить пути к файлам и вручную управлять безопасным режимом.
Как выбрать способ
Работа с областями и проверка результата
Полученный макет типа «Табличный документ» сам по себе не выводится — из него извлекают именованные области и последовательно выводят в результирующий табличный документ. Параметры областей заполняются через свойство Параметры:
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
ОбластьСтрока.Параметры.Номенклатура = Выборка.Номенклатура;
ОбластьСтрока.Параметры.Количество = Выборка.Количество;
ТабДокумент.Вывести(ОбластьСтрока);
Имена областей и параметров в коде должны точно совпадать с именами в макете, включая регистр. Если параметр в макете не создан, присваивание значения вызовет ошибку; если область названа иначе, ПолучитьОбласть() вернёт ошибку «Область не найдена».
Как проверить результат
Переменная содержит объект типа ТабличныйДокумент или СхемаКомпоновкиДанных
Ошибка «Макет не найден» — проверьте имя макета в конфигураторе
ПолучитьОбласть() возвращает область без исключения
Ошибка «Область не найдена» — имя области в коде не совпадает с макетом
В выведенном документе видны значения вместо пустых ячеек
Пустые ячейки или ошибка присваивания — параметр не объявлен в макете
Формирование проходит под целевой ролью без ошибок прав
Ошибка доступа — проверьте права на внешние отчёты и безопасный режим
Типичные ошибки и ограничения платформы
Большинство проблем при получении макета внешнего отчёта сводится к нескольким повторяющимся ситуациям. Их стоит проверять в первую очередь, прежде чем искать ошибку в логике формирования.
Ещё одно ограничение: внешний отчёт, открытый интерактивно через «Файл — Открыть», работает в контексте, где часть возможностей переопределения (например, собственная команда печати через БСП) недоступна без регистрации в справочнике дополнительных отчётов. Для полноценной интеграции отчёт следует подключать штатно, а не открывать файлом.
Альтернативы: СКД и программное построение без макета
Не всегда макет нужен. Если отчёт построен на схеме компоновки данных, результат формируется компоновщиком автоматически, и ручная работа с макетом требуется только для нестандартного оформления. Для простых выгрузок иногда проще заполнять табличный документ программно, без макета вообще, — но тогда оформление (шрифты, границы, цвета) придётся задавать кодом, что усложняет поддержку.
Сравнение подходов
Подходит для печатных форм и строгого оформления; требует ручного вывода областей
Подходит для аналитических отчётов с отборами и группировками; макет почти не нужен
Подходит для простых выгрузок; оформление целиком в коде, сложнее поддерживать
Практическая рекомендация: печатные формы делайте на макете табличного документа, аналитические отчёты — на СКД, а программное построение оставляйте для случаев, где структура результата полностью динамическая и не укладывается в шаблон.
Что важно запомнить
Макет внешнего отчёта получают методом ПолучитьМакет() в модуле объекта; из формы управляемого приложения метод недоступен — работу с макетом переносят на сервер или в экспортные процедуры объекта. Следите за совпадением имён макетов, областей и параметров, а при программном подключении учитывайте серверный контекст и безопасный режим.
Частые вопросы
Почему возникает ошибка «Метод объекта не обнаружен: ПолучитьМакет»?
Метод вызван в контексте, где он недоступен — чаще всего в модуле формы управляемого приложения. Перенесите получение макета в модуль объекта отчёта и вызывайте оттуда экспортную процедуру формирования.
Можно ли получить макет внешнего отчёта из другого отчёта или обработки?
Да. Создайте объект через ВнешниеОтчеты.Создать(ПутьКФайлу) на сервере и вызовите ПолучитьМакет() у созданного объекта. В клиент-серверной базе путь должен быть доступен с сервера, а безопасный режим не должен блокировать выполнение внешнего кода.
Как получить схему компоновки данных внешнего отчёта?
Тем же методом: ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных") в модуле объекта. Если схема одна и назначена основной, в типовом механизме отчёта она подхватывается автоматически.
Что делать, если после правки макета отчёт выводит старый шаблон?
Закройте отчёт в режиме Предприятия и откройте файл заново — открытый экземпляр держит в памяти прежнюю версию. Также убедитесь, что сохранён именно тот файл .erf, который открывается пользователями.
Можно ли хранить макет отдельно от файла отчёта?
Штатно макет хранится внутри .erf. Внешний шаблон (например, файл Excel или HTML) можно загружать через Новый ДвоичныеДанные(Путь) и обрабатывать программно, но это уже не макет в понимании платформы, и метод ПолучитьМакет() для него не используется.