Разработка и Конфигурация · 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Определите, какая таблица главная (должна попасть в результат целиком) — она будет левой
- 2Напишите ЛЕВОЕ СОЕДИНЕНИЕ с правой таблицей и задайте псевдонимы
- 3Укажите условие связи в ПО по ключевым полям
- 4Оберните поля правой таблицы в ЕСТЬNULL там, где нужны конкретные значения вместо NULL
- 5Выполните запрос в консоли запросов и проверьте количество строк и дубли
Отличия от других типов соединений
| Тип соединения | Что попадает в результат | Когда использовать |
|---|---|---|
| ВНУТРЕННЕЕ | Только строки, где есть пара в обеих таблицах | Когда нужны только связанные данные, «пустые» строки не нужны |
| ЛЕВОЕ | Все строки левой таблицы + совпадения справа (NULL при отсутствии) | Полный список справочника с дополнительными данными |
| ПРАВОЕ | Все строки правой таблицы + совпадения слева | Редко; обычно проще поменять таблицы местами и написать ЛЕВОЕ |
| ПОЛНОЕ | Все строки обеих таблиц, NULL с той стороны, где нет пары | Сопоставление двух независимых списков, например при сверке |
Практическое правило: по умолчанию используйте левое соединение, а правое почти всегда можно заменить левым, поменяв таблицы местами. Полное соединение оправдано только при сверке двух источников, где «лишние» строки могут быть с любой стороны.
Сравнение вариантов
Подходит, когда главная таблица одна и нужно сохранить все её строки. Ограничение: требует обработки NULL в полях правой таблицы.
Подходит, когда нужны только гарантированно связанные записи. Ограничение: теряет строки без пары, что часто искажает отчёты.
Подходит для сверки двух списков. Ограничение: NULL может появиться с любой стороны, логика проверки сложнее.
Типичные ошибки и как их избежать
Первая ошибка — забытый ЕСТЬNULL. Значение NULL не суммируется, не сравнивается и «съедает» результат арифметики: 100 + NULL = NULL. В итогах отчёта это даёт пустые суммы там, где ожидался ноль.
Вторая ошибка — условие фильтрации правой таблицы в секции ГДЕ вместо ПО. Запись ГДЕ Остатки.Склад = &Склад превращает левое соединение во внутреннее: строки с NULL отсекаются. Отбор по полям правой таблицы, который не должен «убивать» строки слева, всегда переносится в ПО.
Третья ошибка — неожиданное размножение строк. Если в правой таблице несколько записей на один ключ (например, соединение с табличной частью документов без группировки), каждая строка слева продублируется. Перед соединением правую таблицу стоит сгруппировать до нужного уровня детализации.
Как проверить корректность результата
Перед переносом запроса в код выполните его в консоли запросов и сверьте три контрольные точки: количество строк не меньше, чем в левой таблице с учётом отборов; суммы по числовым полям не завышены из-за дублей; вместо NULL подставлены осмысленные значения.
Дополнительная проверка на дубли: добавьте в запрос группировку по ключу левой таблицы с подсчётом КОЛИЧЕСТВО(*) — значения больше ожидаемого указывают на размножение строк в правой таблице.
Как проверить результат
Не меньше количества записей левой таблицы с её отборами
Строк меньше — вероятно, условие в ГДЕ отсекает NULL-строки
Совпадают с контрольным расчётом по правой таблице
Суммы завышены — правое соединение дублирует строки
Вместо пустоты стоят 0 или заданные значения ЕСТЬNULL
Встречаются NULL там, где ожидались числа или строки
Ограничения и нюансы производительности
Левое соединение само по себе не медленное, но его стоимость растёт при соединении с необрезанными таблицами. Перед соединением ограничивайте правую таблицу параметрами виртуальной таблицы или вложенным запросом с отбором — это уменьшает объём обрабатываемых данных.
Избегайте соединения по вычисляемым выражениям и функциям (например, ПО ПОДСТРОКА(Поле, 1, 5) = ...) — такие условия не используют индексы и на больших таблицах выполняются долго. Также не соединяйте таблицы по полям составного типа без необходимости.
Как выбрать действие
Часто задаваемые вопросы
Чем левое соединение отличается от внутреннего на практике?
Внутреннее соединение возвращает только пары, существующие в обеих таблицах. Левое возвращает всю левую таблицу, дополняя её данными справа там, где они есть. Если в отчёте «теряются» товары или контрагенты без движений — почти наверняка использовано внутреннее соединение вместо левого.
Почему вместо нуля в колонке пусто?
Потому что при отсутствии пары поля правой таблицы содержат NULL, а NULL отображается как пустота. Оберните поле в функцию ЕСТЬNULL(Поле, 0) — и вместо пустого значения будет подставлен ноль или другой нужный вам литерал.
Можно ли соединять больше двух таблиц левым соединением?
Да, соединения перечисляются последовательно: левая таблица соединяется со второй, результат — с третьей и так далее. Каждое следующее соединение работает с уже полученным набором строк, поэтому порядок и условия ПО нужно продумывать для каждой пары отдельно.
Когда лучше использовать полное соединение вместо левого?
Полное соединение оправдано при сверке двух независимых источников, когда «лишние» записи могут быть с любой стороны — например, при сопоставлении данных двух баз. В обычных отчётах, где есть одна главная таблица, достаточно левого соединения.
Влияет ли левое соединение на скорость запроса?
Сам тип соединения критично не влияет; скорость определяется объёмом соединяемых данных и наличием индексов по полям связи. Замедление обычно вызывают соединение с неотфильтрованной таблицей, условия по вычисляемым выражениям и соединение по составным типам полей.
Что важно запомнить
Левое соединение сохраняет все строки левой таблицы и подставляет NULL в поля правой при отсутствии пары. Всегда обрабатывайте NULL через ЕСТЬNULL, отборы по правой таблице пишите в ПО, а результат проверяйте на дубли строк и корректность итогов.