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

A1sQ.BuildQ

Назначение: создать объект Запрос и позиционно расставить значения параметров по порядку появления &Парам в тексте.
Особенность: один и тот же параметр, встречающийся несколько раз, учитывается один раз (имена собираются и дубли убираются).
Где полезно: быстрый конструктор для однотипных запросов, когда важен минимум кода.

Сигнатура

Function BuildQ(
    QueryText,
    Value1 = Undefined, Value2 = Undefined, Value3 = Undefined, Value4 = Undefined,
    Value5 = Undefined, Value6 = Undefined, Value7 = Undefined, Value8 = Undefined
) Export
Ключевая идея: Value1..Value8 сопоставляются первым восьми уникальным параметрам из QueryText по порядку их первого появления: &P1Value1, &P2Value2, и т.д.

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

// Упрощённо по исходному коду модуля
Функция BuildQ(Текст, V1..V8) Экспорт
    // 1) Извлечь имена параметров из текста (уникально, в порядке появления)
    Параметры = A1sQ.GetQParams(Текст); // Структура: Ключ = имя параметра

    // 2) Создать Запрос и задать текст
    Q = Новый Запрос; Q.Текст = Текст;

    // 3) Сформировать массив значений [V1..V8]
    Values = Новый Массив; Values.Добавить(V1); ... Values.Добавить(V8);

    // 4) Установить значения по порядку параметров
    i = 0;
    Для Каждого P Из Параметры Цикл
        Если i < Values.Количество() Тогда
            Q.УстановитьПараметр(P.Ключ, Values[i]); // может быть Неопределено
            i = i + 1;
        КонецЕсли;
    КонецЦикла;

    Возврат Q;
КонецФункции
Важно: если вы передали меньше значений, чем параметров, «хвостовые» параметры получат Неопределено и запрос упадёт на выполнении. Для пропуска отдельных параметров используйте BuildQByParams.

Примеры

1) Простейший селект с двумя параметрами

Q = A1sQ.BuildQ("
|ВЫБРАТЬ &A + &B КАК Сумма", 2, 8);
ТЗ = Q.Выполнить().Выгрузить(); // 10

2) Дубли параметров в тексте

// В тексте один и тот же &X встречается дважды — значение берётся одно
Q = A1sQ.BuildQ("
|ВЫБРАТЬ &X КАК A, &X КАК B", 5);
ТЗ = Q.Выполнить().Выгрузить(); // A=5, B=5

3) «Первая по смыслу» запись — добавьте сортировку и ПЕРВЫЕ 1

Q = A1sQ.BuildQ("
|ВЫБРАТЬ ПЕРВЫЕ 1 Ссылка
|ИЗ Документ.ПоступлениеТоваровУслуг
|ГДЕ Организация = &Орг
|УПОРЯДОЧИТЬ ПО Дата УБЫВ", ТекОрганизация);
R = Q.Выполнить().Выбрать();
Если R.Следующий() Тогда Сообщить(R.Ссылка); КонецЕсли;

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

Без BuildQС BuildQ
Q = Новый Запрос("ВЫБРАТЬ &A + &B КАК Сумма");
Q.УстановитьПараметр("A", 2);
Q.УстановитьПараметр("B", 8);
ТЗ = Q.Выполнить().Выгрузить();
ТЗ = A1sQ.BuildQ("ВЫБРАТЬ &A + &B КАК Сумма", 2, 8)
      .Выполнить().Выгрузить();

Паттерны

  • «Собрал и поехали»: BuildQ(...).Выполнить().Выгрузить().
  • «Скаляр»: вместе с ValueQ для чтения первой ячейки.
  • «Первая строка»: вместе с FirstRowQ.

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

✅ Извлекает имена параметров из текста и устанавливает значения по порядку
✅ Дубли имён в тексте игнорируются — параметр будет установлен один раз
❗ Передает до 8 значений — если параметров больше, лишние останутся без значений
❗ Не проверяет типы/заполненность — можно случайно поставить Неопределено
❗ Не принимает TempTablesManager — его добавляйте позже вручную или через CreateQ

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

❌ Перепутан порядок Value1..Value8
// В тексте: ... &DateFrom и &DateTo (именно в таком порядке)
Q = A1sQ.BuildQ(Текст, КонДата, НачДата); // неверно!

// ✅ Правильно
Q = A1sQ.BuildQ(Текст, НачДата, КонДата);

❌ Нехватает значений для всех параметров
Q = A1sQ.BuildQ("... &A И &B", 7); // B останется Неопределено → ошибка на выполнении

❌ Ожидаете, что дубли параметров дадут «следующее» значение
// &X в тексте встречается дважды, но X примет только первый переданный аргумент
  • BuildQByParams — установка по именам из строки ключей.
  • CreateQ — минимальный конструктор (можно добавить TempTablesManager).
  • CreateAndLoad — создать новый запрос и перенести параметры из другого.
  • ExecuteQ — создать и получить потоковую выборку.
  • Unload — создать и выгрузить результат в ТаблицаЗначений.