← Назад к вопросам

Какие знаешь способы пользоваться запросом?

2.0 Middle🔥 221 комментариев
#Запросы и оптимизация#СУБД и хранение

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Способы использования Запроса в 1С: полный разбор

Запрос — один из самых мощных инструментов в 1С для работы с данными. Рассмотрю все основные способы его применения, от простых до продвинутых техник.

Способ 1: Основное использование

Самый частый способ — выполнить запрос и получить таблицу:

Процедура ПримерБазовогоЗапроса()
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ ДС.Ссылка, ДС.Номер, ДС.Дата ИЗ Справочник.Товары КАК ДС ГДЕ ДС.Дата > &ДатаНачала";
    Запрос.УстановитьПараметр("ДатаНачала", "20240101");
    РезультатЗапроса = Запрос.Выполнить();
    ТабДанных = РезультатЗапроса.Выгрузить();
    Возврат ТабДанных;
КонецПроцедуры

Преимущества: простая и надежная выборка данных, вся таблица загружается в памяти сразу.

Способ 2: Потоковая обработка

Когда данных много, обрабатываем выборку по строкам:

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

Преимущества: экономит память при больших таблицах, очень быстро для последовательной обработки.

Способ 3: Работа с иерархией

Для иерархических справочников:

Процедура ПримерПоИерархии()
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ Счета.Ссылка, Счета.Наименование, Счета.Уровень ИЗ Справочник.ПланСчетов КАК Счета";
    РезультатЗапроса = Запрос.Выполнить();
    Выборка = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоИерархии);
    Пока Выборка.Следующая() Цикл
        Если Выборка.ЭтоГруппа Тогда
            Сообщить("[Группа] " + Выборка.Наименование);
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Преимущества: сохраняет иерархическую структуру, удобно обходить дерево.

Способ 4: С группировкой и итогами

Для аналитики и итогов:

Процедура ПримерСИтогами()
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ Товары.Категория, Товары.Товар, СУММА(Товары.Количество) КАК ОбщееКоличество ИЗ Документ.Накладная.Товары КАК Товары СГРУППИРОВАТЬ ПО Товары.Категория, Товары.Товар";
    РезультатЗапроса = Запрос.Выполнить();
    ТабДанных = РезультатЗапроса.Выгрузить();
КонецПроцедуры

Преимущества: вычисления на уровне БД (очень быстро), встроенные агрегатные функции.

Способ 5: Параметризованные запросы

Для защиты от SQL-injection:

Процедура ПримерБезопасногоЗапроса(ПоискТекст)
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ Товары.Ссылка ИЗ Справочник.Товары КАК Товары ГДЕ Товары.Наименование ПОДОБНО &ПоискПаттерн";
    Запрос.УстановитьПараметр("ПоискПаттерн", "%" + ПоискТекст + "%");
    РезультатЗапроса = Запрос.Выполнить();
КонецПроцедуры

Преимущества: защита от атак, СУБД оптимизирует параметризованный запрос.

Способ 6: Асинхронное выполнение

Для долгих операций:

Процедура ПримерАсинхронногоЗапроса()
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ * ИЗ Справочник.Товары";
    ОписаниеОповещения = Новый ОписаниеОповещения("ОбработкаРезультата", ЭтотОбъект);
    Запрос.ВыполнитьАсинхронно(ОписаниеОповещения);
КонецПроцедуры

Процедура ОбработкаРезультата(РезультатЗапроса, ДополнительныеПараметры) Экспорт
    Если РезультатЗапроса.ВыполненоУспешно Тогда
        ТабДанных = РезультатЗапроса.Результат.Выгрузить();
        Сообщить("Получено строк: " + ТабДанных.Количество());
    КонецЕсли;
КонецПроцедуры

Преимущества: не блокирует интерфейс, особенно полезно для долгих запросов.

Способ 7: Динамическое построение

Когда структура зависит от параметров:

Процедура ПримерДинамическогоЗапроса(НужныТовары = Истина)
    Запрос = Новый Запрос;
    ТекстЗапроса = "ВЫБРАТЬ Товары.Ссылка";
    Если НужныТовары Тогда
        ТекстЗапроса = ТекстЗапроса + ", Товары.Наименование, Товары.Артикул";
    КонецЕсли;
    ТекстЗапроса = ТекстЗапроса + " ИЗ Справочник.Товары КАК Товары";
    Запрос.Текст = ТекстЗапроса;
    РезультатЗапроса = Запрос.Выполнить();
КонецПроцедуры

Осторожность: при динамическом построении всегда используй параметры для фильтров!

Способ 8: С кэшированием

Для часто выполняемых одинаковых запросов:

Процедура ПримерКэширования()
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ * ИЗ Справочник.Контрагенты";
    Запрос.УстановитьВремяОжидания(300);
    РезультатЗапроса = Запрос.Выполнить();
КонецПроцедуры

Преимущества: результат кэшируется на указанное время.

Практические рекомендации

По количеству строк:

  • До 1000 строк → Выгрузить()
  • 1000-100000 → Выбрать() с потоком
  • Более 100000 → Выбрать() с потоком обязательно

По типу данных:

  • Иерархические → Выбрать(ПоИерархии)
  • Итоговые → СГРУППИРОВАТЬ ПО с агрегатами
  • Параллельные вычисления → ВыполнитьАсинхронно()
  • Защита от атак → Всегда параметры

Общие правила:

  1. Фильтруй в запросе, не в коде
  2. Используй параметры вместо конкатенации
  3. Выбирай только нужные поля
  4. Группируй и суммируй в запросе, а не в коде
  5. Для больших объемов используй потоковую обработку

В итоге, запрос в 1С — это универсальный инструмент. Знание всех способов использования делает разработчика эффективнее и безопаснее.