К статье
Практический материал

Разработка и Конфигурация · 13 мин

Как объединить два запроса в один в 1С

Как объединить два запроса в один в 1С с помощью ОБЪЕДИНИТЬ и ОБЪЕДИНИТЬ ВСЕ: синтаксис, примеры кода, типичные ошибки и проверка результата объединения.

Объединение запросов — стандартная задача при разработке отчётов и обработок в 1С. Например, нужно вывести в одну таблицу поступления и расходы товара, собрать данные из разных регистров или склеить фактические и плановые показатели. Для этого в языке запросов 1С существуют операторы ОБЪЕДИНИТЬ и ОБЪЕДИНИТЬ ВСЕ.

Оба оператора складывают строки двух (и более) выборок в один результирующий набор. Разница между ними принципиальна: ОБЪЕДИНИТЬ убирает дублирующиеся строки, а ОБЪЕДИНИТЬ ВСЕ сохраняет все строки как есть. Выбор неправильного варианта — самая частая причина «потери» данных или, наоборот, задвоения итогов в отчётах.

Ниже разобраны синтаксис, готовые примеры кода, правила совместимости полей, типичные ошибки и способы проверить, что объединение отработало корректно.

Как работает объединение запросов в 1С

Объединение в языке запросов 1С работает так же, как UNION в классическом SQL: платформа выполняет каждую выборку отдельно, а затем складывает их строки в одну результирующую таблицу. Объединять можно не только два, но и три, пять и более запросов — операторы перечисляются последовательно.

Ключевое требование — структурная совместимость выборок. Во всех объединяемых запросах должно быть одинаковое количество полей, они должны идти в одном порядке и иметь совместимые типы данных. Имена полей итоговой таблицы берутся из первого запроса, поэтому осмысленные псевдонимы лучше задавать именно там.

Важно понимать: объединение — это не соединение. Соединение (СОЕДИНЕНИЕ) склеивает таблицы «по горизонтали», добавляя колонки, а объединение складывает их «по вертикали», добавляя строки. Смешение этих подходов — частая ошибка начинающих разработчиков.

Синтаксис операторов ОБЪЕДИНИТЬ и ОБЪЕДИНИТЬ ВСЕ

Базовая конструкция выглядит так: первая выборка, оператор объединения, вторая выборка. Секция УПОРЯДОЧИТЬ ПО применяется ко всему результату и пишется один раз в конце, а не в каждом подзапросе.

ВЫБРАТЬ

Продажи.Номенклатура КАК Номенклатура,

Продажи.Количество КАК Количество,

"Продажа" КАК ТипДвижения

ИЗ

Документ.РеализацияТоваровУслуг.Товары КАК Продажи

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ

Поступления.Номенклатура,

Поступления.Количество,

"Поступление"

ИЗ

Документ.ПоступлениеТоваровУслуг.Товары КАК Поступления

Обратите внимание на приём с литеральным полем "Продажа" КАК ТипДвижения: он позволяет в итоговой таблице различать, из какого источника пришла каждая строка. Это почти обязательный элемент при объединении разнородных данных.

Если нужно убрать дубли, замените ОБЪЕДИНИТЬ ВСЕ на ОБЪЕДИНИТЬ. Платформа сгруппирует строки с полностью совпадающими значениями всех полей и оставит по одному экземпляру.

Чем ОБЪЕДИНИТЬ отличается от ОБЪЕДИНИТЬ ВСЕ

Разница между операторами проявляется в двух аспектах: составе результата и производительности. ОБЪЕДИНИТЬ выполняет дополнительную работу по поиску и удалению дублей, что на больших выборках заметно замедляет выполнение. ОБЪЕДИНИТЬ ВСЕ просто складывает строки, поэтому работает быстрее.

Практическое правило: если строки из разных источников заведомо не пересекаются (например, документы разных видов с добавленным полем-маркером типа), используйте ОБЪЕДИНИТЬ ВСЕ. Дублей там не будет по построению, а выигрыш в скорости реальный. ОБЪЕДИНИТЬ оправдан, когда источники могут содержать одинаковые строки и дубли недопустимы — например, при сборке списка контрагентов из нескольких таблиц.

Сравнение вариантов

ОБЪЕДИНИТЬ

Удаляет дублирующиеся строки. Подходит, когда источники могут содержать одинаковые записи. Работает медленнее из-за проверки дублей.

ОБЪЕДИНИТЬ ВСЕ

Сохраняет все строки обеих выборок. Быстрее, подходит для заведомо непересекающихся данных. Риск задвоения итогов при пересекающихся источниках.

Пошаговый пример: сводная таблица прихода и расхода

Рассмотрим прикладную задачу: получить одну таблицу движений товара по регистру накопления, где приход показан с плюсом, а расход — с минусом. Такой приём используется, когда нужен плоский список движений для последующей обработки или выгрузки.

ВЫБРАТЬ

Движения.Период КАК Период,

Движения.Номенклатура КАК Номенклатура,

Движения.Количество КАК Количество

ИЗ

РегистрНакопления.ТоварыНаСкладах КАК Движения

ГДЕ

Движения.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ

Движения.Период,

Движения.Номенклатура,

-Движения.Количество

ИЗ

РегистрНакопления.ТоварыНаСкладах КАК Движения

ГДЕ

Движения.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)

УПОРЯДОЧИТЬ ПО

Период

Здесь ОБЪЕДИНИТЬ ВСЕ безопасно: одна и та же запись регистра не может быть одновременно приходом и расходом, поэтому дублей не возникнет. Знак минус перед количеством во второй выборке даёт корректное сальдо при последующем суммировании.

Порядок действий при объединении запросов
  1. 1
    Сформулируйте обе выборки по отдельности и убедитесь, что каждая работает самостоятельно
  2. 2
    Выровняйте состав полей: одинаковое количество, порядок и совместимые типы
  3. 3
    Добавьте поле-маркер источника, если строки нужно различать
  4. 4
    Соедините выборки оператором ОБЪЕДИНИТЬ ВСЕ либо ОБЪЕДИНИТЬ
  5. 5
    Перенесите УПОРЯДОЧИТЬ ПО в конец всей конструкции
  6. 6
    Выполните запрос в консоли и сверьте количество строк с суммой отдельных выборок

Правила совместимости полей и типов данных

Платформа проверяет совместимость объединяемых выборок при выполнении запроса. Нарушение правил приводит к ошибке вида «Несовместимые типы» или «Неверное число полей». Основные требования:

  • количество полей во всех выборках строго одинаковое;
  • порядок полей совпадает — сопоставление идёт по позиции, а не по имени;
  • типы соответствующих полей совместимы: число с числом, строка со строкой, ссылка со ссылкой;
  • для строк учитывается длина: если в одной выборке строка(50), а в другой строка(10), итоговый тип может быть усечён или приведён к неограниченной строке в зависимости от контекста.

Если в одной из выборок какого-то поля нет, его нужно явно заполнить заглушкой: NULL, пустой строкой "", нулём или пустой ссылкой через ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка). Так поле сохранит позицию и тип.

Типичные ошибки при объединении запросов

Первая ошибка — несовпадение порядка полей. Поскольку сопоставление идёт по позиции, перестановка колонок во второй выборке молча «подменяет» данные: сумма попадает в колонку количества, дата — в номенклатуру. Запрос при этом может выполниться без ошибки, если типы формально совместимы.

Вторая ошибка — выбор ОБЪЕДИНИТЬ вместо ОБЪЕДИНИТЬ ВСЕ «для надёжности». Если строки из источников совпадают по всем выбранным полям (например, одинаковая номенклатура и одинаковое количество из двух разных документов), ОБЪЕДИНИТЬ схлопнет их в одну строку, и итоги отчёта занизятся. Обратная ситуация — ОБЪЕДИНИТЬ ВСЕ там, где источники пересекаются, — даёт задвоение.

Третья группа ошибок связана с оформлением: секция УПОРЯДОЧИТЬ ПО внутри отдельной выборки (допустима только в конце), попытка использовать ИТОГИ по полям, которых нет в первой выборке, и неявное приведение типов строк разной длины, из-за которого данные обрезаются.

Типичные ошибки
01
Разный порядок полей в выборках — данные попадают не в те колонки без сообщения об ошибке
02
ОБЪЕДИНИТЬ вместо ОБЪЕДИНИТЬ ВСЕ — совпадающие строки схлопываются, итоги занижаются
03
ОБЪЕДИНИТЬ ВСЕ для пересекающихся источников — строки задваиваются, суммы завышаются
04
УПОРЯДОЧИТЬ ПО внутри отдельной выборки — синтаксическая ошибка, сортировка пишется один раз в конце
05
Пропущенное поле без заглушки NULL — ошибка несовпадения числа полей

Как проверить результат объединения

Простейшая проверка — арифметическая. Выполните каждую выборку отдельно и посчитайте количество строк. При ОБЪЕДИНИТЬ ВСЕ итоговое число строк должно равняться сумме строк отдельных выборок. При ОБЪЕДИНИТЬ — быть меньше или равно этой сумме.

Для отладки удобно использовать консоль запросов (в типовых конфигурациях на управляемых формах она доступна через инструменты разработчика либо подключается как внешняя обработка). Добавьте в выборки поле-маркер источника и сгруппируйте результат по нему — сразу видно, сколько строк пришло из каждой части.

Дополнительная проверка — контрольные суммы. Сравните сумму по числовому полю в объединённом запросе с суммами отдельных выборок. Расхождение без видимых причин почти всегда означает дубли или схлопывание строк.

Контрольные точки

Как проверить результат

Количество строк при ОБЪЕДИНИТЬ ВСЕ
Норма

Равно сумме строк отдельных выборок

Тревожный признак

Меньше суммы — проверьте, не используется ли ОБЪЕДИНИТЬ или отборы

Итоговые суммы по числовым полям
Норма

Совпадают с суммами отдельных выборок

Тревожный признак

Занижены (схлопнуты дубли) или завышены (пересекающиеся источники)

Состав колонок результата
Норма

Данные в каждой колонке соответствуют её смыслу

Тревожный признак

В колонке дат — числа или ссылки: нарушен порядок полей

Альтернативы объединению и когда они лучше

Объединение — не единственный способ собрать данные из нескольких источников. Если таблицы нужно связать по ключу (например, документ и его табличная часть, номенклатура и её остатки), правильнее использовать соединение — ЛЕВОЕ СОЕДИНЕНИЕ и его аналоги. Соединение добавляет колонки, объединение — строки.

Если обе выборки обращаются к одной таблице с разными отборами, часто проще написать один запрос с составным условием через ИЛИ в секции ГДЕ. Это короче и обычно быстрее, чем два прохода по одной таблице с последующим объединением.

Для сложных сценариев — когда объединённый результат нужно ещё раз обработать, сгруппировать или соединить с другими данными — используйте временные таблицы: поместите объединение во временную таблицу через ПОМЕСТИТЬ и работайте с ней дальше. Это делает текст запроса читаемым и упрощает отладку.

Маршрут решения

Как выбрать подход

Нужно сложить строки из разных таблиц или документовОБЪЕДИНИТЬ ВСЕ с полем-маркером источника
Источники могут содержать одинаковые строки, дубли недопустимыОБЪЕДИНИТЬ
Таблицы связываются по ключу и нужны их колонки рядомЛЕВОЕ СОЕДИНЕНИЕ вместо объединения
Обе выборки из одной таблицы с разными отборамиОдин запрос с условием ИЛИ в секции ГДЕ
Результат объединения нужно обработать дальшеПОМЕСТИТЬ во временную таблицу и отдельный запрос к ней

Ограничения и влияние на производительность

Каждая объединяемая выборка выполняется как отдельное обращение к данным, поэтому объединение пяти тяжёлых запросов по большим таблицам может ощутимо нагрузить сервер СУБД. Проверяйте планы выполнения и по возможности сужайте выборки отборами до объединения, а не после.

Оператор ОБЪЕДИНИТЬ дополнительно требует сортировки или хеширования всего результата для поиска дублей — на миллионах строк это заметная нагрузка. Если дубли невозможны по логике данных, всегда предпочитайте ОБЪЕДИНИТЬ ВСЕ.

Также учитывайте: в итоговой выборке доступны только поля, объявленные в первом запросе. Если в последующих выборках есть дополнительные нужные поля, их придётся добавить в первую выборку заглушками, иначе обратиться к ним в итоговой таблице не получится.

Часто задаваемые вопросы

Можно ли объединить больше двух запросов?

Да, количество объединяемых выборок не ограничено двумя. Операторы ОБЪЕДИНИТЬ или ОБЪЕДИНИТЬ ВСЕ перечисляются последовательно между всеми секциями ВЫБРАТЬ. Можно даже смешивать операторы, но это ухудшает читаемость — лучше использовать один вариант последовательно.

Почему после объединения пропали строки, хотя использовал ОБЪЕДИНИТЬ ВСЕ?

Сам оператор ОБЪЕДИНИТЬ ВСЕ строки не удаляет. Проверьте отборы в секциях ГДЕ каждой выборки, права доступа к объектам (RLS может незаметно отфильтровывать данные) и условия соединений внутри отдельных выборок — внутреннее соединение отсекает строки без пары.

Как отличить в результате, из какой выборки пришла строка?

Добавьте в каждую выборку константное поле-маркер, например "Приход" КАК ТипДвижения в первой и "Расход" КАК ТипДвижения во второй. В итоговой таблице по этому полю можно фильтровать, группировать и строить условную логику обработки.

Куда писать УПОРЯДОЧИТЬ ПО и ИТОГИ при объединении?

Обе секции пишутся один раз в самом конце всей конструкции и применяются к объединённому результату. Указание УПОРЯДОЧИТЬ ПО внутри отдельной выборки вызовет синтаксическую ошибку. Имена полей для сортировки и итогов берутся из первой выборки.

Что делать, если типы полей в выборках не совпадают?

Приведите их к совместимому типу явно: функцией ВЫРАЗИТЬ для ссылок и строк, либо заполните отсутствующее поле заглушкой нужного типа — NULL, пустой ссылкой через ЗНАЧЕНИЕ(...) или нулём. Сопоставление полей идёт по позиции, поэтому проверьте и порядок колонок.

Можно ли объединять запросы с разными именами полей?

Да, имена полей в последующих выборках значения не имеют — итоговые имена берутся из первой выборки. Важны только количество полей, их порядок и совместимость типов. Тем не менее одинаковые осмысленные имена упрощают чтение и сопровождение запроса.

Итог

Что важно запомнить

Два запроса в 1С объединяются операторами ОБЪЕДИНИТЬ (с удалением дублей) и ОБЪЕДИНИТЬ ВСЕ (быстрее, все строки сохраняются). Поля выборок сопоставляются по позиции и должны быть совместимы по типам. УПОРЯДОЧИТЬ ПО и ИТОГИ пишутся один раз в конце. Проверяйте результат подсчётом строк и контрольными суммами отдельных выборок.