СКД в 1С

Группировки и итоги в СКД 1С: уровни, ресурсы, общий итог

Коротко

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

Вывод итогов управляется параметрами вывода: ПараметрыВывода.УстановитьЗначениеПараметра("РасположениеИтогов", ...) со значениями РасположениеИтоговКомпоновкиДанныхНачало, Конец, НачалоИКонец, Нет, Авто. Тот же параметр на корне настроек убирает или возвращает общий итог.

Структура отчёта: уровни группировок в СКД

Структура настроек — это дерево элементов. Группировка добавляется в Настройки.Структура, вложенная группировка — в Структура самой группировки. Уровень вложенности и определяет уровень итога: чем выше группировка, тем более агрегированные данные в её итоговой строке.

Настройки = КомпоновщикНастроек.Настройки;
Настройки.Структура.Очистить();

// Верхний уровень группировки строк
ГруппировкаКонтрагент = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
ГруппировкаКонтрагент.Имя = "ПоКонтрагентам";

// Вложенный уровень
ГруппировкаНоменклатура = ГруппировкаКонтрагент.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
ГруппировкаНоменклатура.Имя = "ПоНоменклатуре";
Структура.Добавить
Типтип создаваемого элемента структуры
ГруппировкаКомпоновкиДанных
Имяимя элемента структуры
Использованиеучаствует ли элемент в компоновке
ПоляГруппировкиполя текущего уровня
ПараметрыВыводавывод заголовка, итогов, ресурсов

У коллекции структуры есть и остальные методы работы со списком: Вставить(<Индекс>, <Тип>), Получить(<Индекс>), Сдвинуть(<Элемент>, <Смещение>), Удалить(<Элемент>), Количество(), Очистить(). Свойство Использование позволяет отключить целый уровень без удаления настройки.

Группировка полей: чем задаётся уровень

Группировка полей в СКД — это набор элементов коллекции ПоляГруппировки.Элементы. Если на уровне указано два поля, строки схлопываются по их комбинации, а итог считается по паре значений.

ПолеГруппировки = ГруппировкаНоменклатура.ПоляГруппировки.Элементы.Добавить(
    Тип("ПолеГруппировкиКомпоновкиДанных"));
ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных("Номенклатура");
ПолеГруппировки.ТипГруппировки = ТипГруппировкиКомпоновкиДанных.Элементы;
ПолеГруппировки.Использование = Истина;
ПоляГруппировки.Элементы.Добавить
ТипПолеГруппировкиКомпоновкиДанных
ПолеГруппировкиКомпоновкиДанных
Полеполе группировки
ТипГруппировкиЭлементы, Иерархия, ТолькоИерархия
ТипДополнениядополнение периода
НачалоПериодаграница дополнения
КонецПериодаграница дополнения

Для полей типа «дата» пустые интервалы закрываются дополнением периода: ТипДополнения = ТипДополненияПериодаКомпоновкиДанных.Месяц вместе с НачалоПериода и КонецПериода даст строки за месяцы без движений — с нулевыми ресурсами, а не с пропуском. Доступные значения перечисления охватывают шкалу от секунды до года, включая варианты «от начала периода» и 4-4-5.

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

Детальные записи: группировка без полей

Группировка, у которой коллекция ПоляГруппировки.Элементы пуста, — это детальные записи. Она выводит строки набора данных как есть, без агрегации, и в конструкторе отображается как «Детальные записи».

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

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

Иерархия в группировке строк

Тип группировки определяет, как разворачивается иерархический справочник:

  • ТипГруппировкиКомпоновкиДанных.Элементы — плоский список элементов без групп;
  • ТипГруппировкиКомпоновкиДанных.Иерархия — элементы внутри групп-родителей, с итогами по каждой группе;
  • ТипГруппировкиКомпоновкиДанных.ТолькоИерархия — только группы-родители, элементы не выводятся.

Иерархические итоги считаются самой СКД: значение ресурса в строке группы — это сумма по всем её потомкам. Отдельное поле «Родитель» в группировке для этого добавлять не нужно, а попытка сгруппировать одновременно по родителю и по элементу с типом Иерархия задваивает суммы.

Группировка ресурсов: по каким уровням считается значение

Ресурс описывается в схеме компоновки: выражение (Сумма(СуммаОборот), Максимум(Дата)) и список группировок в поле «Рассчитывать по…». Этот список и есть используемые группировки ресурса:

  • список пуст — ресурс считается на всех уровнях структуры, включая общий итог;
  • указаны конкретные группировки — на остальных уровнях, в том числе в общем итоге, ячейка останется пустой;
  • ресурс попадает в отчёт только если его поле выбрано в Выбор группировки или унаследовано с верхнего уровня.
// Ресурс выводится на конкретном уровне группировки
ПолеРесурса = ГруппировкаКонтрагент.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ПолеРесурса.Поле = Новый ПолеКомпоновкиДанных("СуммаОборот");
ПолеРесурса.Заголовок = "Сумма продаж";
ПолеРесурса.Использование = Истина;

Взаимное расположение ресурсов задаётся параметрами вывода: "РасположениеРесурсов" со значениями РасположениеРесурсовКомпоновкиДанных.Горизонтально или Вертикально и "АвтоПозицияРесурсов" со значениями АвтоПозицияРесурсовКомпоновкиДанных.ПослеВсехПолей или НеИспользовать.

Общий итог в СКД: откуда он берётся

Общий итог в СКД — это агрегат по всей выборке на корневом уровне настроек, поверх верхней группировки. Отдельного элемента структуры для него нет: система формирует его сама, если в отчёте есть ресурсы и вывод итогов не отключён параметрами вывода корня настроек.

// Убрать общий итог из отчёта
Настройки.ПараметрыВывода.УстановитьЗначениеПараметра(
    "РасположениеИтогов", РасположениеИтоговКомпоновкиДанных.Нет);

// Вернуть и показать его первой строкой
Настройки.ПараметрыВывода.УстановитьЗначениеПараметра(
    "РасположениеИтогов", РасположениеИтоговКомпоновкиДанных.Начало);
УстановитьЗначениеПараметра
Параметримя параметра вывода
Значениеустанавливаемое значение
НайтиЗначениеПараметраполучить текущее значение
ДоступныеПараметрычто можно задать на этом уровне
ЗначениеПараметраКомпоновкиДанных у поиска

Для элемента структуры типа «таблица» общие итоги по строкам и колонкам управляются отдельно — параметрами вывода "ВертикальноеРасположениеОбщихИтогов" и "ГоризонтальноеРасположениеОбщихИтогов" с теми же значениями РасположениеИтоговКомпоновкиДанных. Если общий итог «пропал» именно в кросс-таблице, проверять нужно эти два параметра, а не корень настроек.

Как вывести итоги по уровням и убрать лишние

Тот же параметр "РасположениеИтогов" работает на уровне отдельной группировки и перекрывает настройку корня. Так можно вывести итоги только там, где они нужны:

// Итог по контрагенту — строкой перед его номенклатурой
ГруппировкаКонтрагент.ПараметрыВывода.УстановитьЗначениеПараметра(
    "РасположениеИтогов", РасположениеИтоговКомпоновкиДанных.Начало);

// На нижнем уровне итог не нужен
ГруппировкаНоменклатура.ПараметрыВывода.УстановитьЗначениеПараметра(
    "РасположениеИтогов", РасположениеИтоговКомпоновкиДанных.Нет);

// Скрыть вывод самой группировки, оставив её влияние на расчёт
ГруппировкаНоменклатура.ПараметрыВывода.УстановитьЗначениеПараметра(
    "Выводить", ТипВыводаТекстаКомпоновкиДанных.НеВыводить);

Ещё один параметр, влияющий на читаемость итогов, — "РасположениеПолейГруппировки": Вместе собирает поля уровня в одной колонке, Отдельно разносит по колонкам, ОтдельноИТолькоВИтогах оставляет значения полей только в итоговых строках. Значение Авто у расположения итогов означает «как решит система вывода» и не гарантирует наличие итоговой строки — при явных требованиях к отчёту задавайте значение прямо.

Программная настройка группировок и итогов целиком

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

Настройки = КомпоновщикНастроек.Настройки;

Идентификатор = Настройки.ПолучитьИдентификаторПоОбъекту(ГруппировкаКонтрагент);
НайденнаяГруппировка = Настройки.ПолучитьОбъектПоИдентификатору(Идентификатор);

Если НайденнаяГруппировка <> Неопределено Тогда
    НайденнаяГруппировка.Использование = Истина;
    НайденнаяГруппировка.ПараметрыВывода.УстановитьЗначениеПараметра(
        "РасположениеИтогов", РасположениеИтоговКомпоновкиДанных.Конец);
КонецЕсли;

Если Настройки.НаличиеПараметровВыводаУЭлемента(ГруппировкаНоменклатура) Тогда
    Настройки.ОчиститьПараметрыВыводаЭлемента(ГруппировкаНоменклатура);
КонецЕсли;
НастройкиКомпоновкиДанных
ПолучитьИдентификаторПоОбъекту(<Объект>) → ИдентификаторКомпоновкиДанных
ПолучитьОбъектПоИдентификатору(<Идентификатор>) → элемент настроек
НаличиеПараметровВыводаУЭлемента(<Элемент>) → Булево
ОчиститьПараметрыВыводаЭлемента(<Элемент>)
НастройкиЭлемента(<Элемент>) → НастройкиКомпоновкиДанных
Структура, Выбор, ПараметрыВывода

Идентификатор элемента настроек нужен, когда группировку требуется найти в чужой схеме или сохранить ссылку на неё между вызовами: объект настроек после перезагрузки будет другим, а идентификатор останется прежним.

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

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

  • Ресурс с ограниченным «Рассчитывать по…». Если в списке используемых группировок указана только нижняя группировка, в общем итоге ячейка будет пустой. Для итога по всей выборке список оставляют пустым либо добавляют в него нужные уровни.
  • Поле выведено, но не является ресурсом. Обычное поле в группировке показывает значение первой записи уровня, а не сумму. Агрегат появляется только у поля, описанного как ресурс схемы.
  • Ожидание итогов от детальных записей. Группировка без полей группировки ничего не агрегирует. Итог даёт родительский уровень или общий итог.
  • Группировка по родителю вместе с типом «Иерархия». Иерархические итоги СКД считает сама; дополнительное поле-родитель даёт задвоение сумм.
  • Настройка итогов не на том уровне. Параметр вывода группировки перекрывает корень настроек: если общий итог не появляется, проверьте "РасположениеИтогов" и у корня, и у элемента структуры, а в кросс-таблице — параметры общих итогов по вертикали и горизонтали.
  • Правка настроек схемы вместо настроек компоновщика. Изменения в СхемаКомпоновкиДанных.НастройкиПоУмолчанию не попадут в уже открытый отчёт — менять нужно КомпоновщикНастроек.Настройки.
  • Отключённая группировка. Использование = Ложь убирает уровень из компоновки целиком вместе с его итогами — это частая причина «исчезнувших» промежуточных строк.

Частые вопросы про группировки и итоги в СКД

Как убрать общий итог в СКД?

В параметрах вывода корня настроек задайте РасположениеИтогов = РасположениеИтоговКомпоновкиДанных.Нет. В кросс-таблице общие итоги убираются отдельно — параметрами вывода "ВертикальноеРасположениеОбщихИтогов" и "ГоризонтальноеРасположениеОбщихИтогов".

Почему ресурс пустой в итоговой строке?

Чаще всего в схеме у ресурса ограничен список используемых группировок в поле «Рассчитывать по…»: на уровнях, которых там нет, значение не вычисляется. Второй вариант — поле выбрано как обычное, а не описано ресурсом схемы.

Чем детальные записи отличаются от группировки?

Детальные записи — группировка с пустой коллекцией полей группировки: строки выводятся без агрегации. Как только в ПоляГруппировки.Элементы добавлено поле, уровень схлопывает записи и считает по ним итоги ресурсов.

Тарифы

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

Лайт

Бесплатно

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

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

Старт

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

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

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

Продвинутый

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

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

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