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

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

При разработке отчетов на Системе компоновки данных (СКД) разработчики часто сталкиваются с ситуацией, когда в итоговом документе отображаются заголовки группировок, под которыми нет ни одной детальной записи. Это визуально перегружает отчет и делает его менее читаемым. Разберем подробно, почему это происходит и какими способами можно скрыть такие "фантомные" строки.

Анализ проблемы: почему СКД выводит пустые строки

Прежде всего, проанализируем ситуацию. Система компоновки данных работает в несколько этапов: получение данных, их компоновка (агрегация и группировка) и вывод. Если на уровне запроса или настроек отбора данные отсекаются, но сама структура группировок определена жестко, СКД может попытаться зарезервировать место под заголовок группировки. Часто это случается из-за того, что отбор применяется к детальным записям, но не к самой группировке, или из-за особенностей левого соединения в запросе.

Способ 1. Настройка параметра «Выводить и при отсутствии данных»

Рассмотрим самый простой и штатный механизм. В СКД для каждого элемента структуры (отчета или конкретной группировки) предусмотрены настройки вывода. Посмотрим на алгоритм действий:

  1. Перейдем на закладку Настройки в схеме компоновки данных.
  2. Выберем нужную группировку в дереве настроек.
  3. В нижней части окна перейдем на вкладку Прочие настройки.
  4. Найдем параметр Выводить и при отсутствии данных.
  5. Установим значение Нет (вместо значения по умолчанию Авто).

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

Способ 2. Использование отбора по системному полю «Количество»

Если первый способ не помог, проанализируем ситуацию с точки зрения агрегатных функций. Выясним причину: СКД считает, что данные есть, раз она выводит строку. Мы можем принудительно наложить отбор на количество записей внутри группировки.

Для этого выполним следующие шаги:

  1. В настройках конкретной группировки перейдем на закладку Отбор.
  2. Добавим новый элемент отбора.
  3. В качестве поля выберем системное поле Количество() (или КоличествоОборот, если работаем с регистрами накопления).
  4. Установим вид сравнения Больше, а значение — 0.

Важный нюанс: чтобы этот отбор не отображался в шапке отчета и не смущал пользователя, перейдем в Дополнительные настройки этого отбора (кнопка с изображением шестеренки или свойства элемента) и установим флаг Выводить отбор — Не выводить.

Способ 3. Корректировка логики запроса и соединений

Разберем ситуацию, когда проблема кроется в самом источнике данных. Если в запросе используется ЛЕВОЕ СОЕДИНЕНИЕ, основная таблица всегда будет возвращать записи, даже если в присоединяемой таблице нет соответствий. В этом случае группировка по полям основной таблицы будет создана с пустыми значениями ресурсов.

Посмотрим на пример кода, который может вызывать проблему:


ВЫБРАТЬ
    Номенклатура.Ссылка КАК Номенклатура,
    Остатки.КоличествоОстаток КАК Остаток
ИЗ
    Справочник.Номенклатура КАК Номенклатура
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК Остатки
        ПО Номенклатура.Ссылка = Остатки.Номенклатура

Чтобы избежать появления пустых групп по номенклатуре, у которой нет остатков, мы можем изменить тип соединения на ВНУТРЕННЕЕ СОЕДИНЕНИЕ или добавить условие в секцию ГДЕ:


ГДЕ
    НЕ Остатки.Номенклатура ЕСТЬ NULL

Это гарантирует, что на этап компоновки попадут только те записи, по которым реально есть данные в регистре.

Способ 4. Настройка связей наборов данных

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

Если этот флаг не установлен, система ведет себя как при левом соединении: выводит записи из первого набора, даже если во втором ничего не найдено. Установите флаг Обязательная связь для ключевых полей, чтобы исключить вывод "пустых" родителей.

Способ 5. Особенности иерархических группировок

При использовании иерархии (например, по справочнику Номенклатура или Подразделения) часто возникают ситуации, когда родительские группы выводятся, а их подчиненные элементы скрыты отбором. Выясним, как это исправить.

В настройках отбора СКД есть поле Использование отбора. Для иерархических полей рекомендуется устанавливать значение Для иерархии. Это заставит систему проверять условие отбора на каждом уровне дерева. Если ни один элемент внутри группы не соответствует условию, вся ветка (включая родителя) будет скрыта.

Способ 6. Программная обработка результата

В исключительных случаях, когда стандартные настройки не дают результата, мы можем прибегнуть к программному методу вывода отчета. Рассмотрим, как это сделать в модуле объекта отчета или в форме.

Используя ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент, мы можем перехватить момент вывода каждой строки и проверить наличие данных. Однако более элегантным решением будет постобработка уже сформированного ТабличногоДокумента, где мы можем программно скрыть строки с нулевой высотой или удалить их, если в них отсутствуют числовые показатели.

Пример логики обхода (схематично):


// При обходе областей табличного документа
Для НомерСтроки = 1 По ТабДок.ВысотаТаблицы Цикл
    Область = ТабДок.Область(НомерСтроки, , НомерСтроки, );
    // Проверяем, являются ли ячейки в строке пустыми или содержат только заголовки
    Если СтрокаПустая(Область) Тогда
        ТабДок.УдалитьОбласть(Область, ТипСмещенияТабличногоДокумента.ПоВертикали);
    КонецЕсли;
КонецЦикла;

Резюме

Мы рассмотрели основные методы борьбы с пустыми группировками. Рекомендуемая последовательность действий: сначала проверьте параметр Выводить и при отсутствии данных, затем наложите отбор по Количеству > 0 на уровне группировки, и только в крайнем случае меняйте логику запроса или прибегайте к программному коду. Использование Условного оформления (например, установка максимальной высоты строки в 0) обычно является наименее надежным способом, так как заголовок все равно физически присутствует в документе, что может вызвать проблемы при печати или сохранении в Excel.

← На главную