Как заменить пустые значения (NULL) на ноль в запросе 1С

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

При построении отчетов, особенно если они разбиты по периодам (неделям, месяцам), программисты часто сталкиваются с ситуацией, когда в определенных периодах движения отсутствуют. В результате в выборку попадает значение NULL. Это может привести к некорректному отображению данных или ошибкам в дальнейших арифметических расчетах. Разберем подробно, как правильно обрабатывать такие ситуации, почему стандартные конструкции могут не срабатывать и какие инструменты платформы 1С наиболее эффективны.

Разбор проблемы: почему ВЫБОР может не работать

Рассмотрим ситуацию, с которой столкнулся автор темы. Попытка использовать классическую конструкцию ВЫБОР для проверки на пустоту часто выглядит логичной, но может содержать синтаксические ошибки. Разберем по шагам типичную ошибку:


ВЫБОР
    КОГДА ВложенныйЗапрос1.Количество ЕСТЬ NULL
        ТОГДА 0
    ИНАЧЕ ВложенныйЗапрос1.Количество
КОНЕЦ

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

Оптимальное решение: функция ЕстьNULL

Для максимально быстрой и простой замены пустого значения на конкретное число (например, ноль) в 1С предусмотрена специализированная функция ЕстьNULL. Рассмотрим пример её правильного использования, который и стал решением в обсуждаемой теме:


ВЫБРАТЬ
    ЕстьNULL(ВложенныйЗапрос1.Количество, 0) КАК КоличествоБезПустот
ИЗ
    ВложенныйЗапрос1

Выясним причину, почему этот вариант предпочтительнее:

Отличие замены значения от фильтрации строк

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

  1. Замена значения: Мы используем ЕстьNULL, чтобы строка осталась в отчете, но вместо «пустоты» там стоял 0. Это критично для математических операций, так как в программировании NULL + 10 = NULL, а 0 + 10 = 10.
  2. Фильтрация (отсеивание): Если нам вообще не нужна строка, в которой нет данных, мы должны использовать секцию ГДЕ.

Пример фильтрации, чтобы полностью избавиться от «пустых» записей:


ГДЕ
    НЕ ВложенныйЗапрос1.Количество ЕСТЬ NULL

Особенности работы с периодами и виртуальными таблицами

В тексте обсуждения упоминалось, что данные «подтягиваются за прошлую неделю». Посмотрим на пример работы с виртуальными таблицами ОстаткиИОбороты. Платформа 1С умеет автоматически дополнять периоды. Если за неделю движений не было, система может «растянуть» остаток на этот период.

Чтобы управлять этим поведением, проанализируем настройки виртуальной таблицы. Если мы хотим видеть только те периоды, где был реальный оборот (приход или расход), следует:

Нюансы левого соединения (LEFT JOIN)

Проблема пустых строк чаще всего возникает при использовании ЛЕВОЕ СОЕДИНЕНИЕ. Когда в правой таблице не находится соответствие записи из левой таблицы, все поля правой таблицы заполняются значением NULL. Разберем по шагам, как этого избежать:


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

В этом примере, если товар не продавался, функция ЕстьNULL обеспечит вывод нуля вместо пустого поля, что сделает отчет понятным для пользователя.

Решение проблемы через СКД (Система компоновки данных)

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

Таким образом, выбор метода зависит от конкретной задачи: нужно ли нам просто красивое отображение или же мы планируем использовать эти данные в дальнейших расчетах внутри запроса. Для расчетов всегда выбирайте ЕстьNULL в тексте запроса.

← На главную