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

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

Левое соединение в запросе 1С 8.3: что это и как работает

Что такое левое соединение в запросе 1С 8.3, как работает, синтаксис, примеры, типичные ошибки и отличия от внутреннего и полного соединения таблиц.

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

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

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

Как работает левое соединение: логика на простом примере

Представьте две таблицы: «Номенклатура» (5 товаров) и «Остатки» (записи только по 3 товарам). Левое соединение «Номенклатура ЛЕВОЕ СОЕДИНЕНИЕ Остатки» вернёт все 5 товаров. Для трёх товаров остаток будет заполнен, для двух — поле остатка будет содержать NULL.

Ключевое слово здесь — «все строки слева». Платформа сначала берёт каждую строку левой таблицы, затем ищет ей пары в правой по условию ПО. Если пар несколько — строка левой таблицы продублируется в результате столько раз, сколько нашлось совпадений. Если ни одной — строка останется одна, но с NULL в правых полях.

Синтаксис левого соединения в 1С 8.3

Общая форма записи выглядит так:

ВЫБРАТЬ

Товары.Ссылка КАК Товар,

ЕСТЬNULL(Остатки.Количество, 0) КАК Остаток

ИЗ

Справочник.Номенклатура КАК Товары

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

ПО Товары.Ссылка = Остатки.Номенклатура

Обратите внимание на три обязательных элемента: псевдонимы таблиц (КАК Товары, КАК Остатки), условие связи после ПО и обработку NULL через ЕСТЬNULL. Без псевдонимов запрос быстро становится нечитаемым, а без ЕСТЬNULL в отчёте появятся пустые значения, которые ломают итоги и группировки.

Условий связи может быть несколько, они перечисляются через И:

ПО Остатки.Номенклатура = Товары.Ссылка

И Остатки.Склад = &Склад

Типичные сценарии использования

Справочник плюс данные регистра

Самый частый сценарий: показать весь справочник (контрагенты, товары, сотрудники) и добавить к нему обороты, остатки или цены. Внутреннее соединение здесь теряет строки, левое — сохраняет полный список.

Поиск записей без пары

Левое соединение с условием ГДЕ ПраваяТаблица.Поле ЕСТЬ NULL — стандартный способ найти «осиротевшие» записи: товары без цен, сотрудников без начислений, документы без движений. Это быстрее и нагляднее, чем конструкция НЕ В с подзапросом.

Соединение с виртуальной таблицей

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

Порядок действий
  1. 1
    Определите, какая таблица главная (должна попасть в результат целиком) — она будет левой
  2. 2
    Напишите ЛЕВОЕ СОЕДИНЕНИЕ с правой таблицей и задайте псевдонимы
  3. 3
    Укажите условие связи в ПО по ключевым полям
  4. 4
    Оберните поля правой таблицы в ЕСТЬNULL там, где нужны конкретные значения вместо NULL
  5. 5
    Выполните запрос в консоли запросов и проверьте количество строк и дубли

Отличия от других типов соединений

Тип соединенияЧто попадает в результатКогда использовать
ВНУТРЕННЕЕТолько строки, где есть пара в обеих таблицахКогда нужны только связанные данные, «пустые» строки не нужны
ЛЕВОЕВсе строки левой таблицы + совпадения справа (NULL при отсутствии)Полный список справочника с дополнительными данными
ПРАВОЕВсе строки правой таблицы + совпадения слеваРедко; обычно проще поменять таблицы местами и написать ЛЕВОЕ
ПОЛНОЕВсе строки обеих таблиц, NULL с той стороны, где нет парыСопоставление двух независимых списков, например при сверке

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

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

Левое соединение

Подходит, когда главная таблица одна и нужно сохранить все её строки. Ограничение: требует обработки NULL в полях правой таблицы.

Внутреннее соединение

Подходит, когда нужны только гарантированно связанные записи. Ограничение: теряет строки без пары, что часто искажает отчёты.

Полное соединение

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

Типичные ошибки и как их избежать

Первая ошибка — забытый ЕСТЬNULL. Значение NULL не суммируется, не сравнивается и «съедает» результат арифметики: 100 + NULL = NULL. В итогах отчёта это даёт пустые суммы там, где ожидался ноль.

Вторая ошибка — условие фильтрации правой таблицы в секции ГДЕ вместо ПО. Запись ГДЕ Остатки.Склад = &Склад превращает левое соединение во внутреннее: строки с NULL отсекаются. Отбор по полям правой таблицы, который не должен «убивать» строки слева, всегда переносится в ПО.

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

Типичные ошибки
01
Пропущен ЕСТЬNULL — итоги и арифметика дают NULL вместо ожидаемых значений
02
Условие по правой таблице написано в ГДЕ — левое соединение фактически превращается во внутреннее
03
Соединение с неагрегированной таблицей — строки результата дублируются, суммы завышаются
04
Сравнение с NULL через равенство вместо ЕСТЬ NULL — условие никогда не срабатывает

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

Перед переносом запроса в код выполните его в консоли запросов и сверьте три контрольные точки: количество строк не меньше, чем в левой таблице с учётом отборов; суммы по числовым полям не завышены из-за дублей; вместо NULL подставлены осмысленные значения.

Дополнительная проверка на дубли: добавьте в запрос группировку по ключу левой таблицы с подсчётом КОЛИЧЕСТВО(*) — значения больше ожидаемого указывают на размножение строк в правой таблице.

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

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

Число строк результата
Норма

Не меньше количества записей левой таблицы с её отборами

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

Строк меньше — вероятно, условие в ГДЕ отсекает NULL-строки

Суммы по числовым полям
Норма

Совпадают с контрольным расчётом по правой таблице

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

Суммы завышены — правое соединение дублирует строки

Поля правой таблицы
Норма

Вместо пустоты стоят 0 или заданные значения ЕСТЬNULL

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

Встречаются NULL там, где ожидались числа или строки

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

Левое соединение само по себе не медленное, но его стоимость растёт при соединении с необрезанными таблицами. Перед соединением ограничивайте правую таблицу параметрами виртуальной таблицы или вложенным запросом с отбором — это уменьшает объём обрабатываемых данных.

Избегайте соединения по вычисляемым выражениям и функциям (например, ПО ПОДСТРОКА(Поле, 1, 5) = ...) — такие условия не используют индексы и на больших таблицах выполняются долго. Также не соединяйте таблицы по полям составного типа без необходимости.

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

Как выбрать действие

В отчёте пропадают позиции без движенийЗамените внутреннее соединение на левое и добавьте ЕСТЬNULL к числовым полям
После добавления соединения суммы вырослиСгруппируйте правую таблицу по ключу связи до соединения
Нужно найти записи без парыИспользуйте левое соединение с условием ГДЕ ПраваяТаблица.Ключ ЕСТЬ NULL
Отбор по правой таблице обнуляет строки слеваПеренесите условие из секции ГДЕ в секцию ПО

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

Чем левое соединение отличается от внутреннего на практике?

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

Почему вместо нуля в колонке пусто?

Потому что при отсутствии пары поля правой таблицы содержат NULL, а NULL отображается как пустота. Оберните поле в функцию ЕСТЬNULL(Поле, 0) — и вместо пустого значения будет подставлен ноль или другой нужный вам литерал.

Можно ли соединять больше двух таблиц левым соединением?

Да, соединения перечисляются последовательно: левая таблица соединяется со второй, результат — с третьей и так далее. Каждое следующее соединение работает с уже полученным набором строк, поэтому порядок и условия ПО нужно продумывать для каждой пары отдельно.

Когда лучше использовать полное соединение вместо левого?

Полное соединение оправдано при сверке двух независимых источников, когда «лишние» записи могут быть с любой стороны — например, при сопоставлении данных двух баз. В обычных отчётах, где есть одна главная таблица, достаточно левого соединения.

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

Сам тип соединения критично не влияет; скорость определяется объёмом соединяемых данных и наличием индексов по полям связи. Замедление обычно вызывают соединение с неотфильтрованной таблицей, условия по вычисляемым выражениям и соединение по составным типам полей.

Итог

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

Левое соединение сохраняет все строки левой таблицы и подставляет NULL в поля правой при отсутствии пары. Всегда обрабатывайте NULL через ЕСТЬNULL, отборы по правой таблице пишите в ПО, а результат проверяйте на дубли строк и корректность итогов.