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 по порядку их первого появления: &P1 → Value1, &P2 → Value2, и т.д.
Пошаговая логика
// Упрощённо по исходному коду модуля
Функция 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 |
|---|---|
|
|
Паттерны
- «Собрал и поехали»: 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 — создать и выгрузить результат в ТаблицаЗначений.