A1sCode библиотека 1С

A1sQ.ChainQ

Назначение: выполнить цепочку запросов в одном TempTablesManager — идеально для сценариев «ПОМЕСТИТЬ → использовать результат → финальный SELECT».
Опционально: вернуть массив 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