Как скрыть строки с пустыми или нулевыми данными в отчете на СКД?

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

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

Проанализируем типовую причину: если в схеме компоновки данных справочник связывается левым соединением с таблицами движений или остатков, в выборку попадают абсолютно все элементы справочника. Для тех элементов, по которым не было операций, числовые поля принимают значение NULL или 0.

Способ 1. Настройка отбора с логической группой «ИЛИ»

Самый быстрый способ скрыть пустые строки без изменения структуры схемы — настроить фильтрацию на вкладке Настройки в СКД (или непосредственно в пользовательском режиме отчета). Так как строка должна выводиться при наличии хотя бы одного ненулевого показателя, простые условия «И» не подойдут — необходимо объединить их в группу ИЛИ.

Разберем по шагам порядок настройки:

  1. Перейдем на вкладку Настройки схемы компоновки данных, выберем весь отчет или конкретную группировку (например, Контрагент).
  2. Откроем вкладку Отбор.
  3. Нажмем кнопку добавления группы условий и выберем тип группы: Группа «ИЛИ».
  4. Внутрь созданной группы добавим условия по каждому числовому ресурсу:
    1. НачОстаток Не равно 0 (и Заполнено, если поле может содержать NULL);
    2. Продажи Не равно 0;
    3. Возврат Не равно 0;
    4. КонОстаток Не равно 0.

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

Способ 2. Упрощение фильтрации через вычисляемое поле

Если числовых колонок много, создание громоздких групп «ИЛИ» усложняет поддержку отчета. Рассмотрим альтернативный прием — создание одного вспомогательного вычисляемого поля, агрегирующего активность по строке.

Для корректного учета разнонаправленных движений (например, когда продажи и возвраты могут взаимно погасить друг друга при сложении) используем функцию взятия абсолютного значения ABS() и проверку на пустое значение через ЕСТЬNULL().

Разберем порядок действий:

  1. На вкладке Вычисляемые поля добавим новое поле, например АктивностьСтроки.
  2. В колонке Выражение укажем формулу:
    
    ABS(ЕСТЬNULL(НачОстаток, 0)) + ABS(ЕСТЬNULL(Продажи, 0)) + ABS(ЕСТЬNULL(Возврат, 0)) + ABS(ЕСТЬNULL(КонОстаток, 0))
    
  3. На вкладке Настройки перейдем в раздел Отбор и установим одно простое условие: АктивностьСтроки Больше 0.

Способ 3. Оптимизация архитектуры запроса

Накладывание отборов на уровне СКД по ресурсным полям отсекает строки уже на этапе компоновки данных в оперативной памяти сервера 1С, но сама СУБД продолжает выполнять полное чтение пустых записей. Чтобы повысить производительность и исключить появление пустых строк на корню, оптимизируем текст запроса.

Посмотрим на типовой подход: вместо левого соединения полного справочника с регистрами получаем данные напрямую из виртуальных таблиц регистров накопления и объединяем их конструкцией ОБЪЕДИНИТЬ ВСЕ.


ВЫБРАТЬ
    Остатки.Контрагент КАК Контрагент,
    Остатки.СуммаОстаток КАК НачОстаток,
    0 КАК Продажи,
    0 КАК Возврат,
    0 КАК КонОстаток
ИЗ
    РегистрНакопления.Взаиморасчеты.Остатки(&НачалоПериода, ) КАК Остатки

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    Обороты.Контрагент,
    0,
    Обороты.СуммаПродажиОборот,
    Обороты.СуммаВозвратаОборот,
    0
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, , ) КАК Обороты

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    Остатки.Контрагент,
    0,
    0,
    0,
    Остатки.СуммаОстаток
ИЗ
    РегистрНакопления.Взаиморасчеты.Остатки(&КонецПериода, ) КАК Остатки

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

Способ 4. Использование связей наборов данных

Если отчет спроектирован с разделением на несколько наборов данных (например, первый набор — список контрагентов, а подчиненные наборы выбирают обороты и остатки), отсечь лишние строки можно встроенным механизмом компоновщика.

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

Особенности работы с иерархией справочников

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

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

← На главную