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