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

A1sQ.BatchUnload

Назначение: выполнить несколько независимых запросов и получить их результаты в виде структуры Имя → ТаблицаЗначений.
Сценарии: отчёты, срезы данных по блокам, выгрузка для сериализации/экспорта.

Сигнатура

Function BatchUnload(QueriesMap, CommonParams = Undefined) Export

Как работает (по исходному коду)

Results = New Structure;

For Each QueryPair In QueriesMap Do
    Try
        Query = CreateQ(QueryPair.Value);
        
        If CommonParams <> Undefined Then
            SetQParams(Query, CommonParams);
        EndIf;
        
        Results.Insert(QueryPair.Key, Query.Execute().Unload());
        
    Except
        A1sS.Print("BatchUnload error for '" + QueryPair.Key + "': " + ErrorDescription());
        Results.Insert(QueryPair.Key, New ValueTable);
    EndTry;
EndDo;

Return Results;
Ключи структуры сохраняются из входного QueriesMap — удобно адресовать результаты по понятным именам (например, "Продажи", "Остатки").

Параметры

  • QueriesMap — Структура вида Имя → ТекстЗапроса.
  • CommonParams — (опц.) Структура значений параметров, которые одинаковы для всех запросов. Передаются один раз через SetQParams.

Возвращает

Структуру вида Имя → ТаблицаЗначений. При ошибке конкретного запроса в ответ по этому ключу кладётся пустая ТаблицаЗначений, а сообщение попадает в лог.

Примеры

1) Несколько срезов отчёта с общими параметрами периода

QMap = Новый Структура;
QMap.Вставить("Продажи", "
|ВЫБРАТЬ
|  Дата, Сумма
|ИЗ Документ.РеализацияТоваровУслуг
|ГДЕ Дата МЕЖДУ &D1 И &D2");
QMap.Вставить("Оплаты", "
|ВЫБРАТЬ
|  Дата, Сумма
|ИЗ Документ.ПоступлениеНаРасчетныйСчет
|ГДЕ Дата МЕЖДУ &D1 И &D2");

Params = Новый Структура("D1, D2", НачалоПериода, КонецПериода);

Data = A1sQ.BatchUnload(QMap, Params);
ТЗПродажи = Data.Получить("Продажи");
ТЗОплаты  = Data.Получить("Оплаты");

2) Обработка ошибок без падения

QMap = Новый Структура("OK, BadSql",
    "ВЫБРАТЬ ПЕРВЫЕ 10 Наименование ИЗ Справочник.Номенклатура",
    "ВЫБРАТЬТАК";// ошибка
);
Data = A1sQ.BatchUnload(QMap);
Если Data.BadSql.Количество() = 0 Тогда
    Сообщить("BadSql вернул пустую таблицу (смотрите лог).");
КонецЕсли;

Нюансы и ограничения

✅ Запросы выполняются независимо, без общего TempTablesManager
✅ Общие параметры задаются один раз
❗ Для ВТ/пакетов используйте ExecuteBatch/UnloadBatch или ChainQ
❗ Память: каждая выборка выгружается полностью в ТаблицаЗначений
❗ Индивидуальных параметров на запрос тут нет — либо общий набор, либо готовьте разные тексты
  • ExecuteBatch / UnloadBatch — пакетный текст → несколько результатов.
  • ChainQ — последовательная цепочка в общем TempTablesManager.
  • SetQParams — установка параметров.