Как в СКД вывести показатели ресурсов в строках с группировкой по месяцам в колонках?

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

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

В этой статье мы подробно разберем, как решить эту задачу. Мы рассмотрим как метод модификации запроса (который выбрал автор темы), так и методы настройки самой схемы компоновки, которые могут быть полезны в различных ситуациях.

Постановка задачи

Представим, что у нас есть запрос к регистру продаж, который возвращает два числовых поля (ресурса): СуммаПродажиРуб и СуммаПродажиEUR. Нам необходимо построить отчет, где:

  1. Колонками являются периоды (месяцы), например, "Январь 2025".
  2. В строках выводится название показателя ("Сумма продажи").
  3. Внутри месяца данные разбиты на под-колонки или строки, отображающие рубли и евро.

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

Способ 1: Транспонирование таблицы в запросе (UNPIVOT)

Этот метод был выбран автором как рабочий. Суть его заключается в том, чтобы превратить "широкую" таблицу (где показатели находятся в разных колонках) в "длинную" (где показатели находятся в одной колонке значений, а их имя — в отдельной колонке-измерении). В чем-то этот подход напоминает реализацию таблицы умножения на СКД, где структура данных подготавливается под конкретную визуальную модель.

Для этого мы используем конструкцию ОБЪЕДИНИТЬ ВСЕ в языке запросов 1С.

Рассмотрим алгоритм действий:

Шаг 1. Подготовка данных во временную таблицу

Сначала мы получаем исходные данные и помещаем их во временную таблицу. Это важно для производительности, чтобы не обращаться к физическим таблицам базы данных несколько раз.


ВЫБРАТЬ
    Продажи.Период КАК Период,
    Продажи.СуммаРуб КАК СуммаРуб,
    Продажи.СуммаEUR КАК СуммаEUR
ПОМЕСТИТЬ ВТ_ИсходныеДанные
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, Месяц, ) КАК Продажи;

Шаг 2. "Разворот" таблицы (Транспонирование)

Теперь мы делаем выборку из временной таблицы дважды (или столько раз, сколько у нас ресурсов), объединяя результаты. При этом мы создаем искусственное поле ИмяПоказателя.


ВЫБРАТЬ
    ВТ.Период КАК Период,
    "Сумма в рублях" КАК ИмяПоказателя,
    ВТ.СуммаРуб КАК Значение
ИЗ
    ВТ_ИсходныеДанные КАК ВТ

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ВТ.Период,
    "Сумма в EUR",
    ВТ.СуммаEUR
ИЗ
    ВТ_ИсходныеДанные КАК ВТ

Шаг 3. Настройка СКД

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

  1. В поле Ресурсы добавляем только одно поле — Значение.
  2. В настройках структуры отчета добавляем группировку Колонок по полю Период.
  3. В настройках структуры отчета добавляем группировку Строк по полю ИмяПоказателя.

В результате мы получим отчет вида:

Плюсы метода:

Минусы метода:

Способ 2: Использование фиктивного поля группировки

Если вам нужно сохранить визуальное разделение на Рубли и Евро внутри одной ячейки месяца или просто сгруппировать их под общим заголовком "Сумма продажи", можно не менять структуру данных так кардинально.

Шаг 1. Доработка запроса

Добавим в запрос статическое строковое поле или используйте Вычисляемые поля в СКД, добавив поле РазделОтчета с выражением "Показатели продаж".

Шаг 2. Настройка структуры

  1. В группировки Строк добавляем поле РазделОтчета.
  2. В группировки Колонок добавляем поле Период.
  3. В выбранные поля добавляем ресурсы СуммаРуб и СуммаEUR.

Настройка "Расположение ресурсов" во вкладке "Другие настройки" позволит определить, будут ли ресурсы идти горизонтально или вертикально под шапкой периода.

Способ 3: Настройка группировки выбранных полей

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

  1. Переходим на вкладку Настройки -> Выбранные поля.
  2. Нажимаем "Новая группа". Даем ей заголовок, например, "Продажи".
  3. Перетаскиваем поля СуммаРуб и СуммаEUR внутрь этой группы.
  4. В свойствах группы выбираем Расположение: "Горизонтально" или "Вертикально".

Форматирование дат

Чтобы вывести "Январь 2025" вместо стандартного представления даты, можно использовать несколько подходов: свойство Оформление в наборе данных, условное оформление или выражение представления с использованием функции Формат(Период, "ДФ='MMMM yyyy'").

Рекомендации по оптимизации

Если вы выбрали Способ 1 (Транспонирование через UNION ALL), учтите следующие моменты:

Заключение

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

← На главную