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