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

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

1. Что считается "пустым значением" в 1С?

Прежде чем проверять пустоту, нужно чётко понимать, какие именно значения могут считаться "пустыми" в контексте 1С:Предприятие. Вот полный список:

  • 🔹 NULL — отсутствие значения в базе данных (аналог Неопределено в языке 1С).
  • 📝 Пустая строка ("") — часто встречается в полях типа Строка.
  • 🔢 Ноль (0) — для числовых полей (например, количество на складе).
  • 🗓️ Пустая дата ('00010101') — минимально возможная дата в 1С.
  • 🔄 Неопределено — специальное значение языка 1С, не имеющее аналога в SQL.
  • 📌 Пустой массив или структура — для полей типа Массив или Структура.

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

📊 Какой тип пустого значения встречается у вас чаще?
NULL в базе
Пустые строки
Нулевые числа
Пустые даты
Неопределенные значения

2. Базовые способы проверки на NULL в запросах

Самый распространённый случай — проверка на NULL в полях базы данных. В 1С для этого есть несколько синтаксических конструкций:

2.1. Оператор ЕСТЬ NULL

Классический способ проверки на отсутствие значения. Работает аналогично стандартному SQL:

ВЫБРАТЬ

Справочник.Номенклатура.Наименование КАК Наименование

ИЗ

Справочник.Номенклатура КАК Справочник.Номенклатура

ГДЕ

Справочник.Номенклатура.Артикул ЕСТЬ NULL

Обратите внимание: в 1С нельзя использовать конструкцию = NULL — это приведёт к синтаксической ошибке. Только ЕСТЬ NULL или ЗНАЧЕНИЕ ЗАПОЛНЕНО.

2.2. Функция ЗНАЧЕНИЕЗАПОЛНЕНО

Альтернативный вариант, который часто удобнее в сложных условиях:

ВЫБРАТЬ

Документ.ПоступлениеТоваров.Номер КАК НомерДокумента

ИЗ

Документ.ПоступлениеТоваров КАК Документ.ПоступлениеТоваров

ГДЕ

НЕ ЗНАЧЕНИЕЗАПОЛНЕНО(Документ.ПоступлениеТоваров.Комментарий)

Критичный нюанс: функция ЗНАЧЕНИЕЗАПОЛНЕНО возвращает Ложь не только для NULL, но и для пустых строк, нулевых чисел и пустых дат. Это может приводить к неожиданным результатам, если вы ожидаете проверку только на NULL.

💡

Если вам нужно проверить именно на NULL, а не на любое "пустое" значение, используйте конструкцию ЕСТЬ NULL — она точнее.

2.3. Проверка с использованием ВЫРАЗИТЬ

Иногда полезно явно привести значение к булевому типу:

ВЫБРАТЬ

Справочник.Контрагенты.Наименование КАК Контрагент,

ВЫРАЗИТЬ(Справочник.Контрагенты.ИНН КАК БУЛЕВО) КАК ЕстьИНН

ИЗ

Справочник.Контрагенты КАК Справочник.Контрагенты

В этом примере поле ЕстьИНН будет содержать Ложь для всех записей, где ИНН равен NULL или пустой строке.

3. Проверка пустых строк и особенности работы со строками

Пустые строки ("") — отдельная головная боль для разработчиков 1С. В отличие от NULL, пустая строка является заполненным значением, поэтому стандартные проверки на NULL здесь не работают.

3.1. Проверка на пустую строку через = ""

Самый очевидный способ:

ВЫБРАТЬ

Справочник.Номенклатура.Наименование КАК Наименование

ИЗ

Справочник.Номенклатура КАК Справочник.Номенклатура

ГДЕ

Справочник.Номенклатура.ПолноеНаименование = ""

Однако здесь есть подводный камень: если поле содержит пробелы или неразрывные пробелы ( ), такое сравнение не сработает. Для надёжности лучше использовать функцию СОКРЛП (сократить левые пробелы):

ГДЕ СОКРЛП(Справочник.Номенклатура.ПолноеНаименование) = ""

3.2. Комбинированная проверка на NULL и пустую строку

Часто требуется исключить и NULL, и пустые строки. Для этого используйте конструкцию с ИЛИ:

ВЫБРАТЬ

Документ.РеализацияТоваровУслуг.Номер КАК Номер

ИЗ

Документ.РеализацияТоваровУслуг КАК Документ.РеализацияТоваровУслуг

ГДЕ

НЕ (Документ.РеализацияТоваровУслуг.Комментарий ЕСТЬ NULL

ИЛИ Документ.РеализацияТоваровУслуг.Комментарий = "")

Убедиться, что поле не NULL|Проверить на пустую строку ("")|Учесть пробелы (использовать СОКРЛП)|При необходимости исключить неразрывные пробелы-->

3.3. Проблемы с регистром и невидимыми символами

В 1С строки сравниваются с учётом регистра! Это означает, что:

"Привет" <> "пРИВЕТ"

Кроме того, в полях могут содержаться невидимые символы (например, ЧР(9) — табуляция). Для надёжной проверки используйте комбинацию функций:

ГДЕ СОКРЛП(СОКРПП(Документ.ЗаказПокупателя.Комментарий)) = ""

Здесь СОКРПП удаляет пробелы справа, а СОКРЛП — слева.

4. Работа с числовыми полями: ноль vs NULL

Числовые поля в 1С могут содержать NULL (если не заполнены) или 0 (если явно установлены в ноль). Эти два состояния часто требуют разного подхода.

4.1. Проверка на ноль

Для проверки именно на ноль используйте обычное сравнение:

ВЫБРАТЬ

Документ.ОстаткиТоваров.Номенклатура КАК Номенклатура

ИЗ

Документ.ОстаткиТоваров КАК Документ.ОстаткиТоваров

ГДЕ

Документ.ОстаткиТоваров.Количество = 0

Но помните: если поле содержит NULL, такое сравнение не вернёт строку в результат! Для покрытия обоих случаев используйте:

ГДЕ (Документ.ОстаткиТоваров.Количество = 0 ИЛИ Документ.ОстаткиТоваров.Количество ЕСТЬ NULL)

4.2. Исключение нулей и NULL одновременно

Если нужно исключить все записи, где поле равно нулю или не заполнено:

ВЫБРАТЬ

РегистрНакопления.ОстаткиТоваров.Номенклатура КАК Номенклатура,

РегистрНакопления.ОстаткиТоваров.КоличествоОстаток КАК Остаток

ИЗ

РегистрНакопления.ОстаткиТоваров КАК РегистрНакопления.ОстаткиТоваров

ГДЕ

НЕ (РегистрНакопления.ОстаткиТоваров.КоличествоОстаток = 0

ИЛИ РегистрНакопления.ОстаткиТоваров.КоличествоОстаток ЕСТЬ NULL)

4.3. Особенности работы с денежными полями

Для полей типа Число с точностью (например, денежные суммы) ноль может быть представлен как 0.00. При сравнении учитывайте формат:

ГДЕ Документ.ПоступлениеДенежныхСредств.СуммаДокумента = 0.00
⚠️ Внимание: При работе с регистрами накопления или бухгалтерскими итогами ноль может означать не отсутствие данных, а реальный нулевой остаток. Всегда уточняйте бизнес-логику перед фильтрацией!

5. Проверка пустых дат и особенности типа Дата

В 1С пустая дата представлена значением '00010101' (1 января 1 года). Это минимально возможная дата в системе, и она часто используется для обозначения "отсутствия даты".

5.1. Проверка на пустую дату

Для проверки, что дата не установлена, используйте:

ВЫБРАТЬ

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

ИЗ

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

ГДЕ

Документ.ЗаказПокупателя.ДатаОтгрузки = ДАТАВРЕМЯ(1, 1, 1)

Или более читаемый вариант с функцией:

ГДЕ Документ.ЗаказПокупателя.ДатаОтгрузки = НАЧАЛОДНЯ(ДАТАВРЕМЯ(1, 1, 1))

5.2. Исключение пустых дат из выборки

Если нужно получить только записи с заполненной датой:

ВЫБРАТЬ

Справочник.ДоговорыКонтрагентов.Номер КАК НомерДоговора

ИЗ

Справочник.ДоговорыКонтрагентов КАК Справочник.ДоговорыКонтрагентов

ГДЕ

Справочник.ДоговорыКонтрагентов.ДатаОкончания > ДАТАВРЕМЯ(1, 1, 1)

5.3. Работа с диапазонами дат

При фильтрации по диапазону пустые даты могут искажать результат. Например, этот запрос не вернёт записи с пустой датой:

ГДЕ Документ.РеализацияТоваровУслуг.Дата >= НАЧАЛОДНЯ(ТЕКУЩАЯДАТА()) - 30

Чтобы включить пустые даты, добавьте явную проверку:

ГДЕ (Документ.РеализацияТоваровУслуг.Дата >= НАЧАЛОДНЯ(ТЕКУЩАЯДАТА()) - 30

ИЛИ Документ.РеализацияТоваровУслуг.Дата = ДАТАВРЕМЯ(1, 1, 1))

Тип поля Пустое значение Способ проверки Пример кода
Строка NULL или "" ЕСТЬ NULL или = "" ГДЕ Поле ЕСТЬ NULL ИЛИ Поле = ""
Число NULL или 0 ЕСТЬ NULL или = 0 ГДЕ Поле = 0 ИЛИ Поле ЕСТЬ NULL
Дата '00010101' = ДАТАВРЕМЯ(1,1,1) ГДЕ Поле = НАЧАЛОДНЯ(ДАТАВРЕМЯ(1,1,1))
Справочник NULL или пустая ссылка ЕСТЬ NULL или ЗНАЧЕНИЕ ЗАПОЛНЕНО ГДЕ НЕ ЗНАЧЕНИЕЗАПОЛНЕНО(Поле)
Булево NULL или Ложь ЕСТЬ NULL или = ЛОЖЬ ГДЕ Поле = ЛОЖЬ ИЛИ Поле ЕСТЬ NULL

6. Проверка ссылочных полей (справочники, документы)

Ссылочные поля (например, ссылки на справочники или документы) имеют свои особенности. Пустое значение здесь может быть представлено как NULL или как пустая ссылка (например, для нового элемента справочника).

6.1. Проверка на пустую ссылку

Для ссылочных полей используйте:

ВЫБРАТЬ

Документ.ПоступлениеТоваров.Номер КАК НомерДокумента

ИЗ

Документ.ПоступлениеТоваров КАК Документ.ПоступлениеТоваров

ГДЕ

Документ.ПоступлениеТоваров.Контрагент ЕСТЬ NULL

Если ссылка существует, но ведёт на несуществующий объект, 1С вернёт ошибку. Чтобы избежать этого, используйте ЗНАЧЕНИЕЗАПОЛНЕНО:

ГДЕ НЕ ЗНАЧЕНИЕЗАПОЛНЕНО(Документ.ПоступлениеТоваров.Контрагент)

6.2. Проверка на конкретное значение справочника

Если нужно проверить, что поле ссылается на определённый элемент (например, "Прочее" в справочнике номенклатуры):

ВЫБРАТЬ

Документ.РеализацияТоваровУслуг.Номер КАК Номер

ИЗ

Документ.РеализацияТоваровУслуг КАК Документ.РеализацияТоваровУслуг

ГДЕ

Документ.РеализацияТоваровУслуг.Номенклатура = ЗНАЧЕНИЕ(Справочник.Номенклатура.Прочее)

⚠️ Внимание: При работе с динамическими списками или виртуальными таблицами проверка ссылочных полей на NULL может значительно замедлять запрос. В таких случаях используйте ЛЕВОЕ СОЕДИНЕНИЕ вместо фильтрации в ГДЕ.

7. Типовые ошибки и как их избежать

Даже опытные разработчики 1С допускают ошибки при работе с пустыми значениями. Вот наиболее распространённые:

  • 🚫 Использование = NULL вместо ЕСТЬ NULL — это синтаксическая ошибка в 1С.
  • 🚫 Проверка только на NULL, забывая про пустые строки или нули.
  • 🚫 Сравнение дат с NULL без учёта минимальной даты '00010101'.
  • 🚫 Использование ЗНАЧЕНИЕЗАПОЛНЕНО для числовых полей, где ноль — допустимое значение.
  • 🚫 Проверка ссылочных полей без учёта того, что объект мог быть удалён.

7.1. Ошибка: Неправильная проверка булевых полей

Булевы поля (Булево) могут содержать NULL, Истина или Ложь. Ошибка — проверять их как:

ГДЕ Документ.ЗаказПокупателя.Оплачен = ЛОЖЬ

Это не вернёт строки, где поле равно NULL. Правильный вариант:

ГДЕ (Документ.ЗаказПокупателя.Оплачен = ЛОЖЬ ИЛИ Документ.ЗаказПокупателя.Оплачен ЕСТЬ NULL)

7.2. Ошибка: Проверка на пустоту в подзапросах

В подзапросах условие ЕСТЬ NULL может работать не так, как вы ожидаете. Например:

ВЫБРАТЬ

Справочник.Контрагенты.Наименование КАК Контрагент

ГДЕ

ЕСТЬNULL((ВЫБРАТЬ ПЕРВЫЕ 1 КонтрагентИНН ИЗ Справочник.Контрагенты КАК К ГДЕ К.Ссылка = Справочник.Контрагенты.Ссылка), "") = ""

Здесь лучше использовать ЗНАЧЕНИЕЗАПОЛНЕНО:

ГДЕ НЕ ЗНАЧЕНИЕЗАПОЛНЕНО((ВЫБРАТЬ ПЕРВЫЕ 1 КонтрагентИНН ИЗ Справочник.Контрагенты КАК К ГДЕ К.Ссылка = Справочник.Контрагенты.Ссылка))
Почему в 1С нельзя использовать IS NULL как в SQL?

В стандартном SQL для проверки на отсутствие значения используется конструкция IS NULL. Однако в 1С синтаксис запросов адаптирован под внутреннюю логику платформы, где для этой цели используется ЕСТЬ NULL. Это сделано для совместимости с русскоязычным синтаксисом и внутренней реализацией работы с неопределёнными значениями. Кроме того, в 1С NULL не всегда эквивалентен Неопределено в языке, что добавляет сложности при интеграции с внешними СУБД.

8. Оптимизация запросов с проверкой на пустоту

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

  • 🚀 Используйте ЛЕВОЕ СОЕДИНЕНИЕ вместо ГДЕ для фильтрации по ссылочным полям.
  • 🚀 Для часто используемых проверок создавайте индексы в базе данных.
  • 🚀 Избегайте функций в условиях (СОКРЛП, НАЧАЛОПЕРИОДА и т.д.), если это возможно.
  • 🚀 Для сложных условий используйте временные таблицы.

8.1. Пример оптимизированного запроса

Instead of:

ВЫБРАТЬ

Документ.РеализацияТоваровУслуг.Номер КАК Номер

ИЗ

Документ.РеализацияТоваровУслуг КАК Документ.РеализацияТоваровУслуг

ГДЕ

НЕ (Документ.РеализацияТоваровУслуг.Комментарий ЕСТЬ NULL

ИЛИ Документ.РеализацияТоваровУслуг.Комментарий = "")

Better:

ВЫБРАТЬ

Документ.РеализацияТоваровУслуг.Номер КАК Номер

ИЗ

Документ.РеализацияТоваровУслуг КАК Документ.РеализацияТоваровУслуг

ГДЕ

ЗНАЧЕНИЕЗАПОЛНЕНО(Документ.РеализацияТоваровУслуг.Комментарий)

И Документ.РеализацияТоваровУслуг.Комментарий <> ""

8.2. Использование временных таблиц

Для сложных отчётов с множеством проверок на пустоту имеет смысл использовать временные таблицы:

// Сначала отбираем все нужные документы

ВЫБРАТЬ

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

ПОМЕСТИТЬ ВТДокументы

ИЗ

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

ГДЕ

ЗНАЧЕНИЕЗАПОЛНЕНО(Документ.ЗаказПокупателя.Контрагент)

// Затем работаем с отфильтрованными данными

ВЫБРАТЬ

ВТДокументы.Ссылка.Номер КАК Номер

ИЗ

ВТДокументы КАК ВТДокументы

💡

Всегда тестируйте производительность запросов с проверкой на пустоту на реальных данных. Даже правильно написанный запрос может тормозить из-за большого объёма NULL-значений в базе.

FAQ: Частые вопросы по проверке пустых значений

Как проверить, что поле содержит либо NULL, либо пустую строку?

Используйте конструкцию с ИЛИ:

ГДЕ (Поле ЕСТЬ NULL ИЛИ Поле = "")

Или более короткий вариант с ЗНАЧЕНИЕЗАПОЛНЕНО (но помните, что он также вернёт Ложь для нулей и пустых дат):

ГДЕ НЕ ЗНАЧЕНИЕЗАПОЛНЕНО(Поле)
Почему запрос не возвращает строки, где числовое поле равно нулю?

Скорее всего, вы используете проверку только на NULL, забывая про ноль. Нужно явно указать оба условия:

ГДЕ (Поле = 0 ИЛИ Поле ЕСТЬ NULL)

Или, если нужно исключить оба варианта:

ГДЕ НЕ (Поле = 0 ИЛИ Поле ЕСТЬ NULL)
Как проверить ссылочное поле на пустоту, если объект мог быть удалён?

Используйте ЗНАЧЕНИЕЗАПОЛНЕНО — это безопасный способ, который не вызовет ошибку, даже если объект удалён:

ГДЕ НЕ ЗНАЧЕНИЕЗАПОЛНЕНО(Документ.СсылкаНаКонтрагента)

Если нужно именно проверить на удалённый объект (а не на NULL), используйте:

ГДЕ Документ.СсылкаНаКонтрагента.ПометкаУдаления = ИСТИНА
Можно ли в одном запросе проверить несколько полей на пустоту?

Да, используйте логические операторы И и ИЛИ для комбинирования условий:

ГДЕ (Поле1 ЕСТЬ NULL ИЛИ Поле1 = "")

И (Поле2 ЕСТЬ NULL ИЛИ Поле2 = 0)

Для упрощения можно использовать ЗНАЧЕНИЕЗАПОЛНЕНО, но помните о его особенностях:

ГДЕ НЕ ЗНАЧЕНИЕЗАПОЛНЕНО(Поле1) И НЕ ЗНАЧЕНИЕЗАПОЛНЕНО(Поле2)
Как в запросе заменить NULL на другое значение?

Используйте функцию ВЫРАЗИТЬ или ЕСТЬNULL (аналог COALESCE в SQL):

ВЫБРАТЬ

ЕСТЬNULL(Документ.Поле, 0) КАК ПолеСЗначением

ИЗ

Документ КАК Документ

Для строковых полей:

ВЫБРАТЬ

ЕСТЬNULL(Документ.Комментарий, "Нет комментария") КАК Комментарий

ИЗ

Документ КАК Документ