Часто в процессе разработки отчетов в 1С мы сталкиваемся с ситуацией, когда есть готовый «тяжелый» и сложный запрос (так называемый «трехэтажный» запрос), который успешно выбирает все необходимые данные. Однако возникает задача ограничить выборку этого отчета списком документов, который формируется динамически на основе условий, заданных пользователем на форме. Рассмотрим, как решить эту задачу грамотно, не ломая структуру уже существующего кода.
Это самый профессиональный и производительный метод, который позволяет изолировать логику получения списка счетов от основной выборки. Суть подхода заключается в использовании МенеджерВременныхТаблиц. Давайте разберем этот процесс по шагам:
ПОМЕСТИТЬ.ВНУТРЕННЕЕ СОЕДИНЕНИЕ с созданной временной таблицей.Пример реализации данной логики в коде:
МенеджерВТ = Новый МенеджерВременныхТаблиц;
// Первый запрос: формируем список счетов
ЗапросСчетов = Новый Запрос;
ЗапросСчетов.МенеджерВременныхТаблиц = МенеджерВТ;
ЗапросСчетов.Текст =
"ВЫБРАТЬ
| Счета.Ссылка КАК Счет
|ПОМЕСТИТЬ ВТ_ОтфильтрованныеСчета
|ИЗ
| Документ.СчетНаОплату КАК Счета
|ГДЕ
| Счета.Дата МЕЖДУ &ДатаНачала И &ДатаКонца";
ЗапросСчетов.УстановитьПараметр("ДатаНачала", ДатаНачала);
ЗапросСчетов.УстановитьПараметр("ДатаКонца", ДатаКонца);
ЗапросСчетов.Выполнить();
// Второй запрос: наш основной сложный запрос
ОсновнойЗапрос = Новый Запрос;
ОсновнойЗапрос.МенеджерВременныхТаблиц = МенеджерВТ;
ОсновнойЗапрос.Текст =
"ВЫБРАТЬ
| Подзапрос1.Счет,
| Подзапрос1.Регион
|ИЗ
| (ВЫБРАТЬ ... ) КАК Подзапрос1
|ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ОтфильтрованныеСчета КАК Отбор
|ПО Подзапрос1.Счет = Отбор.Счет";
Если объем данных, получаемых пользователем, относительно невелик, мы можем прибегнуть к более простому, но не менее эффективному способу — передаче СписокЗначений через параметр. Этот метод не требует изменения архитектуры запроса.
Разберем шаги внедрения:
СписокЗначений в коде модуля формы на основании данных, которые выбрал пользователь.Запрос при помощи метода УстановитьПараметр.ГДЕ Поле В (&ИмяПараметра).Это решение идеально подходит для отчетов, где отбор по счетам является вспомогательным или опциональным условием.
Если ваш отчет написан с использованием СистемаКомпоновкиДанных (СКД), то задача упрощается многократно. СКД позволяет гибко управлять фильтрами без необходимости править текст запроса вручную:
В СКД мы можем:
При выборе метода ориентируйтесь на сложность вашей задачи. Если запрос действительно «трехэтажный» и критичен к производительности, используйте временные таблицы — это позволит базе данных 1С оптимизировать план выполнения запроса. Если же требуется быстро добавить функционал отбора, не усложняя архитектуру, список значений в качестве параметра запроса станет отличным выбором.
Не забывайте, что качественная работа с запросами в 1С требует понимания того, как СУБД обрабатывает ваши конструкции. Используйте МенеджерВременныхТаблиц для сложных цепочек данных, и ваш отчет будет работать быстро и стабильно при любых объемах информации.