Как в СКД убрать дублирование данных и колонок при разных условиях вывода полей

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

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

Проанализируем причины такого поведения платформы 1С и подробно разберем практические способы решения этой проблемы.

Почему возникает дублирование и лишние колонки

Выясним причину некорректного формирования отчета. В платформе 1С поведение компоновщика определяется структурой группировок и наборов данных:

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

Способ 1. Раздельные группировки с индивидуальным составом полей и отбором по параметрам

Рассмотрим вариант, при котором структуру отчета делят на несколько параллельных группировок. Этот метод подходит, когда данные выводятся последовательными блоками, и для каждого блока нужен свой набор колонок.

Разберем по шагам порядок настройки структуры в СКД:

  1. Перейдем на вкладку Настройки схемы компоновки данных.
  2. Вместо одной общей таблицы создадим две параллельные группировки одного уровня (одна под другой, без вложенности).
  3. В первой группировке снимем флаг Авто на вкладке Выбранные поля и укажем только те поля, которые должны отображаться для первого вида начисления (например, Студент и Сумма).
  4. Во второй группировке также переопределим Выбранные поля, добавив туда расширенный список: Студент, Сумма, Дни, Цена.
  5. Настроим фильтрацию для каждой группировки. Перейдем на вкладку Отбор первой группировки, добавим условие: левое значение — ВидСтипендии, вид сравнения — Равно.
  6. Чтобы связать правое значение с параметром схемы, нажмем кнопку выбора в правом значении (или крестик очистки), переключим тип на Поле компоновки данных и в открывшемся дереве выберем нужный параметр из папки Параметры данных, например &ВидСтеп1.
  7. Аналогичным образом настроим отбор для второй группировки, связав условие с параметром &ВидСтеп2.

В результате каждая группировка обработает свою порцию данных и отобразит только заданные для нее колонки без пустых промежутков.

Способ 2. Объединение в один запрос с транспонированием через ВЫБОР КОГДА

Рассмотрим наиболее универсальный и надежный инженерный подход — сведение выборки к одному запросу и расчет отдельных колонок через конструкцию ВЫБОР КОГДА. Это позволяет свернуть все показатели в одну строку по ключевому объекту и избавиться от дублей.

Посмотрим на пример правильного формирования текста запроса:


ВЫБРАТЬ
    уз_НачисленияСтипендийОбороты.Студент.Родитель КАК Подразделение,
    уз_НачисленияСтипендийОбороты.Студент КАК Студент,
    ВЫБОР
        КОГДА уз_НачисленияСтипендийОбороты.ВидСтипендии = &ВидСтеп1
            ТОГДА уз_НачисленияСтипендийОбороты.СуммаОборот
        ИНАЧЕ 0
    КОНЕЦ КАК СуммаВид1,
    ВЫБОР
        КОГДА уз_НачисленияСтипендийОбороты.ВидСтипендии = &ВидСтеп2
            ТОГДА уз_НачисленияСтипендийОбороты.СуммаОборот
        ИНАЧЕ 0
    КОНЕЦ КАК СуммаВид2,
    ВЫБОР
        КОГДА уз_НачисленияСтипендийОбороты.ВидСтипендии = &ВидСтеп2
            ТОГДА уз_НачисленияСтипендийОбороты.ДниОборот
        ИНАЧЕ 0
    КОНЕЦ КАК ДниВид2,
    ВЫБОР
        КОГДА уз_НачисленияСтипендийОбороты.ВидСтипендии = &ВидСтеп2
            ТОГДА уз_НачисленияСтипендийОбороты.Цена
        ИНАЧЕ 0
    КОНЕЦ КАК ЦенаВид2
ИЗ
    РегистрНакопления.уз_НачисленияСтипендий.Обороты(, , Период, ВидСтипендии В (&ВидСтеп1, &ВидСтеп2)) КАК уз_НачисленияСтипендийОбороты

Проанализируем особенности этого решения:

  1. Параметры виртуальной таблицы. Фильтрация видов начислений перенесена в параметры виртуальной таблицы Обороты через конструкцию ВидСтипендии В (&ВидСтеп1, &ВидСтеп2). Это исключает избыточное чтение данных из базы и ускоряет работу отчета, в отличие от наложения фильтра в секции ГДЕ.
  2. Разнесение колонок. Каждое вычисляемое значение теперь выводится в собственное отдельное поле: СуммаВид1, СуммаВид2, ДниВид2, ЦенаВид2. Для первого вида поля Дни и Цена просто не формируются.
  3. Исключение поля классификатора. Само поле ВидСтипендии исключено из списка выборки верхнего уровня запроса, благодаря чему оно больше не разделяет строки отчета.

Агрегация ресурсов в СКД

После подготовки запроса с конструкциями ВЫБОР КОГДА необходимо правильно настроить схему компоновки для сворачивания строк:

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

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

← На главную