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

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

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

Почему возникают нулевые строки?

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

Важно помнить: попытки установить в настройках роли поля Сумма значение «Игнорировать NULL» не принесут результата, так как 0 — это числовое значение, а не пустое значение NULL.

Способ 1: Использование одного набора данных с логикой разделения

Вместо использования двух отдельных наборов данных (ВТ_Приход и ВТ_Расход) и их последующего объединения, попробуйте упростить запрос. Вы можете сразу определить тип движения внутри одного запроса. Это позволит избежать лишних вычислений и упростит структуру отчета.

Рассмотрим пример использования оператора ВЫБОР для определения раздела:


ВЫБРАТЬ
    Обороты.ОбъектАренды,
    Обороты.СтатьяДвиженияДенежныхСредств,
    Обороты.СуммаОборот КАК Сумма,
    ВЫБОР
        КОГДА Обороты.СуммаОборот > 0 ТОГДА "Приход"
        ИНАЧЕ "Расход"
    КОНЕЦ КАК Раздел
ИЗ
    РегистрНакопления.ВВ_ОплатаПоОбъектам.Обороты(,, Авто,) КАК Обороты
ГДЕ
    Обороты.СуммаОборот <> 0

Способ 2: Фильтрация нулевых значений в секции ГДЕ

Самый эффективный и правильный способ избавиться от нулевых строк — это добавить условие непосредственно в текст запроса. Фильтрация на этапе получения данных из базы данных всегда предпочтительнее, чем фильтрация на стороне СКД. Добавление условия ГДЕ СуммаОборот <> 0 исключит все записи, по которым нет движения, еще до момента формирования таблицы компоновки.

Если вы все же работаете с СКД, вы можете добавить отбор в настройках на закладке Отбор. Однако добавление условия непосредственно в запрос является более «чистым» решением с точки зрения производительности.

Способ 3: Анализ архитектуры данных

Частой ошибкой является использование виртуальных таблиц в случаях, когда требуется детальная информация. Обороты — это агрегированные данные. Если вашей задачей является отображение каждого документа-регистратора, использование таблицы Обороты может привести к потере данных из-за того, что система выполняет свертку. В таких случаях рассмотрите возможность обращения к физической таблице движений регистра:


ВЫБРАТЬ
    РегистрДвижения.ОбъектАренды,
    РегистрДвижения.Сумма,
    РегистрДвижения.Регистратор
ИЗ
    РегистрНакопления.ВВ_ОплатаПоОбъектам КАК РегистрДвижения
ГДЕ
    РегистрДвижения.Сумма <> 0

Рекомендации по реализации:

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

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

← На главную