Проверка результата запроса на пустоту — одна из самых частых операций при разработке на платформе 1С:Предприятие 8. Однако, как показывает практика и документация (Стандарты разработки, ITS), разработчики часто используют неоптимальные подходы, добавляя лишние проверки, которые не несут пользы, а лишь захламляют код.
В этой статье мы подробно разберем, как правильно проверять пустой результат, когда это оправдано, а когда является избыточным, и почему метод Выбрать не является ресурсоемкой операцией.
Основные методы работы с результатом запроса
После выполнения запроса методом Выполнить мы получаем объект РезультатЗапроса. У этого объекта есть два ключевых метода для начала работы с данными:
- Пустой — возвращает
Истина, если выборка не содержит ни одной строки, иЛожьв противном случае. - Выбрать — возвращает объект ВыборкаИзРезультатаЗапроса для пошагового обхода строк результата.
Типичная ошибка: «Избыточный вызов» Пустой
Согласно Системе стандартов разработки (ITS), часто встречается следующий антипаттерн:
// НЕПРАВИЛЬНО (избыточная проверка)
РезультатЗапроса = Запрос.Выполнить;
Если НЕ РезультатЗапроса.Пустой Тогда // Избыточный вызов
Выборка = РезультатЗапроса.Выбрать;
Пока Выборка.Следующий Цикл
// Обработка строки
КонецЦикла;
КонецЕсли;
Почему это плохо? Проверка Пустой перед обходом выборкой является избыточной. Если результат пуст, цикл Пока Выборка.Следующий Цикл просто не выполнится ни разу (тело цикла пропустится), и код продолжит выполнение дальше. Дополнительная проверка Если НЕ ... Пустой не дает никакого выигрыша в производительности, а только увеличивает объем кода и снижает его читаемость.
Правильный подход: Непосредственный обход выборки
Оптимальный и рекомендуемый стандартами способ — сразу получать выборку и обходить её:
// ПРАВИЛЬНО
Выборка = Запрос.Выполнить.Выбрать;
Пока Выборка.Следующий Цикл
// Обработка строки
КонецЦикла;
// Если выборка пуста, цикл просто не выполнится
Миф о ресурсоемкости Выбрать
Многие разработчики считают, что Выбрать — это «тяжелая» операция, требующая выгрузки всех данных в память, и поэтому пытаются предварительно проверить Пустой.
Реальность: Метод Выбрать не является ресурсоемкой операцией. Он не выгружает данные в память целиком. Он лишь создает курсор (итератор) для чтения строк; Самое времязатратное действие — это Выполнить (обращение к СУБД). Проверка Пустой также требует обращения к результату (часто к первому ряду), поэтому комбинация Пустой + Выбрать даже может быть чуть медленнее, чем просто Выбрать.
Легко проверить: создайте запрос, выдающий более миллиона записей, и увидите, что Выбрать выполняется за мгновение. — цитата с форума Infostart.
Когда использование метода Пустой ОПРАВДАНО
Метод Пустой нужен тогда, когда нам не нужны сами данные выборки, а важен только факт их наличия или отсутствия (логическое «Да/Нет»).
Пример 1: Проверка существования записи (флаг)
// Нужно только узнать: есть остатки или нет?
РезультатЗапроса = Запрос.Выполнить;
ЕстьОстатки = НЕ РезультатЗапроса.Пустой;
// Выборка нам не нужна, мы не обходим строки
Пример 2: Условная логика без обхода
Если в зависимости от наличия данных выполняются принципиально разные ветки алгоритма, и в одной из веток обхода нет:
РезультатЗапроса = Запрос.Выполнить;
Если РезультатЗапроса.Пустой Тогда
// Логика для пустого результата (например, создание новой записи, ошибка, дефолтные значения)
Сообщить("Данные не найдены");
Возврат;
КонецЕсли;
// Логика для непустого результата (например, сложная обработка, требующая выборки)
Выборка = РезультатЗапроса.Выбрать;
Пока Выборка.Следующий Цикл
...
КонецЦикла;
Пример 3: Оптимизация «Ранний выход» (Early Return)
Иногда проверка Пустой используется для выхода из процедуры до выполнения тяжелой логики инициализации, которая нужна только если есть данные:
РезультатЗапроса = Запрос.Выполнить;
Если РезультатЗапроса.Пустой Тогда
Возврат; // Экономим ресурсы на инициализацию табличного документа, массивов и т.д.
КонецЕсли;
// Тяжелая подготовка к выводу
ТабДок = Новый ТабличныйДокумент;
// ... настройка ТабДок ...
Выборка = РезультатЗапроса.Выбрать;
Пока Выборка.Следующий Цикл
КонецЦикла;
Сравнительная таблица подходов
| Сценарий | Рекомендуемый код | Пояснение |
|---|---|---|
| Нужно обойти все строки результата | Выборка = Запрос.Выполнить.Выбрать; | Проверка Пустой избыточна; Цикл сам не выполнится при пустоте. |
| Нужен только факт наличия данных (Булево значение) | ЕстьДанные = НЕ Запрос.Выполнить.Пустой; | Создание выборки (Выбрать) здесь лишнее. |
| Разная логика для пустого/непустого результата (без обхода в одном из случаев) | Рез = Запрос.Выполнить; | Проверка оправдана, так как выборка может не понадобиться. |
| Заполнение табличной части / печатной формы | Выборка = Запрос.Выполнить.Выбрать; | Если данных нет — просто не добавится ни одной строки. Проверка не нужна. |
Распространенный паттерн: «Выбрать -> Следующий» вместо Пустой
Иногда в коде встречается такой способ проверки на пустоту:
Выборка = Запрос.Выполнить.Выбрать;
Если Выборка.Следующий Тогда
// Есть данные. Но курсор уже сдвинут на первую строку!
// Нужно либо обработать эту строку здесь, либо использовать Выборка.Сбросить (если поддерживается),
// либо начинать цикл с текущей позиции.
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
Недостатки: Этот подход сдвигает курсор выборки на первую строку. Если после проверки вы планируете обходить выборку в цикле Пока Выборка.Следующий, вы пропустите первую строку, так как курсор уже стоит на ней (метод Следующий переходит к следующей).
Метод Пустой не сдвигает курсор и семантически понятнее для проверки «пусто/не пусто».
Резюме (Best Practices)
- По умолчанию не проверяйте
Пустойперед циклом. Пишите сразу:Выборка = Запрос.Выполнить.Выбрать; Пока Выборка.Следующий Цикл .... - Используйте
Пустойтолько когда:Вам не нужна выборка (вам нужен только флаг наличия данных). - Вам нужно выполнить другую логику (не связанную с обходом этой выборки) в случае пустого результата (Early Return, генерация ошибки, создание дефолтной записи).
- Не бойтесь
Выбрать. Это легкая операция создания итератора, а не выгрузка данных в память. - Следуйте стандартам (ITS). Стандарты 1С прямо указывают: «предварительный вызов метода Пустой не требуется» при необходимости выбрать или выгрузить результат.
Грамотная работа с результатом запроса делает код чище, быстрее и понятнее. Главное правило: если вы идете обходить выборку — не проверяйте её на пустоту заранее. Цикл Пока Выборка.Следующий идеально справляется с пустым результатом сам. Оставьте метод Пустой для тех редких случаев, когда вам нужен ответ на вопрос «Есть данные?» без необходимости их читать.