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