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

Некорректная проверка на отсутствие значения может привести к тому, что важные документы не попадут в выборку или, наоборот, в отчет попадут «мусорные» записи. Особенно это актуально при формировании сложных аналитических отчетов и регистров накопления. В этом материале мы детально разберем синтаксис и логику работы с неопределенными значениями.

Синтаксис оператора IS NULL в языке запросов

Основным инструментом фильтрации записей с отсутствующими значениями является конструкция IS NULL. Этот оператор проверяет, является ли значение поля неопределенным. Важно понимать, что в контексте базы данных NULL — это не ноль и не пустая строка, а специальное состояние «нет значения».

Использование стандартных операторов сравнения, таких как равно (=) или не равно (<>), для проверки на NULL недопустимо. Логика SQL и встроенного языка запросов 1С построена так, что любое сравнение с NULL возвращает неизвестность (Unknown), а не Истину или Ложь. Поэтому запись Где Поле = NULL никогда не сработает так, как ожидает новичок.

Для отрицания используется конструкция IS NOT NULL. Она позволяет отфильтровать все записи, в которых поле заполнено каким-либо конкретным значением. Это часто требуется при построении отчетов по незавершенным документам или элементам, по которым еще не проведены взаиморасчеты.

⚠️ Внимание: Никогда не пытайтесь заменить IS NULL на сравнение с пустой строкой '' для строковых полей. В базе данных пустая строка — это конкретное значение длины ноль, а NULL — это отсутствие значения как такового.

💡

Используйте автоподстановку в конфигураторе: начните вводить "ЕСТЬ NULL" или "IS NULL", и система предложит правильный синтаксис, что снизит риск опечаток.

Функция ЕСТЬNULL и ее аналоги в запросах

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

Логика работы функции проста: если первый аргумент равен NULL, функция возвращает второй аргумент. В противном случае возвращается исходное значение первого аргумента. Это мощный инструмент для нормализации данных перед их выводом в табличный документ или передачей во внешнюю систему.

Рассмотрим пример использования в коде запроса. Допустим, нам нужно вывести список товаров, где отсутствующую цену нужно заменить на ноль для корректного суммирования:

ВЫБРАТЬ

Номенклатура,

ЕСТЬNULL(Цена, 0) КАК ЦенаДляОтчета

ИЗ

РегистрСведений.ЦеныНоменклатуры

Важно отметить, что тип данных значения подмены должен быть совместим с типом проверяемого поля или приводим к нему. Попытка подставить строку в числовое поле вызовет ошибку выполнения запроса. Функция ЕСТЬNULL работает быстрее, чем конструкции условного перехода ВЫБОР...КОГДА...ТОГДА, когда цель — именно обработка отсутствующих значений.

☑️ Проверка логики функции ЕСТЬNULL

Выполнено: 0 / 4

Обработка NULL в табличных документах и СКД

При выводе данных в Табличный документ или использовании Системы Компоновки Данных (СКД) поведение NULL может визуально отличаться от того, что запрошено в коде. По умолчанию система может отображать отсутствующее значение как пустую ячейку, что иногда затрудняет анализ данных пользователем.

В настройках СКД существует возможность явного указания формата вывода для значений NULL. Это позволяет заменить пустоту на прочерк, текст «Нет данных» или ноль без изменения самого запроса. Такая настройка выполняется в конструкторе компоновки данных в разделе «Дополнительные настройки» -> «Макет».

Если вы формируете отчет программно, заполняя макет, необходимо явно проверять полученные из запроса значения. Получение значения из колонки результата запроса, содержащего NULL, вернет специальное значение платформы Null. При попытке записать его в ячейку табличного документа без обработки, ячейка останется пустой.

Контекст использования Метод обработки Результат для пользователя
Язык запросов (ГДЕ) IS NULL Фильтрация записей (строка скрыта)
Язык запросов (ВЫБРАТЬ) ЕСТЬNULL() Подмена на конкретное значение (0, "")
СКД (Настройки) Параметр макета Визуальная замена (прочерк, текст)
Встроенный язык (Код) Проверка Значение = Null Логическая ветка в алгоритме
Особенности производительности при обработке NULL

Использование функций над полями в условии ГДЕ (например, ЕСТЬNULL(Поле, 0) = 0) может привести к отказу оптимизатора запросов от использования индексов. Всегда старайтесь использовать чистый синтаксис IS NULL для фильтрации, а функции подмены оставляйте для секции ВЫБРАТЬ.

Сравнение NULL в условных конструкциях ВЫБОР

Конструкция ВЫБОР (аналог CASE в SQL) позволяет реализовывать сложную логику ветвления прямо внутри запроса. Однако при работе с NULL здесь действуют особые правила. Простое сравнение КОГДА Поле = NULL внутри конструкции ВЫБОР не сработает.

Для корректной проверки необходимо использовать синтаксис КОГДА Поле IS NULL ТОГДА. Это позволяет задать специфическое значение или текст для случая отсутствия данных, отличающийся от стандартной подмены. Такой подход дает гибкость, когда для разных типов отсутствующих данных нужны разные реакции системы.

Пример сложной логики обработки статусов документа, где NULL означает «Статус не определен», а пустая строка — «Черновик»:

ВЫБРАТЬ

Документ,

ВЫБОР

КОГДА Статус IS NULL ТОГДА "Требует внимания"

КОГДА Статус = "" ТОГДА "Черновик"

ИНАЧЕ Статус

КОНЕЦ КАК Комментарий

ИЗ

Документ.ЗаказКлиента

Использование таких конструкций делает код запроса самодостаточным и избавляет от необходимости дополнительной обработки результатов на стороне встроенного языка. Это особенно важно для отчетов, работающих с большими объемами данных, где цикл по результатам запроса может стать «узким горлышком» производительности.

💡

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

Типичные ошибки и нюансы производительности

Одной из самых распространенных ошибок является попытка использовать арифметические операции с полями, которые могут содержать NULL. В 1С, как и в большинстве СУБД, любая арифметическая операция с участием NULL возвращает NULL. Например, выражение Сумма + Налог вернет NULL, если хотя бы одно из слагаемых не определено.

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

Еще один нюанс касается индексации. Условие IS NULL обычно хорошо оптимизируется движком базы данных, если для поля создан индекс. Однако, если поле является составной частью сложного выражения в условии отбора, использование индекса может стать невозможным. Всегда проверяйте план выполнения запроса через консоль запросов при работе с большими таблицами.

⚠️ Внимание: При обновлении конфигурации или переходе на новую версию платформы 1С поведение некоторых функций работы с NULL может измениться. Сверяйте синтаксис с актуальной документацией по вашей версии платформы.

📊 С каким типом NULL вы сталкиваетесь чаще всего?
Пустые реквизиты документов
Отсутствующие цены в регистрах
NULL в справочниках
Проблемы при обмене данными

Специфика работы с временными таблицами

При работе с временными таблицами (#ВременнаяТаблица) логика обработки NULL сохраняется, но есть особенности заполнения. Если вы используете оператор ВЫБРАТЬ ... В ВРЕМЕННУЮ ТАБЛИЦУ, тип данных колонки определяется по первой вставленной строке. Если в первой строке придет NULL, тип может определиться некорректно для последующих данных.

Чтобы избежать проблем с типизацией, рекомендуется явно описывать структуру временной таблицы или гарантировать, что первая вставляемая запись содержит конкретные значения во всех полях. Это обеспечит стабильность работы последующих запросов к этой временной таблице.

Также стоит помнить, что при соединении (JOIN) временной таблицы с основной, условия на NULL работают стандартно. Однако, если вы используете ЛЕВОЕ СОЕДИНЕНИЕ, помните, что отсутствие совпадения породит NULL во всех полях правой таблицы. Проверка на NULL в этом случае будет означать проверку на отсутствие связи между записями.

Грамотное управление отсутствующими значениями — признак зрелости кода 1С-разработчика. Понимание тонкостей работы с NULL позволяет создавать надежные, быстрые и предсказуемые отчеты, которые не требуют ручной доработки пользователем после выгрузки.

В чем разница между NULL и пустой строкой в 1С?

NULL — это специальное значение, означающее «данных нет», «неизвестно». Пустая строка («») — это строковое значение длиной 0 символов. В базе данных они хранятся по-разному и требуют разных операторов для проверки (IS NULL против = "").

Почему сравнение Поле = NULL всегда возвращает Ложь?

Согласно стандарту SQL, который использует 1С, NULL не равен ничему, даже самому себе. Сравнение с NULL возвращает состояние «Неизвестно». Для проверки нужно использовать специальные операторы IS NULL или IS NOT NULL.

Можно ли использовать ЕСТЬNULL в условии ГДЕ?

Технически можно, но не рекомендуется. Конструкция ГДЕ ЕСТЬNULL(Поле, 0) = 0 работает медленнее, чем ГДЕ Поле IS NULL ИЛИ Поле = 0, так как применение функции к полю часто отключает использование индексов.

Как проверить на NULL во встроенном языке 1С?

В коде модуля используется проверка Если Значение = Null Тогда. Специальная функция ЗначениеЗаполнено() также возвращает Ложь для значения Null, но она также вернет Ложь для пустой строки и нуля, поэтому будьте внимательны с типами.