A1sQ.CombineQT
Назначение: вернуть текст запроса, объединяющий два QT оператором ОБЪЕДИНИТЬ ВСЕ (аналог UNION ALL).
Возвращает: строку QT. Если оба аргумента Неопределено — вернёт только строку с оператором (служебный случай).
Важно: функция не валидирует синтаксис и не проверяет совместимость колонок — ответственность на вызывающем коде.
Возвращает: строку QT. Если оба аргумента Неопределено — вернёт только строку с оператором (служебный случай).
Важно: функция не валидирует синтаксис и не проверяет совместимость колонок — ответственность на вызывающем коде.
Сигнатура
Function CombineQT(QueryText1 = Undefined, QueryText2 = Undefined) Export
Как работает
// Внутри формируется «разделитель» с переводами строк:
UnionText = "
|
|ОБЪЕДИНИТЬ ВСЕ
|
|";
Если (QueryText1 = Неопределено) И (QueryText2 = Неопределено) Тогда
Возврат UnionText;
Иначе
Возврат QueryText1 + UnionText + QueryText2;
КонецЕсли;
Подводный камень: если передан только один QT, второй равен Неопределено, конкатенация может повести себя непредсказуемо. Безопаснее передавать пустую строку "" вместо Неопределено либо заранее проверять ValueIsFilled().
Примеры
1) Два однотипных SELECT-а
QT1 = "ВЫБРАТЬ Ссылка КАК ID, Наименование КАК Имя ИЗ Справочник.Номенклатура";
QT2 = "ВЫБРАТЬ Ссылка КАК ID, Наименование КАК Имя ИЗ Справочник.Контрагенты";
QT = A1sQ.CombineQT(QT1, QT2);
ТЗ = A1sQ.Unload(QT); // Дубли НЕ удаляются — это UNION ALL
2) С агрегатами (совместимые типы и имена)
QT1 = "ВЫБРАТЬ Организация, СУММА(Сумма) КАК Сумма ИЗ Документ.ПоступлениеТоваровУслуг ГДЕ Дата МЕЖДУ &D1 И &D2 СГРУППИРОВАТЬ ПО Организация";
QT2 = "ВЫБРАТЬ Организация, СУММА(Сумма) КАК Сумма ИЗ Документ.РеализацияТоваровУслуг ГДЕ Дата МЕЖДУ &D1 И &D2 СГРУППИРОВАТЬ ПО Организация";
QT = A1sQ.CombineQT(QT1, QT2) + " СГРУППИРОВАТЬ ПО Организация"; // группируем объединённый набор
ТЗ = A1sQ.Unload(QT, НачалоПериода, КонецПериода);
3) Добавить сортировку для всего объединения
QT = A1sQ.CombineQT(QT1, QT2) + " УПОРЯДОЧИТЬ ПО Имя";
S = A1sQ.ExecuteQ(QT); Пока S.Следующий() Цикл ... КонецЦикла;
Сравнение: руками vs CombineQT
| Без CombineQT | С CombineQT |
|---|---|
|
|
Правила и нюансы (1С:Запрос, «ОБЪЕДИНИТЬ»)
- Структура колонок должна совпадать по количеству, именам и совместимости типов. Переименуйте поля с КАК, если нужно.
- Дубликаты сохраняются. «ОБЪЕДИНИТЬ ВСЕ» не удаляет повторы. Для уникализации используйте «ОБЪЕДИНИТЬ» (без ВСЕ), но этой функцией — вручную.
- Сортировка — в самом конце. УПОРЯДОЧИТЬ ПО применяйте после объединения ко всему набору.
- ПОМЕСТИТЬ недопустимо после UNION ALL; используйте ПОМЕСТИТЬ в финальном запросе (после CombineQT).
- Параметры. Если QT1/QT2 используют параметры, передавайте их далее в ExecuteQ/Unload по порядку появления.
Типичные ошибки
❌ Один из QT = Неопределено
QT = A1sQ.CombineQT(QT1, Неопределено); // риск некорректной конкатенации
// ✅ Передавайте пустую строку: QT = A1sQ.CombineQT(QT1, "");
❌ Разное количество/имена/типы колонок
// Приведите к единому виду: "ВЫБРАТЬ ... КАК A, ... КАК B" в обоих QT.
❌ ORDER BY в каждом подзапросе
// Удалите частные сортировки и добавьте одну в конце общего QT.