К статье
Практический материал

Разработка и Конфигурация · 8 мин

Как проверить значение на NULL в 1С 8

Как проверить значение на NULL в 1С 8: оператор ЕСТЬ NULL в запросах, функция ЕстьNULL, отличие NULL от Неопределено, типичные ошибки и примеры кода.

В языке запросов 1С 8 значение NULL появляется там, где данные отсутствуют: при левом соединении без совпадений, у необязательных реквизитов, в итогах по группировкам. Проверить значение на NULL напрямую оператором сравнения «=» нельзя — любое сравнение с NULL возвращает не Истина и не Ложь, а снова NULL. Поэтому для проверки используется специальный оператор ЕСТЬ NULL (IS NULL) и функция ЕстьNULL().

Важно не путать NULL с Неопределено и пустыми ссылками — это три разных состояния в платформе 1С, и проверяются они разными способами. NULL существует только внутри запросов и результатов запросов, Неопределено — во встроенном языке, пустая ссылка — это конкретное значение ссылочного типа.

Что такое NULL в 1С и чем он отличается от Неопределено

NULL — это маркер отсутствия значения в языке запросов. Он появляется, когда поле физически не заполнено: например, при левом соединении таблиц у записей без пары все поля правой таблицы будут NULL, а при группировке с итогами итоговые строки по группируемым полям содержат NULL.

Неопределено — значение встроенного языка 1С, которое означает «переменной ничего не присвоено» или «свойство отсутствует». Оно используется в коде модулей, но не существует внутри запросов. Пустая ссылка — это заполненное значение ссылочного типа, просто указывающее «ни на что»; она не равна NULL и проверяется сравнением с Значение(Справочник.Номенклатура.ПустаяСсылка).

Сравнение пустых состояний в 1С

NULL

Только в запросах и выборках. Проверка: оператор ЕСТЬ NULL. Возникает при соединениях, итогах, необязательных полях.

Неопределено

Только во встроенном языке. Проверка: Значение = Неопределено. Возникает у необъявленных переменных, отсутствующих свойств структуры.

Пустая ссылка

И в запросах, и в коде. Проверка: сравнение с пустой ссылкой или метод Пустая(). Это обычное значение, а не отсутствие данных.

Проверка на NULL в запросе: оператор ЕСТЬ NULL

Основной способ проверки — оператор ЕСТЬ NULL в секции ГДЕ или в условии ВЫБОР. Он возвращает Истина, если поле содержит NULL, и Ложь в противном случае. Для обратной проверки используется конструкция НЕ ... ЕСТЬ NULL или ЕСТЬ НЕ NULL.

Запрос.Текст =

"ВЫБРАТЬ

| Заказы.Номер,

| Оплаты.Сумма

|ИЗ

| Документ.ЗаказПокупателя КАК Заказы

| ЛЕВОЕ СОЕДИНЕНИЕ Документ.Оплата КАК Оплаты

| ПО Заказы.Ссылка = Оплаты.Заказ

|ГДЕ

| Оплаты.Сумма ЕСТЬ NULL";

Этот запрос вернёт все заказы, по которым нет оплаты, — классическая задача поиска «висячих» документов. Обратите внимание: условие на NULL-поле правой таблицы при левом соединении фактически превращает запрос в отбор записей без пары.

bsl
ЕСЛИ Выборка.Поле ЕСТЬ NULL ТОГДА ... // неверно во встроенном языке — ЕСТЬ NULL работает только в тексте запроса

Замена NULL на значение по умолчанию: функция ЕстьNULL()

Функция ЕстьNULL(Выражение, ЗначениеЗамены) возвращает первый аргумент, если он не NULL, и второй аргумент — если NULL. Это стандартный приём, чтобы результаты запроса можно было сразу использовать в расчётах без дополнительных проверок.

Запрос.Текст =

"ВЫБРАТЬ

| Заказы.Номер,

| ЕстьNULL(Оплаты.Сумма, 0) КАК СуммаОплаты

|ИЗ

| Документ.ЗаказПокупателя КАК Заказы

| ЛЕВОЕ СОЕДИНЕНИЕ Документ.Оплата КАК Оплаты

| ПО Заказы.Ссылка = Оплаты.Заказ";

Тип значения замены должен быть совместим с типом проверяемого поля. Если поле числовое — подставляйте 0, если строковое — пустую строку, если ссылочное — пустую ссылку нужного типа. Несовпадение типов приведёт к ошибке исполнения запроса или к неожиданному приведению типов.

Проверка на NULL во встроенном языке при обходе выборки

Когда результат запроса уже получен, значения полей выборки можно проверять во встроенном языке. Здесь оператор ЕСТЬ NULL недоступен — он существует только в тексте запроса. Вместо него значение NULL из выборки сравнивается с... NULL, и платформа предоставляет для этого значение NULL как литерал встроенного языка.

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

Если Выборка.СуммаОплаты = NULL Тогда

Сумма = 0;

Иначе

Сумма = Выборка.СуммаОплаты;

КонецЕсли;

КонецЦикла;

Такая проверка работает, но на практике удобнее заменить NULL ещё в запросе через ЕстьNULL() — тогда код обхода становится проще и безопаснее. Проверка «= NULL» в коде оправдана только когда сам факт отсутствия значения несёт смысл и его нужно обработать отдельно.

Типичные ошибки при работе с NULL

Самая распространённая ошибка — попытка сравнить поле с NULL обычным равенством: «ГДЕ Поле = NULL». Такое условие никогда не вернёт Истина, потому что результат любого сравнения с NULL — NULL, а отбор трактует его как «условие не выполнено». Запрос молча вернёт пустой результат, и найти причину бывает непросто.

Вторая ошибка — арифметика с NULL. Сложение, умножение и любые вычисления с NULL дают NULL, поэтому итоговые суммы в отчётах «пропадают». Третья ошибка — проверка поля выборки на Неопределено вместо NULL: это разные значения, сравнение не сработает, и ветка обработки никогда не выполнится.

Типичные ошибки
01
Условие «Поле = NULL» в запросе — всегда даёт пустой результат, нужен оператор ЕСТЬ NULL
02
Арифметика без ЕстьNULL() — суммы и количества обращаются в NULL и теряются в отчёте
03
Проверка значения выборки на Неопределено вместо NULL — условие никогда не срабатывает
04
Несовпадение типов в ЕстьNULL(Поле, Замена) — ошибка исполнения запроса

NULL в итогах, группировках и виртуальных таблицах

При использовании ИТОГИ ПО группируемые поля в итоговых записях содержат NULL. Если обходить результат методом ОбходитьРезультатЗапроса.ПоГруппировкам, это нужно учитывать: на верхних уровнях иерархии поля детальных записей будут NULL, и обращение к ним без проверки даст ошибки в расчётах.

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

Порядок действий при подозрении на NULL
  1. 1
    Определите, где возникает NULL: соединение без пары, итоги или необязательный реквизит
  2. 2
    В секции ГДЕ используйте ЕСТЬ NULL для отбора записей без значения
  3. 3
    В списке выборки оберните вычисляемые поля в ЕстьNULL(Поле, ЗначениеПоУмолчанию) с совместимым типом
  4. 4
    При обходе выборки в коде проверяйте «= NULL», а не Неопределено
  5. 5
    Выполните запрос в консоли запросов и убедитесь, что пустые значения заменены корректно

Как проверить результат и избежать скрытых проблем

Быстрее всего отладить поведение NULL в консоли запросов: выполните запрос без ЕстьNULL() и посмотрите, какие поля приходят пустыми, затем добавьте обработку и сравните результат. Признак корректной обработки — в выборке нет пустых неопределённых значений там, где дальше идут вычисления или вывод в отчёт.

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

Контрольные точки

Как проверить результат

Поля из правой таблицы при левом соединении
Норма

Числовые поля показывают 0, ссылочные — пустую ссылку

Тревожный признак

Поля пустые (NULL), расчёты по ним дают пустой результат

Суммы в отчёте при наличии записей без пары
Норма

Суммы корректны для всех строк

Тревожный признак

Итоги занижены или строки исчезают

Условие отбора по отсутствию данных
Норма

Записи без пары отобраны через ЕСТЬ NULL

Тревожный признак

Условие «= NULL» — результат всегда пустой

Частые вопросы

Почему условие «Поле = NULL» не возвращает записи?

По стандарту SQL любое сравнение с NULL даёт NULL, а не Истину или Ложь. Отбор ГДЕ трактует NULL как «условие не выполнено», поэтому строки отсекаются. Используйте оператор «Поле ЕСТЬ NULL».

Чем NULL отличается от Неопределено?

NULL существует только в запросах и результатах запросов, Неопределено — только во встроенном языке. В коде значение из выборки сравнивают с NULL, а переменные и свойства структур — с Неопределено.

Как заменить NULL на ноль в сумме?

Оберните поле в функцию: ЕстьNULL(Таблица.Сумма, 0). Для строкового поля вторым аргументом укажите пустую строку, для ссылочного — пустую ссылку соответствующего типа.

Можно ли использовать ЕСТЬ NULL в коде модуля?

Нет, оператор ЕСТЬ NULL доступен только в тексте запроса. Во встроенном языке значение из выборки проверяется сравнением «Выборка.Поле = NULL».

Почему в итоговых строках группировки поля пустые?

При использовании ИТОГИ ПО группируемые поля в итоговых записях получают NULL — так платформа помечает уровень агрегации. Проверяйте тип записи или обходите результат с указанием группировок.

Итог

Что важно запомнить

NULL в 1С 8 проверяется только оператором ЕСТЬ NULL в запросе и сравнением «= NULL» в коде при обходе выборки. Для расчётов заменяйте NULL функцией ЕстьNULL() с совместимым типом. Обычное равенство с NULL и путаница с Неопределено — главные источники скрытых ошибок.