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