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