Как передать результат одного запроса в качестве параметра другому запросу в 1С?

Программист 1С v8.3 (Управляемые формы) Управленческий учет IT и автоматизация бизнеса
← На главную

В процессе разработки на платформе 1С:Предприятие часто возникает задача объединения данных из разных источников или последовательная обработка результатов запросов. Многие начинающие разработчики пытаются реализовать это через выгрузку результата первого запроса в массив или таблицу значений с последующей передачей в параметр второго запроса. Однако такой подход не всегда является оптимальным с точки зрения производительности.

Давайте подробно разберем, как правильно реализовать передачу данных между запросами, используя возможности платформы, и почему использование МенеджерВременныхТаблиц является предпочтительным.

Решение 1: Использование Менеджера временных таблиц (МВТ)

Это самый профессиональный и производительный способ. МенеджерВременныхТаблиц позволяет сохранять промежуточные результаты в памяти сервера 1С, что избавляет от необходимости «гонять» данные между сервером и клиентом.

Алгоритм действий:

  1. Создайте объект МенеджерВременныхТаблиц в коде.
  2. Присвойте его свойству МенеджерВременныхТаблиц вашего запроса.
  3. Используйте конструкцию ПОМЕСТИТЬ в тексте запроса для сохранения результата в таблицу.
  4. В последующих запросах, использующих тот же экземпляр менеджера, обращайтесь к этой временной таблице как к обычной физической таблице.

// Создаем менеджер
МВТ = Новый МенеджерВременныхТаблиц;

// Первый запрос
Запрос1 = Новый Запрос;
Запрос1.МенеджерВременныхТаблиц = МВТ;
Запрос1.Текст = "ВЫБРАТЬ Различные Период КАК Дата ПОМЕСТИТЬ ВТ_Даты ИЗ ...";
Запрос1.Выполнить();

// Второй запрос, использующий ВТ_Даты
Запрос2 = Новый Запрос;
Запрос2.МенеджерВременныхТаблиц = МВТ;
Запрос2.Текст = "ВЫБРАТЬ * ИЗ ВТ_Даты КАК Даты ЛЕВОЕ СОЕДИНЕНИЕ ...";
Результат = Запрос2.Выполнить();

Решение 2: Использование пакетов запросов

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

Разберем пример объединения данных:


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

ВЫБРАТЬ
    ОстНаСкл.Дата,
    ОстНаСкл.Номенклатура,
    ОстНаСкл.НачОст,
    ТоварыОстаткиИП.КоличествоКонечныйОстаток
ИЗ ОстНаСкл КАК ОстНаСкл
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыОрганизаций.ОстаткиИОбороты(&Нач, &Кон) КАК ТоварыОстаткиИП
ПО ОстНаСкл.Номенклатура = ТоварыОстаткиИП.Номенклатура

Решение 3: Передача данных через массив параметров

Если логика требует получения списка дат в одном запросе и передачи их во второй, который выполняется в другом контексте, можно использовать выгрузку результата в массив. Это допустимый, но менее производительный способ при больших объемах данных.

Порядок работы:

  1. Выполняем запрос для получения списка (например, дат или ссылок).
  2. Используем метод ВыгрузитьКолонку() объекта РезультатЗапроса.
  3. Устанавливаем полученный массив как параметр второго запроса через УстановитьПараметр().

// В коде
СписокДат = Запрос1.Выполнить().Выгрузить().ВыгрузитьКолонку("Дата");
Запрос2.УстановитьПараметр("МассивДат", СписокДат);
Запрос2.Текст = "ВЫБРАТЬ * ИЗ РегистрГдеНужно ГДЕ Период В (&МассивДат)";

Важное примечание: При использовании метода ГДЕ Поле В (&Параметр) помните о лимитах СУБД на количество элементов в списке. Для больших наборов данных всегда предпочтительнее использовать Внутреннее соединение с временной таблицей.

Решение 4: Использование СКД (Система компоновки данных)

Если вы работаете с отчетами, наиболее правильным подходом будет использование СКД. В настройках набора данных вы можете создавать связи между запросами. При этом поле одного набора данных будет выступать фильтром для параметра другого набора данных. Это позволяет избежать ручного написания кода и делает отчет гибким и легко настраиваемым.

Анализируя ситуацию, мы видим, что использование временных таблиц — это стандарт индустрии разработки на 1С. Они позволяют СУБД эффективно индексировать промежуточные результаты, что делает выполнение сложных выборок практически мгновенным. Не забывайте всегда проверять Консоль запросов перед внедрением кода, чтобы убедиться в правильности плана запроса.

← На главную