Как настроить структуру отчета в СКД с вложенными колонками по периодам и статусам

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Вместе мы разберем по шагам, как правильно создать такую структуру в настройках СКД, выясним причину возникновения «рваных» или несимметричных таблиц и проанализируем ситуацию с расчетом итогов по таким группировкам.

Базовая настройка кросс-таблицы в СКД

Для начала настроим базовую структуру. Чтобы получить двумерную таблицу, перейдем на вкладку «Настройки» в схеме компоновки данных и добавим новый элемент структуры. Выберем элемент Таблица.

  1. В узел Строки добавим нужные нам аналитические разрезы, например, Контрагент или Договор.
  2. В узел Колонки добавим группировку по полю Период (или Месяц).
  3. Теперь создадим вложенность: нажмем правой кнопкой мыши на только что созданную группировку Период и добавим внутрь нее подчиненную группировку по полю Статус.
  4. Перейдем на вкладку Выбранные поля для нашей таблицы и добавим туда поле-ресурс, например, Количество или Сумма.

Важнейший момент: если в запросе или на вкладке «Ресурсы» не определить ресурс, СКД не сможет корректно построить кросс-таблицу, и данные выведутся в виде иерархического списка слева, а не в виде колонок. Обязательно убедитесь, что ваши числовые показатели добавлены в ресурсы!

Решение проблемы несимметричных колонок (отсутствие данных)

Проанализируем ситуацию, с которой вы наверняка столкнетесь: если в одном из месяцев не было, например, документов со статусом «Предварительный», СКД просто не выведет эту колонку для данного месяца. В результате под сентябрем у вас будет 4 колонки, а под ноябрем — только 3. Табличная часть поедет, и читать такой отчет будет неудобно.

Чтобы жестко зафиксировать состав колонок для всех месяцев, рассмотрим два основных метода.

Метод 1: Левое соединение в запросе

Мы можем модифицировать исходный запрос. Основная таблица с нашими данными должна связываться левым соединением (LEFT JOIN) с полным перечнем возможных статусов и полным календарем периодов. В таком случае в наборе данных всегда будут формироваться записи для всех комбинаций статусов и периодов (с нулевыми значениями ресурсов или NULL), и СКД отрисует идеально ровную таблицу.

Метод 2: Использование вычисляемых ресурсов

Посмотрим на пример решения проблемы на уровне настроек СКД. Вместо того чтобы делать динамическую группировку колонок по полю Статус, мы можем разбить наш ресурс на несколько независимых полей. Уберем подчиненную группировку Статус из колонок и оставим только Период.

На вкладке «Вычисляемые поля» или прямо в запросе создадим новые ресурсы под каждый статус. Формула для вычисления ресурса будет выглядеть так:


СУММА(ВЫБОР 
    КОГДА Статус = Значение(Перечисление.Статусы.Предварительный) 
    ТОГДА Количество 
    ИНАЧЕ 0 
КОНЕЦ)

Аналогичные поля создаются для всех остальных статусов. Затем мы просто добавляем эти новые вычисляемые ресурсы в выбранные поля группировки Период. Это гарантирует абсолютно одинаковую ширину и состав колонок для каждого выводимого месяца.

Оформление шапки таблицы

При использовании двухуровневой группировки колонок шапка таблицы может стать громоздкой. Часто выводится лишняя строка с техническим названием поля перед самими значениями.

Чтобы сделать отчет визуально чище, поработаем с настройками:

  1. Перейдем на вкладку Другие настройки для группировки.
  2. Изменим параметр Расположение общих итогов, отключив их, если они дублируют данные или растягивают шапку.
  3. Используем вкладку Макеты. Добавив макет заголовка группировки для наших колонок, мы сможем вручную нарисовать ячейки для месяцев и статусов. Это позволит жестко задать дизайн, цвета и ширину колонок, игнорируя стандартную генерацию СКД.

Использование сложных вычислений в колонках

Если в контексте статуса вам нужно рассчитать долю от общего итога месяца (например, какой процент составляют "Подписанные" документы от всех документов в ноябре), используем мощную встроенную функцию ВычислитьВыражение().

Эта функция позволяет обратиться к итогам родительской группировки (всего месяца) прямо из текущей колонки статуса, что открывает огромные возможности для аналитики. Таким образом, грамотно комбинируя группировки, ресурсы и вычисляемые выражения, мы получаем гибкий и красивый кросс-отчет.

← На главную