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