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