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

Отчеты и Аналитика · 11 мин

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

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

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

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

Что такое макет и какие типы бывают

Макет во внешнем отчете создаётся в конфигураторе на закладке «Макеты» объекта отчета. При создании конструктор предлагает выбрать тип макета, и от этого типа зависит, что вернёт метод ПолучитьМакет() и как с результатом работать дальше.

Наиболее распространённые типы:

  • Табличный документ — классический шаблон с областями, параметрами и заполнителями вида [Параметр]. Метод вернёт объект типа ТабличныйДокумент.
  • Макет компоновки данных — используется для вывода результата СКД вручную через процессор вывода. Возвращает МакетКомпоновкиДанных.
  • Схема компоновки данных — сама СКД, возвращает СхемаКомпоновкиДанных.
  • Двоичные данные, HTML-документ, текстовый документ — для вложенных файлов, редко используются в отчетах.

Для печатных форм чаще всего применяют табличный документ: в нём создают именованные области (Шапка, Строка, Подвал), а в коде эти области получают и выводят последовательно, подставляя данные.

Получение макета в модуле объекта отчета

Самый простой и правильный сценарий — обращение к макету внутри модуля объекта внешнего отчета. Здесь доступен контекст объекта, и макет получают через ЭтотОбъект:

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

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

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

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

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

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

Возврат ТабДокумент;

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

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

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

bsl
Макет = ЭтотОбъект.ПолучитьМакет("МакетПечати");
Область = Макет.ПолучитьОбласть("Шапка");
Область.Параметры.Заголовок = "Отчет за период";
ТабДокумент.Вывести(Область);

Получение макета из формы отчета

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

В управляемых формах объект отчета получают через преобразование реквизита в значение:

&НаСервере

Процедура СформироватьНаСервере()

ОбъектОтчета = РеквизитФормыВЗначение("Отчет");

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

// дальнейшая работа с макетом

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

В обычных формах (устаревший режим) объект доступен напрямую через ОтчетОбъект. После получения объекта работа с макетом идентична модулю объекта.

Важный нюанс: вызов РеквизитФормыВЗначение() возможен только на сервере. Если попытаться выполнить его в клиентской процедуре без директивы &НаСервере, код не скомпилируется или выдаст ошибку выполнения.

Получение макета из внешнего кода

Иногда макет внешнего отчета нужен из другого места конфигурации: из обработки, общего модуля или регламентного задания. Тогда сначала создают объект внешнего отчета, а затем вызывают его методы.

Через файл на диске

ВнешнийОтчет = ВнешниеОтчеты.Создать("C:\Отчеты\МойОтчет.erf");

Макет = ВнешнийОтчет.ПолучитьМакет("МакетПечати");

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

Через подключенный внешний отчет

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

Маршрут решения

Как выбрать способ

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

Работа с областями и параметрами макета

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

Внутри области могут быть параметры — ячейки с типом заполнения «Параметр» или «Шаблон». Параметры заполняются через коллекцию Параметры области:

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

Для Каждого СтрокаТовара Из ТаблицаТоваров Цикл

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

ОбластьСтрока.Параметры.Количество = СтрокаТовара.Количество;

ОбластьСтрока.Параметры.Сумма = СтрокаТовара.Сумма;

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

КонецЦикла;

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

Для шаблонных ячеек (тип «Шаблон») в тексте ячейки используются вставки вида [ИмяПараметра], и заполняются они через ту же коллекцию параметров. Это удобно для составных строк, например адреса из нескольких полей.

Альтернатива: вывод через СКД без ручного макета

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

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

МакетКомпоновки = КомпоновщикМакета.Выполнить(

СхемаКомпоновкиДанных,

Настройки);

ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;

ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

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

ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;

ПроцессорВывода.УстановитьДокумент(ТабДокумент);

ПроцессорВывода.Вывести(ПроцессорКомпоновки);

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

Сравнение подходов

Табличный документ + ПолучитьМакет

Полный ручной контроль над печатной формой; подходит для строгих бланков, но требует писать вывод каждой области

СКД с автоматическим выводом

Минимум кода, гибкие настройки пользователем; не подходит для жестко регламентированных печатных форм

СКД + программный вывод

Гибкость СКД и контроль над результатом; сложнее в разработке и отладке

FAQ: частые вопросы о макетах внешних отчетов

Почему возникает ошибка «Метод объекта не обнаружен: ПолучитьМакет» в форме отчета?

Метод вызван у формы, а не у объекта отчета. В управляемой форме сначала выполните РеквизитФормыВЗначение("Отчет") в серверной процедуре и вызывайте ПолучитьМакет у полученного объекта.

Можно ли хранить несколько макетов в одном внешнем отчете?

Да, количество макетов не ограничено. Каждый получают по своему имени: ПолучитьМакет("МакетА4"), ПолучитьМакет("МакетА5") и т.д. Это удобно для разных вариантов одной печатной формы.

Как получить макет, если внешний отчет подключен через «Дополнительные отчеты и обработки»?

Получите объект отчета через метод БСП ДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки(СсылкаНаЭлементСправочника), затем вызовите у него ПолучитьМакет или экспортную функцию формирования печатной формы.

Что вернёт ПолучитьМакет для макета типа «Схема компоновки данных»?

Объект типа СхемаКомпоновкиДанных. Его нельзя вывести напрямую в табличный документ — схему передают в компоновщик макета компоновки данных для дальнейшей обработки.

Работает ли ПолучитьМакет в тонком клиенте и веб-клиенте?

Да, но только в серверном контексте. Клиентская часть вызывает серверную процедуру, а готовый табличный документ возвращается на клиента для отображения или печати.

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

Штатного метода проверки существования макета нет. Используют попытку: Попытка Макет = ЭтотОбъект.ПолучитьМакет(Имя); Исключение ... КонецПопытки — с обработкой ситуации отсутствия макета.

Итог

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

Макет внешнего отчета получают методом ПолучитьМакет(Имя) у объекта отчета: через ЭтотОбъект в модуле объекта, через РеквизитФормыВЗначение в форме и через ВнешниеОтчеты.Создать из внешнего кода. Тип результата зависит от типа макета, а все вызовы выполняются только на сервере.