1C-Code → Как сделать → Какие бывают соединения в запросе 1С и чем отличаются
Внутреннее оставляет только совпавшие пары. Левое сохраняет все строки левой таблицы, подставляя NULL там, где справа ничего нет. Полное — обе стороны.
ВЫБРАТЬ
Клиенты.Наименование КАК Контрагент,
ЕСТЬNULL(Долги.СуммаОстаток, 0) КАК Долг
ИЗ
Справочник.Контрагенты КАК Клиенты
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ВзаиморасчётыСКлиентами.Остатки(&НаДату, ) КАК Долги
ПО Долги.Контрагент = Клиенты.Ссылка
Список всех контрагентов с долгами: тот, кто ничего не должен, обязан остаться в отчёте с нулём, а не пропасть. Внутреннее соединение выбросило бы его — и отчёт «задолженность по клиентам» показал бы только должников, что заметят не сразу.
Несовпавшие строки дают NULL, а не ноль. NULL в арифметике заражает всё выражение: NULL + 5 — это NULL. Отсюда пустые суммы в отчётах, которые «иногда считаются, иногда нет».
Разница принципиальна для ЛЕВОГО соединения. Условие в ПО отсекает строки ПРАВОЙ таблицы до соединения; то же условие в ГДЕ отсечёт результат ПОСЛЕ — вместе со строками, которые левое соединение старалось сохранить, и оно превратится во внутреннее.
Оно даёт строки обеих таблиц, дополняя NULL с той стороны, где пары нет. Настоящее применение одно: сравнить два набора и увидеть расхождения в обе стороны.
Соединение с ВЛОЖЕННЫМ запросом — частая причина медленных отчётов: у вложенного запроса нет индексов, и база вынуждена перебирать его целиком на каждую строку. Если данные нужны как таблица — кладите их во временную через ПОМЕСТИТЬ и соединяйтесь с ней.
Задача на это. Прочитать приём и применить его — разные умения. В тренажёре есть задача «Задвоение суммы при соединении»: самая коварная ошибка соединений: сумма выросла вдвое, а запрос выглядит правильным. Найти причину и починить. Решение проверяется скрытыми тестами, в том числе на краевых случаях, о которых в условии не сказано.