Как правильно настроить отбор «Не равно 0» в системе компоновки данных (СКД)

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

При разработке отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда стандартный отбор по полю с условием «Не равно 0» не приносит желаемого результата. В отчете все равно продолжают отображаться строки с нулевыми значениями или пустыми ячейками. Это происходит из-за технических особенностей обработки данных в языке SQL и механизмов самой платформы 1С.

Разберем подробно причины возникновения этой проблемы и рассмотрим несколько эффективных способов её решения, от правки текста запроса до настройки вычисляемых полей.

Почему стандартный отбор «Не равно 0» может не работать?

Проанализируем ситуацию: когда мы задаем условие в компоновке, система транслирует его в SQL-запрос. Если поле, по которому идет отбор, получено в результате ЛЕВОГО СОЕДИНЕНИЯ или является ресурсом виртуальной таблицы остатков, оно может содержать значение NULL. В логике баз данных NULL — это отсутствие значения, и оно не равно нулю. Условие Поле <> 0 вернет «Истину» только для заполненных чисел, отличных от нуля, но проигнорирует строки, где значение просто отсутствует (NULL). Именно поэтому отчет выводит пустые строки, которые визуально воспринимаются как нулевые.

Решение 1. Использование функции ЕСТЬNULL в тексте запроса

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


ВЫБРАТЬ
    ХозрасчетныйОстатки.Субконто1 КАК Номенклатура,
    ЕСТЬNULL(ХозрасчетныйОстатки.КоличествоОстатокДт, 0) КАК Количество
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Остатки(&Период, Счет = &Счет, , ) КАК ХозрасчетныйОстатки

В данном случае, если по номенклатуре нет остатка, функция подставит число 0 вместо NULL. Теперь стандартный отбор СКД Количество Не равно 0 отработает корректно, так как система будет сравнивать число с числом.

Решение 2. Создание вспомогательного поля-флага (Выбор Когда)

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


ВЫБРАТЬ
    Вт1.Номенклатура,
    Вт1.СуммаОстаток,
    ВЫБОР
        КОГДА Вт1.СуммаОстаток ЕСТЬ NULL ТОГДА 0
        КОГДА Вт1.СуммаОстаток = 0 ТОГДА 0
        ИНАЧЕ 1
    КОНЕЦ КАК ЕстьДанные
ПОМЕСТИТЬ Вт3
ИЗ
    Вт1 КАК Вт1

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

Решение 3. Обработка точности и округления

Выясним еще одну важную причину: точность типа Число. Если в результате деления или сложных расчетов в поле оказывается значение типа 0.000000001, визуально в отчете (с учетом формата) оно отобразится как 0, но условие Не равно 0 для него будет истинным. Чтобы избежать этого, рекомендуется использовать функцию ВЫРАЗИТЬ в запросе:

Рассмотрим пример:


ВЫБРАТЬ
    ВЫРАЗИТЬ(Остатки.КоличествоОстаток КАК ЧИСЛО(15, 3)) КАК Количество
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки КАК Остатки
ГДЕ
    ВЫРАЗИТЬ(Остатки.КоличествоОстаток КАК ЧИСЛО(15, 3)) <> 0

Принудительное приведение к нужной точности позволяет отсечь «математический мусор», который мешает корректной работе фильтров.

Решение 4. Отбор по ресурсам и группировкам

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

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

  1. Перейдем в настройки конкретной группировки в СКД.
  2. Откроем вкладку «Отбор» именно для этой группировки.
  3. Установим условие Количество Не равно 0.

В этом случае СКД применит условие HAVING в SQL-запросе, что позволит отфильтровать уже рассчитанные итоги, а не исходные записи.

Практические советы по работе с СКД

Проанализируем несколько дополнительных нюансов, которые помогут сделать отчеты более стабильными:

Используя предложенные методы — предварительную обработку данных функцией ЕСТЬNULL, создание технических полей-флагов и правильное использование отборов на уровне группировок — вы сможете добиться корректного вывода данных в отчетах любой сложности, избегая появления лишних «пустых» строк. При необходимости скрыть не только строки, но и пустые колонки, можно воспользоваться решением для автоматического скрытия столбцов СКД при отсутствии данных.

← На главную