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