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

A1sQ.CombineQT

Назначение: вернуть текст запроса, объединяющий два QT оператором ОБЪЕДИНИТЬ ВСЕ (аналог UNION ALL).
Возвращает: строку 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
QT = QT1 + "
|
|ОБЪЕДИНИТЬ ВСЕ
|
|" + QT2;
QT = A1sQ.CombineQT(QT1, QT2);

Правила и нюансы (1С:Запрос, «ОБЪЕДИНИТЬ»)

  • Структура колонок должна совпадать по количеству, именам и совместимости типов. Переименуйте поля с КАК, если нужно.
  • Дубликаты сохраняются. «ОБЪЕДИНИТЬ ВСЕ» не удаляет повторы. Для уникализации используйте «ОБЪЕДИНИТЬ» (без ВСЕ), но этой функцией — вручную.
  • Сортировка — в самом конце. УПОРЯДОЧИТЬ ПО применяйте после объединения ко всему набору.
  • ПОМЕСТИТЬ недопустимо после UNION ALL; используйте ПОМЕСТИТЬ в финальном запросе (после CombineQT).
  • Параметры. Если QT1/QT2 используют параметры, передавайте их далее в ExecuteQ/Unload по порядку появления.

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

❌ Один из QT = Неопределено
QT = A1sQ.CombineQT(QT1, Неопределено); // риск некорректной конкатенации
// ✅ Передавайте пустую строку: QT = A1sQ.CombineQT(QT1, "");

❌ Разное количество/имена/типы колонок
// Приведите к единому виду: "ВЫБРАТЬ ... КАК A, ... КАК B" в обоих QT.

❌ ORDER BY в каждом подзапросе
// Удалите частные сортировки и добавьте одну в конце общего QT.
  • QT — собрать SELECT-FROM-(WHERE) строкой.
  • BuildByQT — собрать QT и сразу получить готовый Запрос.
  • ExecuteQ / Unload — выполнить объединённый текст.
  • BuildQ / BuildQByParams — быстро задать параметры.