СКД в 1С

Макет отчета в СКД 1С: собственные макеты группировок, полей и заголовков

Коротко

Собственный макет отчета в СКД описывается на вкладке «Макеты» схемы компоновки (коллекция Схема.Макеты), а затем привязывается к элементу отчёта: к группировке — через Схема.МакетыГруппировок, к полю — через Схема.МакетыПолей, к заголовку группировки — через Схема.МакетыЗаголовковГруппировок, к ячейкам ресурсов — через Схема.МакетыПолейИтога.

Макет меняет структуру выводимой области (состав и расположение ячеек), условное оформление — только внешний вид уже сформированных ячеек. Если нужно поменять цвет, шрифт или формат — берите условное оформление; если нужна другая вёрстка строки — собственный макет.

Когда нужен собственный макет отчета в СКД

По умолчанию компоновка сама генерирует области вывода из полей набора данных и структуры настроек. Этого хватает для 90% отчётов. Собственный макет в СКД имеет смысл, когда автоматическая генерация физически не может дать нужный результат:

  • в строке группировки нужны объединённые ячейки, несколько строк или картинка;
  • шапка отчёта содержит логотип, реквизиты организации, подписи;
  • требуется печатная форма фиксированной вёрстки (акт, реестр, бланк с рамками);
  • значение поля выводится в нетиповом виде — с расшифровкой в примечании или собственным форматом;
  • подвал группировки должен отличаться по структуре от заголовка.

Если задача сводится к «покрасить отрицательные суммы» или «выделить итог жирным» — макет не нужен, это работа условного оформления (см. раздел ниже).

Где хранятся макеты схемы компоновки

Макеты СКД живут внутри самой схемы, а не в макетах объекта конфигурации. Коллекция Схема.Макеты содержит элементы ОписаниеМакетаСхемыКомпоновкиДанных со свойствами Имя, Макет (тип МакетОбластиКомпоновкиДанных) и Параметры. В конструкторе схемы это вкладка «Макеты» → «Добавить макет».

Схема = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

// Все макеты, объявленные в схеме
Для Каждого Описание Из Схема.Макеты Цикл
    Сообщить(Описание.Имя + " — областей: "
        + Описание.Макет.Количество());
КонецЦикла;

// Найти конкретное описание макета по имени
Описание = Схема.Макеты.Найти("МакетСтрокиКонтрагента");
ОписанияМакетовСхемыКомпоновкиДанных
НайтиИмя — поиск описания макета по имени
Добавитьновое описание макета
Количествочисло макетов в схеме
ПолучитьИндекс
→ ОписаниеМакетаСхемыКомпоновкиДанных

Само по себе объявление макета ничего не выводит. Пока имя макета не привязано к группировке, полю или заголовку, отчёт продолжит использовать автоматически сгенерированные области — это первая причина «макет есть, а в отчёте его нет».

Макет группировки СКД: привязка к строке отчёта

Макет группировки в СКД 1С задаётся коллекцией Схема.МакетыГруппировок. Каждый элемент указывает, к какой группировке применяется макет и какую именно область группировки он заменяет — заголовок, подвал, общий итог.

МакетГруппировки = Схема.МакетыГруппировок.Добавить();
МакетГруппировки.ИмяГруппировки = "Контрагент";
МакетГруппировки.Макет = "МакетСтрокиКонтрагента";
МакетГруппировки.ТипМакета =
    ТипМакетаОбластиКомпоновкиДанных.Заголовок;

// Ограничить применение конкретными полями группировки
МакетГруппировки.ПоляГруппировки.Добавить("Контрагент");
МакетГруппировкиСхемыКомпоновкиДанных
ИмяГруппировкиСтрока — имя группировки, к которой применяется макет
МакетСтрока — имя макета из Схема.Макеты
ТипМакетаТипМакетаОбластиКомпоновкиДанных
ПоляГруппировкиМассив полей, к которым применяется макет

Значения ТипМакетаОбластиКомпоновкиДанных: Заголовок, Подвал, ЗаголовокИерархии, ПодвалИерархии, ОбщийИтогЗаголовок, ОбщийИтогПодвал. Один макет группировки закрывает одну область: чтобы переопределить и строку группировки, и её итог, добавляют два элемента коллекции с разным ТипМакета.

Отдельно есть Схема.МакетыПолейИтога — коллекция МакетыПолейИтогаСхемыКомпоновкиДанных. Её элементы применяются к областям ресурсов на пересечении двух группировок (свойства ИмяГруппировки1, ИмяГруппировки2, ТипМакета1, ТипМакета2) — это нужный инструмент для кросс-таблиц.

Имена группировок в схеме и в настройках варианта отчёта должны совпадать буква в букву. Если макет «молча» не применился, попросите агента ИИ Консоли отчётов 1С сверить Схема.МакетыГруппировок и фактические группировки из Настройки.Структура — расхождение видно сразу.

Макет поля СКД: своя вёрстка одной ячейки

Макет поля переопределяет вывод конкретного поля во всех областях, где оно встречается. Коллекция — Схема.МакетыПолей, элемент содержит всего два свойства: имя поля и имя макета.

МакетПоля = Схема.МакетыПолей.Добавить();
МакетПоля.Поле  = "СуммаОборот";
МакетПоля.Макет = "МакетСуммыСИндикатором";

// Проверить, не задан ли макет для поля ранее
Существующий = Схема.МакетыПолей.Найти("МакетСуммыСИндикатором");
Если Существующий <> Неопределено Тогда
    Сообщить("Макет уже используется полем: " + Существующий.Поле);
КонецЕсли;
МакетыПолейСхемыКомпоновкиДанных
Добавитьновый макет поля
НайтиИмя — поиск элемента коллекции по имени
УдалитьЭлемент
Количествочисло макетов полей
→ МакетПоляСхемыКомпоновкиДанных

Имя поля указывается так, как оно доступно в компоновке: для ресурса это имя поля набора данных (СуммаОборот), для поля группировки — путь к полю (Номенклатура.Артикул). Макет поля применяется и в заголовке, и в детальных записях, поэтому в самом макете обычно оставляют одну ячейку с параметром.

Макет заголовка группировки и шапки отчёта

Для заголовков есть отдельная коллекция Схема.МакетыЗаголовковГруппировок того же типа МакетыГруппировокСхемыКомпоновкиДанных. Она отвечает за строку с названием группировки и подписями колонок, а не за саму строку данных.

МакетЗаголовка = Схема.МакетыЗаголовковГруппировок.Добавить();
МакетЗаголовка.ИмяГруппировки = "Номенклатура";
МакетЗаголовка.Макет = "ШапкаНоменклатуры";
МакетЗаголовка.ТипМакета =
    ТипМакетаОбластиКомпоновкиДанных.Заголовок;

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

1С СКД: оформление, условное оформление и макет оформления

Три разных механизма, которые часто путают:

  • Собственный макет — меняет структуру области вывода: какие ячейки есть, как они объединены, что в них выводится.
  • Условное оформление СКД — Настройки.УсловноеОформление.Элементы. Задаёт внешний вид ячеек по условию отбора: цвет, шрифт, формат, видимость.
  • Макет оформления — МакетОформленияКомпоновкиДанных, набор стилевых параметров областей отчёта (то, что в конструкторе выбирается как «оформление» варианта).
Элемент = Настройки.УсловноеОформление.Элементы.Добавить();

ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(
    Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение =
    Новый ПолеКомпоновкиДанных("СуммаОборот");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Меньше;
ОтборЭлемента.ПравоеЗначение = 0;

Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста",
    Новый Цвет(180, 0, 0));

ОформляемоеПоле = Элемент.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("СуммаОборот");

Элемент.ИспользоватьВЗаголовке = Ложь;
Элемент.Использование = Истина;
ЭлементУсловногоОформленияКомпоновкиДанных
Отборусловие применения оформления
ОформлениеОформлениеКомпоновкиДанных — параметры вида
Поляоформляемые поля; пусто — вся строка
ИспользоватьВЗаголовкеприменять к заголовку
ИспользоватьВОбщемИтогеприменять к общему итогу
Использованиевключён ли элемент

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

Макет оформления передаётся четвёртым параметром компоновщика. Это коллекция значений параметров, где имя параметра — имя области отчёта:

МакетОформления = Новый МакетОформленияКомпоновкиДанных;
// ... заполнение областей оформления ...

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(
    Схема, Настройки, ДанныеРасшифровки, МакетОформления);

Вывод отчёта с макетом в табличный документ

Полный программный цикл: компоновщик собирает макет компоновки из схемы и настроек, процессор компоновки выдаёт элементы результата, процессор вывода кладёт их в табличный документ.

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(
    Схема, Настройки, ДанныеРасшифровки);

ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(
    МакетКомпоновки, , ДанныеРасшифровки, Истина);

ТабДок = Новый ТабличныйДокумент;
ПроцессорВывода = Новый
    ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабДок);
ПроцессорВывода.Вывести(ПроцессорКомпоновки, Истина);
ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент
УстановитьДокументДокумент — куда выводить результат
ВывестиПроцессорКомпоновки
ВозможностьПрерыванияПользователемвторой параметр метода Вывести
ОтображатьПроцентВыводаиндикатор процента
→ ТабличныйДокумент

Когда нужно вмешаться между элементами результата — например, вставить свою область после каждой группировки или посчитать что-то по ходу вывода — используют пошаговый режим:

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

ЭлементРезультата = ПроцессорКомпоновки.Следующий();
Пока ЭлементРезультата <> Неопределено Цикл
    ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
    ЭлементРезультата = ПроцессорКомпоновки.Следующий();
КонецЦикла;

ПроцессорВывода.ЗакончитьВывод();
Пошаговый вывод
НачатьВыводподготовка к выводу
СледующийЭлементРезультатаКомпоновкиДанных или Неопределено
ВывестиЭлементЭлементРезультата
ЗакончитьВыводзавершение вывода
→ ТабличныйДокумент

У ЭлементРезультатаКомпоновкиДанных доступны Макет (имя выводимого макета), ЗначенияПараметров и ТипЭлемента — по ним видно, какой именно макет компоновка выбрала для конкретной строки. Это самый прямой способ проверить, применилась ли ваша привязка.

Проверить свой макет на реальных данных без изменения конфигурации можно через ИИ Консоль отчётов 1С: агент соберёт внешний отчёт .erf, откроет его в вашей базе 1С и проверит, как отрисовались группировки и итоги.

Частые ошибки при работе с макетами СКД

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

Частые вопросы о макетах в СКД

Чем макет группировки отличается от условного оформления в СКД?

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

Почему собственный макет не применяется к отчёту?

Чаще всего макет объявлен в Схема.Макеты, но не привязан ни к одной коллекции, либо ИмяГруппировки не совпадает с именем группировки в настройках варианта, либо указан не тот ТипМакета — например, Заголовок вместо Подвал.

Как вывести результат компоновки с макетом в табличный документ?

Соберите макет компоновки методом КомпоновщикМакетаКомпоновкиДанных.Выполнить(), инициализируйте ПроцессорКомпоновкиДанных, затем через ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент вызовите УстановитьДокумент() и Вывести(). Для вмешательства между элементами используйте НачатьВывод(), ВывестиЭлемент() и ЗакончитьВывод().

Тарифы

ИИ Консоль отчётов 1С

Лайт

Бесплатно

Для ознакомления с возможностями

  • Все функции бесплатно на 2 дня +2 дня за подписку на Telegram или Max
  • Полный набор инструментов без урезаний
  • Без ввода карты

Ранний доступ

Популярный выбор
Бесплатно

Тестирование продукта в режиме разработки

  • Формирование панелей и виджетов в чате
  • Поддержка таблиц и популярных типов диаграмм
  • Приоритетный сбор обратной связи по развитию продукта