← Назад к вопросам

Чем отличается левое соединение от внутреннего и полного в запросах 1С?

1.0 Junior🔥 191 комментариев
#Запросы и оптимизация

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

JOIN типы в запросах 1С: Левое, Внутреннее и Полное соединение

В 1С используются три основных типа соединения таблиц (JOIN), которые определяют, какие строки будут выбраны при объединении источников данных.

Внутреннее соединение (INNER JOIN)

Внутреннее соединение возвращает только те строки, которые имеют совпадения в обеих таблицах:

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

Визуально (диаграмма Венна):

     Таблица А     Таблица В
        [  A ∩ B  ]

Пересечение двух множеств — только совпадающие записи.

Левое соединение (LEFT JOIN)

Левое соединение возвращает все строки из левой таблицы и совпадающие строки из правой:

ВЫБРАТЬ
    Документы.Накладные.Номер,
    Документы.Накладные.Дата,
    Справочники.Контрагенты.Наименование
ИЗ
    Документ.Накладная Как Накладные
    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты Как Контрагенты
    ПО Накладные.Контрагент = Контрагенты.Ссылка
  • Результат: все накладные, даже если контрагент не заполнен
  • Поля правой таблицы: будут пусты (NULL) если совпадения нет
  • Использование: когда нужно сохранить все записи из левой таблицы
  • Пример: получить все накладные, включая те, которые не имеют контрагента

Визуально:

     Таблица А     Таблица В
    [ A ∪ (A ∩ B) ]

Вся левая таблица + её пересечение с правой.

Полное соединение (FULL JOIN)

Полное соединение возвращает все строки из обеих таблиц:

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

Визуально:

     Таблица А     Таблица В
    [    A ∪ B    ]

Объединение двух множеств — все записи из обеих таблиц.

Сравнительная таблица

ХарактеристикаINNER JOINLEFT JOINFULL JOIN
Левая таблицаТолько совпаденияВсе записиВсе записи
Правая таблицаТолько совпаденияТолько совпаденияВсе записи
Строки без парыИсключеныСохранены (левые)Сохранены (обе)
NULL поляНетМогут быть (правые)Могут быть (обе)
ПроизводительностьЛучшеСредняяМедленнее
Типичный случайОбязательные связиОпциональные ссылкиПолная статистика

Практические примеры

Пример 1: INNER JOIN — только полные данные

// Получить расходы только по заполненным статьям затрат
ВЫБРАТЬ
    РегистрСведений.Расходы.Сумма,
    СтатьяЗатрат.Наименование
ИЗ
    РегистрСведений.Расходы
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СтатьиЗатрат Как СтатьяЗатрат
    ПО РегистрСведений.Расходы.Статья = СтатьяЗатрат.Ссылка
ГДЕ
    РегистрСведений.Расходы.Период >= &ДатаНачала

Пример 2: LEFT JOIN — все записи с опциональной информацией

// Получить всех сотрудников с их должностями (если указаны)
ВЫБРАТЬ
    Сотрудники.ФИО,
    ИFNULL(Должности.Наименование, "Не указана") Как Должность
ИЗ
    Справочник.Сотрудники Как Сотрудники
    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Должности Как Должности
    ПО Сотрудники.Должность = Должности.Ссылка
ГДЕ
    Сотрудники.ПометкаУдаления = ЛОЖЬ

Пример 3: FULL JOIN — поиск несоответствий

// Найти контрагентов без накладных и накладных без контрагентов
ВЫБРАТЬ
    Контрагенты.Наименование,
    КОЛИЧЕСТВО(Накладные.Номер) Как КолНакладных
ИЗ
    Справочник.Контрагенты Как Контрагенты
    ПОЛНОЕ СОЕДИНЕНИЕ Документ.Накладная Как Накладные
    ПО Контрагенты.Ссылка = Накладные.Контрагент
ГДЕ
    Контрагенты.ПометкаУдаления = ЛОЖЬ
ГРУППИРОВАТЬ ПО
    Контрагенты.Наименование

Советы оптимизации

  1. Используй INNER JOIN по умолчанию — он быстрее и требует меньше памяти
  2. LEFT JOIN для опциональных связей — когда ссылка может быть незаполнена
  3. Избегай FULL JOIN — часто можно заменить на UNION двух LEFT JOIN
  4. Индексы на колонки соединения — улучшат производительность запроса
  5. Ограничивай результаты WHERE — уменьшай количество объединяемых строк

Частая ошибка

// ❌ НЕПРАВИЛЬНО: забыли про опциональные ссылки
ВЫБРАТЬ * ИЗ Документ.Счёт
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты
// → потеряем все счета без контрагента

// ✅ ПРАВИЛЬНО: используем LEFT для опциональных
ВЫБРАТЬ * ИЗ Документ.Счёт
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты
// → сохраняем все счета

Выбор типа JOIN определяет корректность выборки данных, поэтому важно понимать бизнес-логику и семантику отношений между таблицами.