СКД в 1С

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

Коротко

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Тарифы

ИИ Консоль запросов 1С

Лайт

Бесплатно

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

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

Старт

Популярный выбор
990 руб. в месяц
≈ 5 млн токенов

Для индивидуального использования

Выбрать тариф

Продвинутый

3900 руб. в месяц
≈ 19,5 млн токенов

Для интенсивного использования или команд

Выбрать тариф