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

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

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

Способы проверить, пустой ли запрос в 1С: метод Пустой() результата запроса, проверка выборки, НайтиПоНомеру, типичные ошибки и примеры кода для разработчика.

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

В языке 1С есть несколько уровней, на которых выполняется проверка: сам объект Запрос, результат запроса (РезультатЗапроса), выборка из результата и таблица значений, полученная методом Выгрузить(). У каждого уровня — свои методы и свои признаки пустоты. Ниже разобраны все рабочие способы с примерами кода, типичные ошибки и критерии выбора подходящего варианта.

Что считается «пустым запросом» в 1С

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

Чаще всего под проверкой «пустой ли запрос» имеется в виду вторая ситуация: выполнен запрос, и нужно понять, есть ли в результате хотя бы одна строка. Для этого у объекта РезультатЗапроса предусмотрен метод Пустой(). Он возвращает Истина, если результат не содержит ни одной записи, и Ложь, если хотя бы одна строка есть.

Важно понимать: метод Пустой() принадлежит результату запроса, а не самому объекту Запрос. Вызвать его можно только после выполнения запроса, иначе получите ошибку обращения к несуществующему методу.

Базовая проверка: метод Пустой() результата запроса

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

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

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

|ИЗ

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

|ГДЕ

| Номенклатура.Артикул = &Артикул";

Запрос.УстановитьПараметр("Артикул", ИскомыйАртикул);

РезультатЗапроса = Запрос.Выполнить();

Если РезультатЗапроса.Пустой() Тогда

Сообщить("Элемент с таким артикулом не найден");

Иначе

Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий() Цикл

// обработка строк

КонецЦикла;

КонецЕсли;

Обратите внимание на порядок: сначала Выполнить(), потом Пустой(). Если вызвать Запрос.Пустой() у самого объекта запроса, платформа выдаст ошибку, потому что у объекта Запрос такого метода нет. Это одна из самых частых ошибок начинающих разработчиков.

Метод Пустой() не требует обхода данных и не выгружает результат в память — это быстрая проверка. Использовать её предпочтительнее, чем выгружать таблицу и считать строки, если нужно просто узнать, есть ли данные.

Порядок действий
  1. 1
    Создайте объект Запрос и задайте текст запроса
  2. 2
    Установите все параметры через УстановитьПараметр()
  3. 3
    Выполните запрос: Результат = Запрос.Выполнить()
  4. 4
    Проверьте результат: Если Результат.Пустой() Тогда
  5. 5
    В ветке Иначе получите выборку через Выбрать() и обойдите её

Проверка через выборку: когда Пустой() не нужен

Если после проверки вы всё равно собираетесь обходить данные, отдельный вызов Пустой() часто избыточен. Метод Следующий() выборки сам возвращает Ложь, когда записей нет, поэтому конструкция с циклом корректно отработает и на пустом результате:

Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда

// запись найдена, работаем с первой строкой

НайденнаяСсылка = Выборка.Ссылка;

Иначе

// результат пуст

КонецЕсли;

Такой подход особенно удобен, когда запрос должен вернуть ровно одну запись — например, поиск элемента по уникальному коду или артикулу. Один вызов Следующий() одновременно выполняет проверку на пустоту и позиционирует выборку на первую строку.

Для полного обхода используйте цикл Пока Выборка.Следующий() Цикл без предварительной проверки: при пустом результате тело цикла просто не выполнится ни разу. Отдельная проверка Пустой() оправдана, когда логика для пустого и непустого результата существенно различается и ветку «нет данных» нужно обработать до начала обхода.

Проверка пустоты после выгрузки в таблицу значений

Когда результат запроса выгружается в таблицу значений методом Выгрузить(), проверка выполняется через количество строк:

ТаблицаРезультата = Запрос.Выполнить().Выгрузить();

Если ТаблицаРезультата.Количество() = 0 Тогда

// таблица пустая

КонецЕсли;

Этот способ применяется, когда данные нужны именно в виде таблицы: для передачи в форму, построчной модификации, сортировки или свёртки. Учтите, что Выгрузить() помещает весь результат в оперативную память. На больших выборках это заметно нагружает сервер, поэтому ради одной проверки на пустоту выгружать таблицу не стоит — используйте Пустой() у результата или первый Следующий() у выборки.

Сравнение вариантов

Результат.Пустой()

Быстрая проверка без обхода данных. Подходит, когда ветка «нет данных» обрабатывается отдельно до обхода. Не даёт доступа к самим строкам.

Выборка.Следующий()

Совмещает проверку и доступ к первой записи. Оптимален для запросов, возвращающих одну строку, и для полного обхода в цикле.

Выгрузить().Количество() = 0

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

Как проверить, что текст запроса не задан

Отдельная задача — убедиться, что текст запроса вообще заполнен, прежде чем выполнять его. Если вызвать Выполнить() с пустым текстом, платформа выдаст ошибку. Проверка делается функцией ПустаяСтрока():

Если ПустаяСтрока(Запрос.Текст) Тогда

ВызватьИсключение "Не задан текст запроса";

КонецЕсли;

РезультатЗапроса = Запрос.Выполнить();

Такая защита полезна в универсальных процедурах, где текст запроса формируется динамически или передаётся параметром. ПустаяСтрока() корректно обрабатывает и строки, состоящие только из пробелов и переводов строк, поэтому надёжнее, чем сравнение с пустым литералом "".

Пустой результат и значения NULL: в чём разница

Распространённая путаница — смешение пустого результата со значениями NULL в полях. Запрос может вернуть строку, но часть полей в ней будет NULL, например при левом соединении, когда в присоединяемой таблице не нашлось пары. Метод Пустой() в этом случае вернёт Ложь, потому что строка есть, хотя данные в ней частично отсутствуют.

Для проверки конкретного поля на NULL используется функция ЕСТЬNULL() прямо в тексте запроса или проверка ЗначениеЗаполнено() / сравнение с Неопределено и NULL в коде:

Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий() Цикл

Если Выборка.Остаток = NULL Тогда

// остатка нет, хотя номенклатура найдена

КонецЕсли;

КонецЦикла;

Проще и надёжнее обработать NULL на уровне запроса: ЕСТЬNULL(Остатки.Количество, 0) КАК Количество. Тогда в выборке всегда будет значение ожидаемого типа, и отдельные проверки в коде не понадобятся.

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

Первая ошибка — вызов Пустой() до выполнения запроса или у самого объекта Запрос. Платформа сообщает, что метод не обнаружен, и неопытный разработчик начинает искать проблему не там. Правило простое: Пустой() существует только у результата, полученного через Выполнить().

Вторая ошибка — забытые параметры. Если параметр запроса не установлен, Выполнить() выдаст ошибку ещё до проверки. Если параметр установлен, но содержит не то значение (например, пустую ссылку вместо заполненной), запрос выполнится корректно, но вернёт пустой результат — и по коду это выглядит как «данных нет», хотя проблема во входных данных. Перед выводом сообщений «не найдено» проверяйте, чем заполнены параметры.

Третья ошибка — использование Выгрузить().Количество() ради одной проверки на больших таблицах. Это создаёт лишнюю нагрузку на память сервера. Четвёртая — проверка выборки через несуществующий у неё метод Пустой(): у объекта ВыборкаИзРезультатаЗапроса этого метода нет, проверять нужно через Следующий() или через Пустой() результата до получения выборки.

Типичные ошибки
01
Вызов Запрос.Пустой() вместо Результат.Пустой() — ошибка «Метод не обнаружен», проверять можно только результат после Выполнить()
02
Сообщение «данные не найдены» при пустом параметре запроса — сначала проверяйте, чем заполнены параметры
03
Выгрузка результата в таблицу ради проверки Количество() = 0 — лишний расход памяти на больших выборках
04
Ожидание метода Пустой() у выборки — у ВыборкаИзРезультатаЗапроса его нет, используйте Следующий()
05
Смешение пустого результата с NULL в полях — строка может существовать, но содержать NULL после левого соединения

Практические сценарии и выбор способа

Для проверки существования элемента перед созданием нового (контроль дублей) оптимален вариант с одним Следующий(): запрос с отбором по ключевым реквизитам, выборка, одна проверка. Если запись найдена — используем существующую ссылку, если нет — создаём новый элемент.

Для отчётных процедур, где пустой результат означает «нечего показывать», уместен РезультатЗапроса.Пустой() с выводом понятного сообщения пользователю вместо пустого табличного документа. Это улучшает поведение программы: пользователь видит причину, а не пустую форму.

В пакетных запросах (несколько запросов через точку с запятой) метод ВыполнитьПакет() возвращает массив результатов. Проверка Пустой() применяется к каждому элементу массива по индексу: Результаты[0].Пустой(). Не забывайте, что временные таблицы в пакете тоже занимают позиции в массиве результатов.

Маршрут решения

Как выбрать действие

Нужно только узнать, есть ли хотя бы одна строкаИспользуйте РезультатЗапроса.Пустой() — это самый быстрый вариант
Ожидается ровно одна запись и нужен доступ к её полямВызовите Выборка.Следующий() один раз и проверьте возвращённое значение
Данные нужны в виде таблицы значений для дальнейшей обработкиВыгрузите результат и проверьте Таблица.Количество() = 0
Текст запроса формируется динамическиПеред Выполнить() проверьте ПустаяСтрока(Запрос.Текст)
В пакетном запросе несколько результатовПроверяйте Пустой() у каждого элемента массива результатов по индексу

FAQ

Можно ли проверить пустоту запроса без Выполнить()?

Нет. Пока запрос не выполнен, данных из базы не получено, и проверять нечего. Метод Пустой() существует только у результата, который возвращает Выполнить(). Единственное, что можно проверить заранее, — заполненность текста запроса через ПустаяСтрока(Запрос.Текст).

Чем Пустой() отличается от проверки Выборка.Количество()?

У объекта ВыборкаИзРезультатаЗапроса метод Количество() существует, но для его корректной работы платформе может потребоваться обход данных. Пустой() у результата запроса — более лёгкая операция, предназначенная именно для быстрой проверки наличия строк. Для простой проверки предпочтительнее Пустой().

Почему запрос возвращает пустой результат, хотя данные в базе есть?

Чаще всего дело в параметрах: пустая ссылка, лишние пробелы в строковом параметре, несовпадение типов или отбор по дате с неверными границами периода. Также проверьте соединения таблиц: внутреннее соединение отсекает строки без пары. Отладьте запрос в консоли запросов с теми же значениями параметров.

Как проверить пустоту в запросе к виртуальной таблице регистра?

Точно так же, как для обычной таблицы: выполнить запрос и вызвать Пустой() у результата. Специфика виртуальных таблиц в другом — они зависят от переданных параметров (период, условия). Если результат неожиданно пуст, проверьте границы периода и корректность отбора в параметрах виртуальной таблицы.

Что вернёт Пустой(), если запрос содержит только итоги без детальных записей?

Если итоговая строка сформирована (например, при группировке с ОБЩИЕ или агрегатной функцией без GROUP BY), результат содержит строку, и Пустой() вернёт Ложь, даже если значения агрегатов равны NULL. Поэтому для запросов с агрегацией дополнительно проверяйте значения полей через ЕСТЬNULL().

Есть ли разница между тонким клиентом и сервером при проверке?

Нет, логика одинаковая: Пустой(), Выбрать() и Выгрузить() работают везде, где доступен объект РезультатЗапроса. Различие лишь в том, что запросы к базе выполняются в серверном контексте, поэтому проверка обычно размещается в серверных процедурах модуля.

Итог

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

Проверка выполняется у результата запроса после Выполнить(): Результат.Пустой(). Для одиночной записи удобнее Выборка.Следующий(), для таблицы значений — Количество() = 0. Не путайте пустой результат с NULL в полях, проверяйте параметры запроса и не выгружайте данные в таблицу ради одной проверки.