Макет отчета в СКД 1С: собственные макеты группировок, полей и заголовков
Собственный макет отчета в СКД описывается на вкладке «Макеты» схемы компоновки
(коллекция Схема.Макеты), а затем привязывается к элементу отчёта:
к группировке — через Схема.МакетыГруппировок, к полю — через
Схема.МакетыПолей, к заголовку группировки — через
Схема.МакетыЗаголовковГруппировок, к ячейкам ресурсов — через
Схема.МакетыПолейИтога.
Макет меняет структуру выводимой области (состав и расположение ячеек), условное оформление — только внешний вид уже сформированных ячеек. Если нужно поменять цвет, шрифт или формат — берите условное оформление; если нужна другая вёрстка строки — собственный макет.
Когда нужен собственный макет отчета в СКД
По умолчанию компоновка сама генерирует области вывода из полей набора данных и структуры настроек. Этого хватает для 90% отчётов. Собственный макет в СКД имеет смысл, когда автоматическая генерация физически не может дать нужный результат:
- в строке группировки нужны объединённые ячейки, несколько строк или картинка;
- шапка отчёта содержит логотип, реквизиты организации, подписи;
- требуется печатная форма фиксированной вёрстки (акт, реестр, бланк с рамками);
- значение поля выводится в нетиповом виде — с расшифровкой в примечании или собственным форматом;
- подвал группировки должен отличаться по структуре от заголовка.
Если задача сводится к «покрасить отрицательные суммы» или «выделить итог жирным» — макет не нужен, это работа условного оформления (см. раздел ниже).
Где хранятся макеты схемы компоновки
Макеты СКД живут внутри самой схемы, а не в макетах объекта конфигурации. Коллекция
Схема.Макеты содержит элементы ОписаниеМакетаСхемыКомпоновкиДанных
со свойствами Имя, Макет (тип МакетОбластиКомпоновкиДанных)
и Параметры. В конструкторе схемы это вкладка «Макеты» → «Добавить макет».
Схема = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
// Все макеты, объявленные в схеме
Для Каждого Описание Из Схема.Макеты Цикл
Сообщить(Описание.Имя + " — областей: "
+ Описание.Макет.Количество());
КонецЦикла;
// Найти конкретное описание макета по имени
Описание = Схема.Макеты.Найти("МакетСтрокиКонтрагента");
Само по себе объявление макета ничего не выводит. Пока имя макета не привязано к группировке, полю или заголовку, отчёт продолжит использовать автоматически сгенерированные области — это первая причина «макет есть, а в отчёте его нет».
Макет группировки СКД: привязка к строке отчёта
Макет группировки в СКД 1С задаётся коллекцией Схема.МакетыГруппировок. Каждый элемент
указывает, к какой группировке применяется макет и какую именно область группировки он заменяет —
заголовок, подвал, общий итог.
МакетГруппировки = Схема.МакетыГруппировок.Добавить();
МакетГруппировки.ИмяГруппировки = "Контрагент";
МакетГруппировки.Макет = "МакетСтрокиКонтрагента";
МакетГруппировки.ТипМакета =
ТипМакетаОбластиКомпоновкиДанных.Заголовок;
// Ограничить применение конкретными полями группировки
МакетГруппировки.ПоляГруппировки.Добавить("Контрагент");
Значения ТипМакетаОбластиКомпоновкиДанных: Заголовок, Подвал,
ЗаголовокИерархии, ПодвалИерархии, ОбщийИтогЗаголовок,
ОбщийИтогПодвал. Один макет группировки закрывает одну область: чтобы
переопределить и строку группировки, и её итог, добавляют два элемента коллекции с разным
ТипМакета.
Отдельно есть Схема.МакетыПолейИтога — коллекция
МакетыПолейИтогаСхемыКомпоновкиДанных. Её элементы применяются к областям ресурсов на
пересечении двух группировок (свойства ИмяГруппировки1, ИмяГруппировки2,
ТипМакета1, ТипМакета2) — это нужный инструмент для кросс-таблиц.
Схема.МакетыГруппировок
и фактические группировки из Настройки.Структура в одну таблицу — расхождение видно сразу.
Макет поля СКД: своя вёрстка одной ячейки
Макет поля переопределяет вывод конкретного поля во всех областях, где оно встречается. Коллекция —
Схема.МакетыПолей, элемент содержит всего два свойства: имя поля и имя макета.
МакетПоля = Схема.МакетыПолей.Добавить();
МакетПоля.Поле = "СуммаОборот";
МакетПоля.Макет = "МакетСуммыСИндикатором";
// Проверить, не задан ли макет для поля ранее
Существующий = Схема.МакетыПолей.Найти("МакетСуммыСИндикатором");
Если Существующий <> Неопределено Тогда
Сообщить("Макет уже используется полем: " + Существующий.Поле);
КонецЕсли;
Имя поля указывается так, как оно доступно в компоновке: для ресурса это имя поля набора данных
(СуммаОборот), для поля группировки — путь к полю (Номенклатура.Артикул).
Макет поля применяется и в заголовке, и в детальных записях, поэтому в самом макете обычно оставляют
одну ячейку с параметром.
Макет заголовка группировки и шапки отчёта
Для заголовков есть отдельная коллекция Схема.МакетыЗаголовковГруппировок того же типа
МакетыГруппировокСхемыКомпоновкиДанных. Она отвечает за строку с названием группировки
и подписями колонок, а не за саму строку данных.
МакетЗаголовка = Схема.МакетыЗаголовковГруппировок.Добавить();
МакетЗаголовка.ИмяГруппировки = "Номенклатура";
МакетЗаголовка.Макет = "ШапкаНоменклатуры";
МакетЗаголовка.ТипМакета =
ТипМакетаОбластиКомпоновкиДанных.Заголовок;
Логотип, реквизиты и период отчёта проще выводить не макетом группировки, а собственной областью табличного документа перед вызовом процессора вывода — так шапка не будет повторяться при выводе по частям и не сломает горизонтальные группировки.
1С СКД: оформление, условное оформление и макет оформления
Три разных механизма, которые часто путают:
- Собственный макет — меняет структуру области вывода: какие ячейки есть, как они объединены, что в них выводится.
-
Условное оформление СКД —
Настройки.УсловноеОформление.Элементы. Задаёт внешний вид ячеек по условию отбора: цвет, шрифт, формат, видимость. -
Макет оформления —
МакетОформленияКомпоновкиДанных, набор стилевых параметров областей отчёта (то, что в конструкторе выбирается как «оформление» варианта).
Элемент = Настройки.УсловноеОформление.Элементы.Добавить();
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(
Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение =
Новый ПолеКомпоновкиДанных("СуммаОборот");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Меньше;
ОтборЭлемента.ПравоеЗначение = 0;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста",
Новый Цвет(180, 0, 0));
ОформляемоеПоле = Элемент.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("СуммаОборот");
Элемент.ИспользоватьВЗаголовке = Ложь;
Элемент.Использование = Истина;
Ключевой момент: условное оформление применяется поверх собственного макета, но только к тем ячейкам, которые компоновка считает полями. Ячейки-константы, дописанные в макет вручную (текст, рамки, подписи), условным оформлением не управляются — их вид задаётся прямо в макете.
Макет оформления передаётся четвёртым параметром компоновщика. Это коллекция значений параметров, где имя параметра — имя области отчёта:
МакетОформления = Новый МакетОформленияКомпоновкиДанных;
// ... заполнение областей оформления ...
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(
Схема, Настройки, ДанныеРасшифровки, МакетОформления);
Вывод отчёта с макетом в табличный документ
Полный программный цикл: компоновщик собирает макет компоновки из схемы и настроек, процессор компоновки выдаёт элементы результата, процессор вывода кладёт их в табличный документ.
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(
Схема, Настройки, ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(
МакетКомпоновки, , ДанныеРасшифровки, Истина);
ТабДок = Новый ТабличныйДокумент;
ПроцессорВывода = Новый
ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабДок);
ПроцессорВывода.Вывести(ПроцессорКомпоновки, Истина);
Когда нужно вмешаться между элементами результата — например, вставить свою область после каждой группировки или посчитать что-то по ходу вывода — используют пошаговый режим:
ПроцессорВывода.УстановитьДокумент(ТабДок);
ПроцессорВывода.НачатьВывод();
ЭлементРезультата = ПроцессорКомпоновки.Следующий();
Пока ЭлементРезультата <> Неопределено Цикл
ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
ЭлементРезультата = ПроцессорКомпоновки.Следующий();
КонецЦикла;
ПроцессорВывода.ЗакончитьВывод();
У ЭлементРезультатаКомпоновкиДанных доступны Макет (имя выводимого макета),
ЗначенияПараметров и ТипЭлемента — по ним видно, какой именно макет
компоновка выбрала для конкретной строки. Это самый прямой способ проверить, применилась ли
ваша привязка.
Частые ошибки при работе с макетами СКД
-
Макет объявлен, но не привязан. Запись в
Схема.Макетыне влияет на вывод сама по себе. Нужна строка вМакетыГруппировок,МакетыПолей,МакетыЗаголовковГруппировокилиМакетыПолейИтога. -
Несовпадение имени группировки.
ИмяГруппировкидолжно совпадать с именем группировки в структуре настроек. Опечатка или переименование группировки в варианте отчёта отключает макет без каких-либо сообщений. -
Неверный
ТипМакета. Макет с типомЗаголовокне заменит подвал группировки. Для строки и итога нужны два отдельных элемента коллекции. -
Попытка задать цвет через макет вместо условного оформления. Динамическое
оформление по условию — это
Настройки.УсловноеОформление. Зашитый в макет цвет не станет условным. - Параметр макета не заполняется. Имя параметра в ячейке макета должно соответствовать имени поля компоновки. Незаполненный параметр выводится пустой ячейкой, а не ошибкой.
-
Ручной вывод шапки внутри цикла
ВывестиЭлемент. Собственные области табличного документа выводятся доНачатьВыводили послеЗакончитьВывод, иначе ломается расчёт горизонтальных группировок. -
Забытый вызов
ЗакончитьВывод. При пошаговом выводе без него часть результата остаётся не сброшенной в табличный документ.
Частые вопросы о макетах в СКД
Чем макет группировки отличается от условного оформления в СКД?
Макет группировки задаёт структуру выводимой области — состав ячеек, их объединение и содержимое.
Условное оформление (Настройки.УсловноеОформление) меняет только внешний вид уже
сформированных ячеек по условию отбора: цвет, шрифт, формат, видимость. Структуру строки условным
оформлением изменить нельзя.
Почему собственный макет не применяется к отчёту?
Чаще всего макет объявлен в Схема.Макеты, но не привязан ни к одной коллекции, либо
ИмяГруппировки не совпадает с именем группировки в настройках варианта, либо указан
не тот ТипМакета — например, Заголовок вместо Подвал.
Как вывести результат компоновки с макетом в табличный документ?
Соберите макет компоновки методом КомпоновщикМакетаКомпоновкиДанных.Выполнить(),
инициализируйте ПроцессорКомпоновкиДанных, затем через
ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент вызовите
УстановитьДокумент() и Вывести(). Для вмешательства между элементами
используйте НачатьВывод(), ВывестиЭлемент() и ЗакончитьВывод().
ИИ Консоль запросов 1С
Лайт
Для ознакомления с возможностями
- Полный набор инструментов без урезаний
- Без ввода карты
Старт
Популярный выборДля индивидуального использования
- До 5ти конфигураций
-
≈ 100 задач Подробнее про лимиты
- Техническая поддержка
Продвинутый
Для интенсивного использования или команд
- До 15-ти конфигураций
-
≈ 300 задач Подробнее про лимиты
- Техническая поддержка