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