A1sQ.ChainQ
Назначение: выполнить цепочку запросов в одном TempTablesManager — идеально для сценариев «ПОМЕСТИТЬ → использовать результат → финальный SELECT».
Опционально: вернуть массив Selection, если нужен доступ к результатам.
Опционально: вернуть массив Selection, если нужен доступ к результатам.
Сигнатура
Function ChainQ(Queries, ReturnResults = False) Export
Как работает (по исходнику)
TempManager = GetTemps();
Results = New Array;
For Each QueryInfo In Queries Do
Try
Query = CreateQ(QueryInfo.Text, TempManager);
If QueryInfo.Property("Params") And QueryInfo.Params <> Undefined Then
SetQParams(Query, QueryInfo.Params);
EndIf;
QueryResult = Query.Execute();
If ReturnResults Then
Results.Add(QueryResult.Select());
EndIf;
Except
A1sS.Print("ChainQ error at query " + (Results.Count() + 1) + ": " + ErrorDescription());
Break;
EndTry;
EndDo;
Return Results;
Общий контекст ВТ: все запросы делят один и тот же TempTablesManager. Это сохраняет/делает видимыми временные таблицы между шагами цепочки.
Параметры
- Queries — Массив структур (или объектов) с полями:
- Text — текст запроса;
- Params — (опционально) Структура параметров для SetQParams.
- ReturnResults — Булево. Если Истина — вернёт массив Selection по каждому запросу.
Возвращает
Массив — если ReturnResults=False, массив будет пустым (цепочка просто выполняется); если Истина — массив Selection в порядке выполнения.
Примеры
1) Построить ВТ и получить итог
Queries = Новый Массив;
Queries.Добавить(Новый Структура("Text, Params",
"ПОМЕСТИТЬ ВТ_S AS ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура ГДЕ НЕ ПометкаУдаления", Неопределено));
Queries.Добавить(Новый Структура("Text, Params",
"ПОМЕСТИТЬ ВТ_A AS ВЫБРАТЬ Номенклатура, СУММА(Количество) КАК Qty ИЗ Документ.РеализацияТоваровУслуг.Товары ГДЕ Номенклатура В (&S) СГРУППИРОВАТЬ ПО Номенклатура",
Новый Структура("S", "ВЫБРАТЬ Ссылка ИЗ ВТ_S")));
Queries.Добавить(Новый Структура("Text",
"ВЫБРАТЬ TOP 10 Номенклатура, Qty ИЗ ВТ_A УПОРЯДОЧИТЬ ПО Qty УБЫВ"));
Res = A1sQ.ChainQ(Queries, Истина);
Если Res.Количество() > 0 Тогда
Итог = Res[Res.Количество()-1]; // последняя выборка
Пока Итог.Следующий() Цикл Сообщить(Итог.Номенклатура + ": " + Итог.Qty); КонецЦикла;
КонецЕсли;
2) Просто выполнить цепочку без возврата (быстрее)
_ = A1sQ.ChainQ(Queries, Ложь); // создаст ВТ и выполнит шаги
// при необходимости можно отдельно выгрузить ВТ через UnloadTemp/UnloadAllTemps
Нюансы и ограничения
✅ Один TempTablesManager на всю цепочку (ВТ видны между шагами)
✅ Удобный формат входа: массив { Text; Params? }
✅ Ошибки ловятся и логируются; выполнение цепочки прерывается
❗ Возвращаются именно Selection — выгрузка данных остаётся на вашей стороне (Выгрузить())
❗ При ReturnResults=Ложь массив Results останется пустым (это нормально)
❗ Менеджер ВТ не уничтожается автоматически — вызовите DestroyAllTemps/ResetTempManager
Связанные функции
- ExecuteBatch / UnloadBatch — альтернативы для пакетного текста.
- CreateQWithTemps — явное создание Query с TM.
- UnloadTemp / UnloadAllTemps — диагностика ВТ после цепочки.
- SetQParams — установка параметров.