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

A1sQ.BuildQByParams

Назначение: создать объект Запрос и проставить параметры по именам из строки ключей KeyString.
Ключевая фича: порядок имен задаёте вы — он может не совпадать с порядком появления &Парам в тексте. явнонадёжно

Сигнатура

Function BuildQByParams(
    QueryText,
    KeyString, // "X, Y, Z"
    Value1 = Undefined, Value2 = Undefined, Value3 = Undefined, Value4 = Undefined,
    Value5 = Undefined, Value6 = Undefined, Value7 = Undefined, Value8 = Undefined
) Export

Пошаговая логика

// По коду модуля A1sQ
Функция BuildQByParams(Текст, Ключи, V1..V8) Экспорт
    Q = Новый Запрос; Q.Текст = Текст;
    // 1) Разобрать строку имён в массив: ["X","Y","Z"]
    Keys = StrSplit(Ключи, ",");
    // 2) Собрать значения [V1..V8]
    Values = Новый Массив; Values.Добавить(V1); ... Values.Добавить(V8);
    // 3) Построить Структуру ключ→значение, пропуская Undefined
    Params = Новый Структура;
    Для i = 0 По Keys.Количество()-1 Цикл
        Если Values[i] <> Неопределено Тогда
            Params.Вставить(Keys[i], Values[i]);
        КонецЕсли;
    КонецЦикла;
    // 4) Установить параметры в запрос
    Для Каждого Парам Из Params Цикл
        Q.УстановитьПараметр(Парам.Ключ, Парам.Значение);
    КонецЦикла;
    Возврат Q;
КонецФункции
Поведение по умолчанию: Undefined значения игнорируются — соответствующие параметры не будут установлены. Это удобно для частичной подстановки.

Примеры

1) Два параметра по именам

Q = A1sQ.BuildQByParams("ВЫБРАТЬ &X + &Y КАК S", "X, Y", 2, 8);
ТЗ = Q.Выполнить().Выгрузить(); // S = 10

2) Порядок имён не важен

// В тексте параметры &A, &B; зададим ключи в порядке "B, A"
Q = A1sQ.BuildQByParams("ВЫБРАТЬ &A + &B КАК S", "B, A", 5, 7);
// Будет: B=5, A=7

3) Частичная подстановка (остальное зададим позже)

// Передадим только один ключ и значение; второй установим позднее вручную
Q = A1sQ.BuildQByParams("ВЫБРАТЬ &X + &Y КАК S", "X", 10);
Q.УстановитьПараметр("Y", 20);
S = Q.Выполнить().Выгрузить()[0].S; // 30

Сравнение: до / после

Без A1sС A1s
Q = Новый Запрос("ВЫБРАТЬ &A + &B КАК S");
Q.УстановитьПараметр("A", 7);
Q.УстановитьПараметр("B", 5);
Q = A1sQ.BuildQByParams("ВЫБРАТЬ &A + &B КАК S", "B, A", 5, 7);

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

✅ До 8 значений за вызов
✅ Удобно для частичной подстановки (Undefined пропускаются)
❗ Имена берутся как есть из KeyString — лишние пробелы станут частью имени параметра
❗ Если значений больше, чем имён, «лишние» будут проигнорированы
❗ Если имён больше, чем значений, «хвост» останется неустановленным → ошибка на выполнении, если параметр обязателен
❗ TempTablesManager не принимает — привяжите через CreateQ или вручную (Q.TempTablesManager = ...)

Типичные ошибки

❌ Пробелы в именах
Q = A1sQ.BuildQByParams("... &X ...", " X ", 10); // имя параметра будет " X " → не найдёт &X
// ✅ Правильно
Q = A1sQ.BuildQByParams("... &X ...", "X", 10);

❌ Передали Undefined и ожидали, что установится NULL
// Undefined просто пропускается. Если нужен NULL в параметре — передайте значение NULL явно.

❌ Смешали порядок значений
Q = A1sQ.BuildQByParams("... &A ... &B ...", "A, B", 1); // B не установлен
  • BuildQ — позиционная установка параметров по порядку появления.
  • SetQParams — установить параметры из структуры ключ→значение.
  • CreateQ — минимальный конструктор запроса.
  • CreateAndLoad — создать запрос и перенести параметры из другого.