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