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

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

Как в запросе 1С проверить, заполнено ли поле

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

Проверка заполненности поля — одна из самых частых задач при написании запросов в 1С. При этом «не заполнено» может означать разное: значение NULL, пустая ссылка, пустая строка, нулевое число или неопределённая дата. Универсальной проверки на все случаи не существует, поэтому важно понимать, какой тип данных хранится в поле, и подбирать проверку под конкретный тип.

Ошибка в такой проверке приводит к тому, что строки молча отфильтровываются или, наоборот, попадают в выборку лишние данные. Отчёт «теряет» документы, отбор в обработке работает непредсказуемо, а найти причину бывает сложно, потому что запрос формально выполняется без ошибок.

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

Почему одной проверки недостаточно: что значит «не заполнено»

В языке запросов 1С «пустое» значение зависит от типа поля. Для ссылочного реквизита пустое значение — это пустая ссылка конкретного типа. Для строки — строка нулевой длины (или строка из пробелов, если реквизит имеет фиксированную длину). Для числа — ноль, для даты — 01.01.0001, для булево — Ложь.

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

Из-за этого проверка Реквизит = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) не отловит NULL, а проверка Реквизит ЕСТЬ NULL не отловит пустую ссылку. Если поле может содержать и то и другое, нужны оба условия через ИЛИ.

Проверка на NULL: ЕСТЬ NULL и ЕСТЬNULL

Чтобы отобрать строки, где поле не заполнено из-за отсутствия значения, используется оператор ЕСТЬ NULL. Обратная проверка — НЕ ЕСТЬ NULL:

ГДЕ

Таб.Контрагент ЕСТЬ NULL

ГДЕ

НЕ Таб.Контрагент ЕСТЬ NULL

Конструкция ЕСТЬNULL(Поле, ЗначениеПоУмолчанию) работает иначе: она не проверяет, а подменяет NULL указанным значением. Это удобно, когда нужно в результате вместо NULL показать пустую строку или ноль, либо сравнить поле с чем-то, не опасаясь NULL:

ВЫБРАТЬ

ЕСТЬNULL(Остатки.Количество, 0) КАК Количество

ИЗ

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

Важный нюанс: сравнение Поле = NULL в запросе 1С недопустимо по смыслу — результат такого сравнения не определён, и условие никогда не сработает как ожидается. Всегда используйте ЕСТЬ NULL.

Проверка ссылочного поля: пустая ссылка

Для реквизитов ссылочного типа (справочники, документы, перечисления, планы счетов и т.д.) незаполненное значение — это пустая ссылка. Проверка выполняется сравнением со значением, полученным через функцию ЗНАЧЕНИЕ:

ГДЕ

Док.Партнер = ЗНАЧЕНИЕ(Справочник.Партнеры.ПустаяСсылка)

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

ГДЕ

Док.Партнер <> ЗНАЧЕНИЕ(Справочник.Партнеры.ПустаяСсылка)

И НЕ Док.Партнер ЕСТЬ NULL

Для перечислений синтаксис аналогичен: ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.ПустаяСсылка). Обратите внимание: указывать нужно реальный тип реквизита. Если реквизит имеет тип «СправочникСсылка.Контрагенты», а вы сравниваете с пустой ссылкой другого справочника, сравнение не сработает корректно.

1c
ГДЕ
    НЕ Док.Партнер ЕСТЬ NULL
    И Док.Партнер <> ЗНАЧЕНИЕ(Справочник.Партнеры.ПустаяСсылка)

Проверка строк, чисел, дат и булево

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

ГДЕ

ВЫРАЗИТЬ(Таб.Комментарий КАК СТРОКА(1)) = ""

Такой приём отсекает и пустые строки, и строки из пробелов, потому что при приведении к СТРОКА(1) пробельная строка превращается в пустую. Для полей неограниченной длины достаточно простого Таб.Комментарий = "".

Числовые и датовые поля проверяются сравнением с их пустыми значениями: Таб.Сумма = 0 и Таб.ДатаОплаты = ДАТАВРЕМЯ(1, 1, 1). Для булевых полей «не заполнено» обычно означает Ложь: НЕ Таб.Согласовано.

Поля составного типа и универсальная проверка

Самая сложная ситуация — реквизит составного типа, например «Значение» характеристик или «Договор» в документах, где допустимы ссылки разных объектов. Здесь незаполненное значение может быть пустой ссылкой любого из типов состава, а в соединениях — ещё и NULL.

Универсальный приём — привести поле к строке и сравнить с пустой строкой. Пустая ссылка любого типа при приведении к строке даёт пустую строку, поэтому такая проверка срабатывает независимо от конкретного типа:

ГДЕ

ВЫРАЗИТЬ(Таб.ЗначениеСвойства КАК СТРОКА(1)) = ""

ИЛИ Таб.ЗначениеСвойства ЕСТЬ NULL

Минус подхода — приведение к строке не использует индексы и может замедлить запрос на больших таблицах. Если типов в составе мало, надёжнее перечислить пустые ссылки явно:

ГДЕ

Таб.Договор В (

ЗНАЧЕНИЕ(Справочник.ДоговорыКонтрагентов.ПустаяСсылка),

ЗНАЧЕНИЕ(Справочник.ДоговорыССотрудниками.ПустаяСсылка))

Способы проверки заполненности

Сравнение с пустой ссылкой

Быстро, использует индексы. Подходит, когда тип поля известен и одиночный. Не ловит NULL.

ЕСТЬ NULL / НЕ ЕСТЬ NULL

Единственный способ проверить отсутствие значения после соединений. Не ловит пустые ссылки и пустые строки.

ВЫРАЗИТЬ(... КАК СТРОКА(1)) = ""

Универсально для составных типов и строк с пробелами. Медленнее, индексы не используются.

Замена незаполненного значения в результате: ЕСТЬNULL и ВЫБОР

Часто задача не отфильтровать, а вывести вместо пустого значения осмысленный текст или значение по умолчанию. Для NULL используется ЕСТЬNULL, для остальных случаев — конструкция ВЫБОР:

ВЫБРАТЬ

ВЫБОР

КОГДА Док.Партнер ЕСТЬ NULL

ИЛИ Док.Партнер = ЗНАЧЕНИЕ(Справочник.Партнеры.ПустаяСсылка)

ТОГДА "Не указан"

ИНАЧЕ Док.Партнер.Наименование

КОНЕЦ КАК ПартнерПредставление

ИЗ

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

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

Порядок подбора проверки
  1. 1
    Определите тип поля: ссылка, строка, число, дата или составной тип.
  2. 2
    Выясните, может ли поле содержать NULL (есть ли соединения в запросе).
  3. 3
    Для ссылки — сравнение с ЗНАЧЕНИЕ(...ПустаяСсылка), для строки — с "" или через ВЫРАЗИТЬ, для NULL — ЕСТЬ NULL.
  4. 4
    При необходимости объедините условия через ИЛИ.
  5. 5
    Проверьте запрос в консоли запросов на данных с заведомо пустыми и заполненными полями.

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

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

Третья ошибка — использование НЕ ... ЕСТЬ NULL без учёта пустых ссылок: поле формально заполнено (ссылка есть), но это пустая ссылка, и бизнес-логика считает его незаполненным. Наконец, при сравнении строк забывают про фиксированную длину и пробелы.

Типичные ошибки
01
Сравнение Поле = NULL — условие никогда не истинно, строки теряются без ошибки запроса.
02
Проверка только на пустую ссылку при левом соединении — NULL-строки проходят фильтр.
03
Проверка строки только на "" — строки из пробелов при фиксированной длине считаются заполненными.
04
Пустая ссылка не того типа при составном реквизите — сравнение молча не срабатывает.
Контрольные точки

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

Выполните запрос в консоли запросов на тестовых данных
Норма

Строки с пустыми полями отобраны или исключены как задумано

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

Количество строк не меняется при изменении условия

Проверьте поля после левого соединения
Норма

NULL-значения обработаны отдельным условием

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

В результате видны пустые колонки, не попавшие в фильтр

Сравните тип реквизита в метаданных с типом в ЗНАЧЕНИЕ()
Норма

Типы совпадают

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

Используется пустая ссылка другого объекта

FAQ

Как проверить, что поле заполнено, одним условием для любого типа?

Строго универсального условия нет. Ближайший вариант — ВЫРАЗИТЬ(Поле КАК СТРОКА(1)) <> "" в сочетании с НЕ Поле ЕСТЬ NULL. Он покрывает пустые ссылки любого типа, пустые строки и NULL, но не использует индексы и на больших таблицах работает медленнее точечных проверок.

Чем ЕСТЬNULL отличается от ЕСТЬ NULL?

ЕСТЬ NULL — это логическое условие для отбора строк в секции ГДЕ. ЕСТЬNULL(Поле, Значение) — функция, которая возвращает значение поля, а если оно NULL — подставляет указанное значение. Первое фильтрует, второе заменяет.

Почему условие Поле = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка) не отбирает записи?

Чаще всего поле содержит NULL, а не пустую ссылку — например, из-за левого соединения. Добавьте условие ИЛИ Поле ЕСТЬ NULL. Реже причина в том, что реквизит составного типа и фактическое значение имеет другой тип ссылки.

Как проверить заполненность поля типа «Дата»?

Сравните с пустой датой: Поле = ДАТАВРЕМЯ(1, 1, 1). Для проверки заполненности — Поле <> ДАТАВРЕМЯ(1, 1, 1). Если поле приходит из соединения, добавьте проверку на NULL.

Работает ли ПОДОБНО для проверки пустой строки?

Можно написать Поле ПОДОБНО "", но это не даёт преимуществ перед обычным сравнением и хуже читается. Для строк с пробелами ПОДОБНО тоже не поможет без шаблонов — надёжнее приведение через ВЫРАЗИТЬ к СТРОКА(1).

Как в СКД отобрать записи с незаполненным полем?

В отборе СКД для ссылочных полей доступно сравнение с пустой ссылкой, а также вид сравнения «Заполнено» / «Не заполнено», который платформа преобразует в нужную комбинацию условий автоматически. В тексте самого запроса набора данных используйте те же приёмы, что и в обычном запросе.

Итог

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

«Незаполненное» поле в 1С — это NULL, пустая ссылка, пустая строка, ноль или пустая дата в зависимости от типа. Проверку подбирают под тип: ЕСТЬ NULL для отсутствующих значений, ЗНАЧЕНИЕ(...ПустаяСсылка) для ссылок, ВЫРАЗИТЬ к СТРОКА(1) для строк и составных типов. При сомнениях комбинируйте условия через ИЛИ и проверяйте запрос на реальных данных в консоли.