Какие знаешь способы пользоваться запросом?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Способы использования Запроса в 1С: полный разбор
Запрос — один из самых мощных инструментов в 1С для работы с данными. Рассмотрю все основные способы его применения, от простых до продвинутых техник.
Способ 1: Основное использование
Самый частый способ — выполнить запрос и получить таблицу:
Процедура ПримерБазовогоЗапроса()
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ДС.Ссылка, ДС.Номер, ДС.Дата ИЗ Справочник.Товары КАК ДС ГДЕ ДС.Дата > &ДатаНачала";
Запрос.УстановитьПараметр("ДатаНачала", "20240101");
РезультатЗапроса = Запрос.Выполнить();
ТабДанных = РезультатЗапроса.Выгрузить();
Возврат ТабДанных;
КонецПроцедуры
Преимущества: простая и надежная выборка данных, вся таблица загружается в памяти сразу.
Способ 2: Потоковая обработка
Когда данных много, обрабатываем выборку по строкам:
Процедура ПримерПотоковойОбработки()
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Товары.Ссылка, Товары.Наименование, Товары.Артикул ИЗ Справочник.Товары КАК Товары";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующая() Цикл
Сообщить(Выборка.Наименование + " (" + Выборка.Артикул + ")");
КонецЦикла;
КонецПроцедуры
Преимущества: экономит память при больших таблицах, очень быстро для последовательной обработки.
Способ 3: Работа с иерархией
Для иерархических справочников:
Процедура ПримерПоИерархии()
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Счета.Ссылка, Счета.Наименование, Счета.Уровень ИЗ Справочник.ПланСчетов КАК Счета";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоИерархии);
Пока Выборка.Следующая() Цикл
Если Выборка.ЭтоГруппа Тогда
Сообщить("[Группа] " + Выборка.Наименование);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Преимущества: сохраняет иерархическую структуру, удобно обходить дерево.
Способ 4: С группировкой и итогами
Для аналитики и итогов:
Процедура ПримерСИтогами()
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Товары.Категория, Товары.Товар, СУММА(Товары.Количество) КАК ОбщееКоличество ИЗ Документ.Накладная.Товары КАК Товары СГРУППИРОВАТЬ ПО Товары.Категория, Товары.Товар";
РезультатЗапроса = Запрос.Выполнить();
ТабДанных = РезультатЗапроса.Выгрузить();
КонецПроцедуры
Преимущества: вычисления на уровне БД (очень быстро), встроенные агрегатные функции.
Способ 5: Параметризованные запросы
Для защиты от SQL-injection:
Процедура ПримерБезопасногоЗапроса(ПоискТекст)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Товары.Ссылка ИЗ Справочник.Товары КАК Товары ГДЕ Товары.Наименование ПОДОБНО &ПоискПаттерн";
Запрос.УстановитьПараметр("ПоискПаттерн", "%" + ПоискТекст + "%");
РезультатЗапроса = Запрос.Выполнить();
КонецПроцедуры
Преимущества: защита от атак, СУБД оптимизирует параметризованный запрос.
Способ 6: Асинхронное выполнение
Для долгих операций:
Процедура ПримерАсинхронногоЗапроса()
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ * ИЗ Справочник.Товары";
ОписаниеОповещения = Новый ОписаниеОповещения("ОбработкаРезультата", ЭтотОбъект);
Запрос.ВыполнитьАсинхронно(ОписаниеОповещения);
КонецПроцедуры
Процедура ОбработкаРезультата(РезультатЗапроса, ДополнительныеПараметры) Экспорт
Если РезультатЗапроса.ВыполненоУспешно Тогда
ТабДанных = РезультатЗапроса.Результат.Выгрузить();
Сообщить("Получено строк: " + ТабДанных.Количество());
КонецЕсли;
КонецПроцедуры
Преимущества: не блокирует интерфейс, особенно полезно для долгих запросов.
Способ 7: Динамическое построение
Когда структура зависит от параметров:
Процедура ПримерДинамическогоЗапроса(НужныТовары = Истина)
Запрос = Новый Запрос;
ТекстЗапроса = "ВЫБРАТЬ Товары.Ссылка";
Если НужныТовары Тогда
ТекстЗапроса = ТекстЗапроса + ", Товары.Наименование, Товары.Артикул";
КонецЕсли;
ТекстЗапроса = ТекстЗапроса + " ИЗ Справочник.Товары КАК Товары";
Запрос.Текст = ТекстЗапроса;
РезультатЗапроса = Запрос.Выполнить();
КонецПроцедуры
Осторожность: при динамическом построении всегда используй параметры для фильтров!
Способ 8: С кэшированием
Для часто выполняемых одинаковых запросов:
Процедура ПримерКэширования()
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ * ИЗ Справочник.Контрагенты";
Запрос.УстановитьВремяОжидания(300);
РезультатЗапроса = Запрос.Выполнить();
КонецПроцедуры
Преимущества: результат кэшируется на указанное время.
Практические рекомендации
По количеству строк:
- До 1000 строк → Выгрузить()
- 1000-100000 → Выбрать() с потоком
- Более 100000 → Выбрать() с потоком обязательно
По типу данных:
- Иерархические → Выбрать(ПоИерархии)
- Итоговые → СГРУППИРОВАТЬ ПО с агрегатами
- Параллельные вычисления → ВыполнитьАсинхронно()
- Защита от атак → Всегда параметры
Общие правила:
- Фильтруй в запросе, не в коде
- Используй параметры вместо конкатенации
- Выбирай только нужные поля
- Группируй и суммируй в запросе, а не в коде
- Для больших объемов используй потоковую обработку
В итоге, запрос в 1С — это универсальный инструмент. Знание всех способов использования делает разработчика эффективнее и безопаснее.