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