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