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