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

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

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

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

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

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

Ниже разобраны механика работы обоих операторов, влияние на производительность, типовые сценарии выбора, способы проверки результата и ограничения, о которых нужно помнить при написании запросов.

Как работает каждый оператор

Оператор ОБЪЕДИНИТЬ соединяет результаты выборок и затем выполняет неявное устранение дубликатов: если две строки совпадают по всем выбранным полям, в итог попадает только одна из них. По сути это эквивалент операции UNION в классическом SQL.

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

Пример: первая часть запроса возвращает строки «Товар А, 100» и «Товар Б, 200», вторая — «Товар Б, 200» и «Товар В, 300». При ОБЪЕДИНИТЬ результат содержит три строки (дубль «Товар Б, 200» удалён), при ОБЪЕДИНИТЬ ВСЕ — четыре строки.

Синтаксис и минимальный пример

Обе формы записываются между частями запроса. Количество, порядок и типы полей во всех частях должны совпадать — иначе запрос не выполнится.

ВЫБРАТЬ

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

Продажи.СуммаОборот КАК Сумма

ИЗ

РегистрНакопления.Продажи.Обороты(&Начало, &Конец, , ) КАК Продажи

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

ВЫБРАТЬ

Возвраты.Номенклатура,

-Возвраты.СуммаОборот

ИЗ

РегистрНакопления.Продажи.Обороты(&НачалоВозврат, &КонецВозврат, , ) КАК Возвраты

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

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

Влияние на производительность

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

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

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

Когда выбирать ОБЪЕДИНИТЬ, а когда ОБЪЕДИНИТЬ ВСЕ

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

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

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

Как выбрать оператор

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

Поле-разделитель как защита от дублей

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

Типичные ошибки и их последствия

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

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

Третья группа ошибок — несоответствие типов полей в частях запроса. Если в первой части поле числовое, а во второй — строковое, запрос не выполнится. Типы выравнивают явно через ВЫРАЗИТЬ или приведением значений.

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

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

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

Для отчётов с суммами полезен контрольный приём: свернуть результат по ключевым измерениям с СУММА() и сравнить итоги с данными исходных регистров (например, с оборотами из стандартного отчёта). Расхождение — признак потерянных или задвоенных строк.

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

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

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

Количество совпадает и соответствует ожиданиям по смыслу данных

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

Числа различаются, а причина различий не объяснена

Итоговые суммы отчёта
Норма

Суммы сходятся с оборотами исходных регистров

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

Суммы ниже оборотов — вероятно, дубли ошибочно удалены

Поле-источник в итоговой выборке
Норма

Каждая строка помечена своей частью запроса

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

Строки без признака источника — сложно отладить происхождение

Ограничения и смежные возможности языка запросов

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

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

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

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

Частые вопросы

Можно ли смешивать ОБЪЕДИНИТЬ и ОБЪЕДИНИТЬ ВСЕ в одном запросе?

Технически да, платформа это выполнит. Но логика устранения дублей в смешанной цепочке становится неочевидной: часть дублей удалится, часть останется. Такой запрос сложно отлаживать, поэтому без веской причины смешивать формы не стоит.

Почему ОБЪЕДИНИТЬ не убрал повторяющиеся строки?

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

Что быстрее при большом объёме данных?

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

Как получить уникальный список значений из нескольких таблиц?

Два рабочих варианта: объединить выборки через ОБЪЕДИНИТЬ, либо объединить через ОБЪЕДИНИТЬ ВСЕ и обернуть результат во внешний запрос с РАЗЛИЧНЫЕ. Второй вариант нагляднее и часто удобнее для дальнейшей обработки, например для сортировки или группировки.

Откуда берутся имена полей итогового запроса?

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

Итог

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

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