Разработка и Конфигурация · 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 ТОГДА ... // неверно во встроенном языке — ЕСТЬ 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: это разные значения, сравнение не сработает, и ветка обработки никогда не выполнится.
NULL в итогах, группировках и виртуальных таблицах
При использовании ИТОГИ ПО группируемые поля в итоговых записях содержат NULL. Если обходить результат методом ОбходитьРезультатЗапроса.ПоГруппировкам, это нужно учитывать: на верхних уровнях иерархии поля детальных записей будут NULL, и обращение к ним без проверки даст ошибки в расчётах.
В виртуальных таблицах регистров (Остатки, Обороты) отсутствующие записи не возвращаются вовсе, поэтому NULL появляется именно при соединении виртуальной таблицы с таблицей измерений. Правильный шаблон — левое соединение от справочника к остаткам с ЕстьNULL() на ресурсах.
- 1Определите, где возникает NULL: соединение без пары, итоги или необязательный реквизит
- 2В секции ГДЕ используйте ЕСТЬ NULL для отбора записей без значения
- 3В списке выборки оберните вычисляемые поля в ЕстьNULL(Поле, ЗначениеПоУмолчанию) с совместимым типом
- 4При обходе выборки в коде проверяйте «= NULL», а не Неопределено
- 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 и путаница с Неопределено — главные источники скрытых ошибок.