Как проверить что результат запроса не пустой

Бесплатная консультация юриста

+7 (800) 302-87-29

Реклама jurik.ru

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

В этой статье мы подробно разберем, как правильно проверять пустой результат, когда это оправдано, а когда является избыточным, и почему метод Выбрать не является ресурсоемкой операцией.

Основные методы работы с результатом запроса

После выполнения запроса методом Выполнить мы получаем объект РезультатЗапроса. У этого объекта есть два ключевых метода для начала работы с данными:

  • Пустой — возвращает Истина, если выборка не содержит ни одной строки, и Ложь в противном случае.
  • Выбрать — возвращает объект ВыборкаИзРезультатаЗапроса для пошагового обхода строк результата.

Типичная ошибка: «Избыточный вызов» Пустой

Согласно Системе стандартов разработки (ITS), часто встречается следующий антипаттерн:

// НЕПРАВИЛЬНО (избыточная проверка)
РезультатЗапроса = Запрос.Выполнить;
Если НЕ РезультатЗапроса.Пустой Тогда // Избыточный вызов
 Выборка = РезультатЗапроса.Выбрать; 
 Пока Выборка.Следующий Цикл
 // Обработка строки
 КонецЦикла;
КонецЕсли;

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

Правильный подход: Непосредственный обход выборки

Оптимальный и рекомендуемый стандартами способ — сразу получать выборку и обходить её:

// ПРАВИЛЬНО
Выборка = Запрос.Выполнить.Выбрать;
Пока Выборка.Следующий Цикл
 // Обработка строки
КонецЦикла;
// Если выборка пуста, цикл просто не выполнится

Миф о ресурсоемкости Выбрать

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

Реальность: Метод Выбрать не является ресурсоемкой операцией. Он не выгружает данные в память целиком. Он лишь создает курсор (итератор) для чтения строк; Самое времязатратное действие — это Выполнить (обращение к СУБД). Проверка Пустой также требует обращения к результату (часто к первому ряду), поэтому комбинация Пустой + Выбрать даже может быть чуть медленнее, чем просто Выбрать.

Легко проверить: создайте запрос, выдающий более миллиона записей, и увидите, что Выбрать выполняется за мгновение. — цитата с форума Infostart.

Когда использование метода Пустой ОПРАВДАНО

Метод Пустой нужен тогда, когда нам не нужны сами данные выборки, а важен только факт их наличия или отсутствия (логическое «Да/Нет»).

Пример 1: Проверка существования записи (флаг)

// Нужно только узнать: есть остатки или нет?
РезультатЗапроса = Запрос.Выполнить;
ЕстьОстатки = НЕ РезультатЗапроса.Пустой;
// Выборка нам не нужна, мы не обходим строки

Пример 2: Условная логика без обхода

Если в зависимости от наличия данных выполняются принципиально разные ветки алгоритма, и в одной из веток обхода нет:

РезультатЗапроса = Запрос.Выполнить;
Если РезультатЗапроса.Пустой Тогда
 // Логика для пустого результата (например, создание новой записи, ошибка, дефолтные значения)
 Сообщить("Данные не найдены");
 Возврат;
КонецЕсли;

// Логика для непустого результата (например, сложная обработка, требующая выборки)
Выборка = РезультатЗапроса.Выбрать;
Пока Выборка.Следующий Цикл
 ...
КонецЦикла;

Пример 3: Оптимизация «Ранний выход» (Early Return)

Иногда проверка Пустой используется для выхода из процедуры до выполнения тяжелой логики инициализации, которая нужна только если есть данные:

РезультатЗапроса = Запрос.Выполнить;
Если РезультатЗапроса.Пустой Тогда
 Возврат; // Экономим ресурсы на инициализацию табличного документа, массивов и т.д.
КонецЕсли;
// Тяжелая подготовка к выводу
ТабДок = Новый ТабличныйДокумент;
// ... настройка ТабДок ...

Выборка = РезультатЗапроса.Выбрать;
Пока Выборка.Следующий Цикл
КонецЦикла;

Сравнительная таблица подходов

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

Распространенный паттерн: «Выбрать -> Следующий» вместо Пустой

Иногда в коде встречается такой способ проверки на пустоту:

Выборка = Запрос.Выполнить.Выбрать;
Если Выборка.Следующий Тогда
 // Есть данные. Но курсор уже сдвинут на первую строку!
 // Нужно либо обработать эту строку здесь, либо использовать Выборка.Сбросить (если поддерживается), 
 // либо начинать цикл с текущей позиции.
 Возврат Истина;
Иначе
 Возврат Ложь;
КонецЕсли;

Недостатки: Этот подход сдвигает курсор выборки на первую строку. Если после проверки вы планируете обходить выборку в цикле Пока Выборка.Следующий, вы пропустите первую строку, так как курсор уже стоит на ней (метод Следующий переходит к следующей).

Метод Пустой не сдвигает курсор и семантически понятнее для проверки «пусто/не пусто».

Резюме (Best Practices)

  1. По умолчанию не проверяйте Пустой перед циклом. Пишите сразу: Выборка = Запрос.Выполнить.Выбрать; Пока Выборка.Следующий Цикл ....
  2. Используйте Пустой только когда:
      Вам не нужна выборка (вам нужен только флаг наличия данных).
    • Вам нужно выполнить другую логику (не связанную с обходом этой выборки) в случае пустого результата (Early Return, генерация ошибки, создание дефолтной записи).
  3. Не бойтесь Выбрать. Это легкая операция создания итератора, а не выгрузка данных в память.
  4. Следуйте стандартам (ITS). Стандарты 1С прямо указывают: «предварительный вызов метода Пустой не требуется» при необходимости выбрать или выгрузить результат.

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