1C-CodeКак сделать → Какие бывают соединения в запросе 1С и чем отличаются

Соединения в запросе 1С: внутреннее, левое, полное

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

Код

ВЫБРАТЬ
	Клиенты.Наименование КАК Контрагент,
	ЕСТЬNULL(Долги.СуммаОстаток, 0) КАК Долг
ИЗ
	Справочник.Контрагенты КАК Клиенты
	ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ВзаиморасчётыСКлиентами.Остатки(&НаДату, ) КАК Долги
		ПО Долги.Контрагент = Клиенты.Ссылка

Что здесь важно

1. Левое соединение — когда нужны все строки слева

Список всех контрагентов с долгами: тот, кто ничего не должен, обязан остаться в отчёте с нулём, а не пропасть. Внутреннее соединение выбросило бы его — и отчёт «задолженность по клиентам» показал бы только должников, что заметят не сразу.

2. После левого соединения обязателен ЕСТЬNULL

Несовпавшие строки дают NULL, а не ноль. NULL в арифметике заражает всё выражение: NULL + 5 — это NULL. Отсюда пустые суммы в отчётах, которые «иногда считаются, иногда нет».

3. Условие соединения — в ПО, отбор — в ГДЕ

Разница принципиальна для ЛЕВОГО соединения. Условие в ПО отсекает строки ПРАВОЙ таблицы до соединения; то же условие в ГДЕ отсечёт результат ПОСЛЕ — вместе со строками, которые левое соединение старалось сохранить, и оно превратится во внутреннее.

4. Полное соединение нужно редко

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

Где обычно спотыкаются

Соединение с ВЛОЖЕННЫМ запросом — частая причина медленных отчётов: у вложенного запроса нет индексов, и база вынуждена перебирать его целиком на каждую строку. Если данные нужны как таблица — кладите их во временную через ПОМЕСТИТЬ и соединяйтесь с ней.

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

Решить задачу

Разобраться глубже

Другие вопросы

Как получить остатки на дату запросом в 1С Как программно провести документ в 1С Как избавиться от запроса в цикле в 1С Как добавить колонку в таблицу значений программно Как свернуть таблицу значений Как найти строку в таблице значений Как выгрузить колонку таблицы значений в массив Как превратить массив в таблицу значений Как передать таблицу значений с сервера на клиент Как отобрать строки в таблице значений Как отсортировать таблицу значений Как записать движения регистра накопления программно Чем регистр остатков отличается от регистра оборотов Как контролировать остатки при проведении документа Как добавить реквизит расширением конфигурации Как сравнить две таблицы значений Как выгрузить таблицу значений в Excel Чем дерево значений отличается от таблицы значений Как задать условное оформление таблицы на форме