Часто при разработке отчетов на базе Системы Компоновки Данных (СКД) возникает необходимость вывести данные в виде сложной кросс-таблицы. Давайте рассмотрим подробнее ситуацию, когда нам нужно отобразить месяцы в качестве колонок, а внутри каждого месяца вывести подчиненные колонки — статусы документов или процессов (например: «Предварительный», «Подписанный», «Скорректированный»).
Вместе мы разберем по шагам, как правильно создать такую структуру в настройках СКД, выясним причину возникновения «рваных» или несимметричных таблиц и проанализируем ситуацию с расчетом итогов по таким группировкам.
Для начала настроим базовую структуру. Чтобы получить двумерную таблицу, перейдем на вкладку «Настройки» в схеме компоновки данных и добавим новый элемент структуры. Выберем элемент Таблица.
Контрагент или Договор.Период (или Месяц).Период и добавим внутрь нее подчиненную группировку по полю Статус.Количество или Сумма.Важнейший момент: если в запросе или на вкладке «Ресурсы» не определить ресурс, СКД не сможет корректно построить кросс-таблицу, и данные выведутся в виде иерархического списка слева, а не в виде колонок. Обязательно убедитесь, что ваши числовые показатели добавлены в ресурсы!
Проанализируем ситуацию, с которой вы наверняка столкнетесь: если в одном из месяцев не было, например, документов со статусом «Предварительный», СКД просто не выведет эту колонку для данного месяца. В результате под сентябрем у вас будет 4 колонки, а под ноябрем — только 3. Табличная часть поедет, и читать такой отчет будет неудобно.
Чтобы жестко зафиксировать состав колонок для всех месяцев, рассмотрим два основных метода.
Метод 1: Левое соединение в запросе
Мы можем модифицировать исходный запрос. Основная таблица с нашими данными должна связываться левым соединением (LEFT JOIN) с полным перечнем возможных статусов и полным календарем периодов. В таком случае в наборе данных всегда будут формироваться записи для всех комбинаций статусов и периодов (с нулевыми значениями ресурсов или NULL), и СКД отрисует идеально ровную таблицу.
Метод 2: Использование вычисляемых ресурсов
Посмотрим на пример решения проблемы на уровне настроек СКД. Вместо того чтобы делать динамическую группировку колонок по полю Статус, мы можем разбить наш ресурс на несколько независимых полей. Уберем подчиненную группировку Статус из колонок и оставим только Период.
На вкладке «Вычисляемые поля» или прямо в запросе создадим новые ресурсы под каждый статус. Формула для вычисления ресурса будет выглядеть так:
СУММА(ВЫБОР
КОГДА Статус = Значение(Перечисление.Статусы.Предварительный)
ТОГДА Количество
ИНАЧЕ 0
КОНЕЦ)
Аналогичные поля создаются для всех остальных статусов. Затем мы просто добавляем эти новые вычисляемые ресурсы в выбранные поля группировки Период. Это гарантирует абсолютно одинаковую ширину и состав колонок для каждого выводимого месяца.
При использовании двухуровневой группировки колонок шапка таблицы может стать громоздкой. Часто выводится лишняя строка с техническим названием поля перед самими значениями.
Чтобы сделать отчет визуально чище, поработаем с настройками:
Расположение общих итогов, отключив их, если они дублируют данные или растягивают шапку.Если в контексте статуса вам нужно рассчитать долю от общего итога месяца (например, какой процент составляют "Подписанные" документы от всех документов в ноябре), используем мощную встроенную функцию ВычислитьВыражение().
Эта функция позволяет обратиться к итогам родительской группировки (всего месяца) прямо из текущей колонки статуса, что открывает огромные возможности для аналитики. Таким образом, грамотно комбинируя группировки, ресурсы и вычисляемые выражения, мы получаем гибкий и красивый кросс-отчет.