Как реализовать сложную группировку колонок в СКД без эффекта «лесенки» и с учетом пустых значений

Программист IT и автоматизация бизнеса
← На главную

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

Постановка задачи и анализ проблемы

Представим, что у нас есть данные, где для одного Вида продукции существуют разные Свойства (Высокий, Средний, Низкий или NULL) и соответствующие им Товары. Если просто создать таблицу с группировкой строк по полю Вид и колонок по полю Свойство, мы получим разрозненную структуру. Главная причина — СКД сопоставляет одну детальную запись одной ячейке на пересечении. Если мы хотим, чтобы Товар1 и Товар2 стояли в одной строке под разными колонками, нам нужно «обмануть» или перенастроить механизм агрегации.

Проанализируем базовый запрос, который создает исходную выборку:


ВЫБРАТЬ
    "Вид1" КАК Вид,
    "Высокий" КАК Свойство,
    "Товар1" КАК Товар
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
    "Вид1", "Средний", "Товар2"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
    "Вид2", NULL, "Товар5"

Способ 1. Использование функции СоединитьСтроки в ресурсах

Это самый быстрый и эффективный метод, если вам не принципиально, чтобы каждый товар находился в отдельной физической строке ячеек Excel. Мы можем заставить СКД собирать все товары, относящиеся к одной группе, в одну ячейку с переносом строки.

Разберем по шагам настройку этого метода:

  1. Перейдем на вкладку Ресурсы в схеме компоновки данных.
  2. Добавим поле Товар в список ресурсов.
  3. В поле «Выражение» напишем следующую конструкцию:
    СоединитьСтроки(ВычислитьВыражениеСГруппировкойМассив("Товар", "Товар"), Символы.ПС)
  4. В настройках отчета (вкладка «Настройки») выберем тип макета Таблица, где в строках будет Вид, а в колонках — Свойство.

Что это дает? Функция ВычислитьВыражениеСГруппировкойМассив соберет все товары для конкретного вида и свойства в массив, а СоединитьСтроки выведет их в одну ячейку, разделяя символом переноса строки. «Лесенка» исчезнет, так как для одного Вида будет создана ровно одна строка в отчете.

Способ 2. Метод искусственной нумерации строк (Уплотнение)

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

Рассмотрим алгоритм реализации:

  1. В запросе или с помощью вычисляемого поля добавим ПорядковыйНомерВГруппе. В новых версиях платформы это можно сделать через оконные функции прямо в тексте запроса:
    
    ВЫБРАТЬ
        Вид,
        Свойство,
        Товар,
        ПОРЯДКОВЫЙ_НОМЕР() ОБРАБОТКА НАД (ПАРТИЦИЯ ПО Вид, Свойство ПОРЯДОК ПО Товар) КАК НомерСтроки
    ИЗ
        ВТДанные
    
  2. В настройках СКД добавим группировку строк: сначала по полю Вид, а внутри него — по полю НомерСтроки.
  3. Колонки по-прежнему группируем по полю Свойство.

В этом случае Товар3 (с индексом 1) и Товар4 (с индексом 1) окажутся в одной горизонтальной строке отчета, так как у них совпадает и Вид, и НомерСтроки.

Работа с пустыми значениями (NULL) в колонках

Часто пользователи жалуются, что колонки со значением NULL пропадают или отображаются некорректно. Проанализируем ситуацию: для СКД NULL — это отсутствие значения, а не категория для группировки.

Чтобы решить эту проблему, выполним следующие действия:

Оформление и «чистка» отчета

Чтобы отчет выглядел профессионально, воспользуемся Условным оформлением. Если вы используете метод с детальными записями, и поле Вид дублируется на каждой строке, разберем, как это скрыть:

  1. Перейдем в настройки условного оформления.
  2. Добавим новое правило: Текст = "" (пустая строка).
  3. В условии укажим, что оформление применяется только для детальных записей, где значение Вид совпадает с предыдущим (или просто примените макет группировки с объединением ячеек).

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

← На главную