Как правильно использовать фильтры при левом соединении в запросах 1С?

Программист 1С v8.3 (Управляемые формы) Управленческий учет IT и автоматизация бизнеса
← На главную

При разработке отчетов в 1С:Предприятии часто возникает необходимость получить список объектов, у которых отсутствуют связанные записи в других таблицах. Для этого мы традиционно используем ЛЕВОЕ СОЕДИНЕНИЕ. Однако, на практике нередко случается, что данные «пропадают» из отчета или выводятся неполным списком. Давайте разберем, почему это происходит и как правильно настраивать связи в запросах.

Суть проблемы: фильтрация и левое соединение

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

Рассмотрим ситуацию: мы хотим получить список сотрудников и информацию об их договорах материальной ответственности (МОЛ). Если мы накладываем условие ГДЕ Договор.Период <= &Дата, то для сотрудников, у которых договора нет (и система подставила NULL), условие сравнения с датой не выполняется. В итоге NULL не проходит проверку, и сотрудник просто исчезает из результата, как будто мы использовали обычное ВНУТРЕННЕЕ СОЕДИНЕНИЕ.

Разберем решение по шагам

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

  1. Проанализируем структуру: Нам нужно соединить таблицу сотрудников с регистром договоров СЭ_ДоговорыМОЛ.
  2. Правильное объединение: Вместо одного условия связи мы должны указать все критерии поиска и ограничения прямо в операторе ПО.

Посмотрим на пример того, как должен выглядеть исправленный участок кода в вашем запросе:


ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СЭ_ДоговорыМОЛ КАК СЭ_ДоговорыМОЛ 
ПО (СЭ_ДоговорыМОЛ.Сотрудник = КадроваяИсторияСотрудниковСрезПоследних.Сотрудник) 
И (СЭ_ДоговорыМОЛ.Подразделение = КадроваяИсторияСотрудниковСрезПоследних.Подразделение)
И (СЭ_ДоговорыМОЛ.Период <= &Дата)

Почему это работает?

Когда мы переносим условия в ПО, мы сообщаем платформе 1С:Предприятие следующее: «При попытке сопоставить сотрудника с договором, учитывай только те записи, которые соответствуют подразделению и дате».

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

Практические рекомендации

Для того чтобы отчет работал стабильно и отображал данные корректно, рекомендуем придерживаться следующих правил:

Используя этот подход, вы сможете избежать «исчезновения» данных и сделать отчеты более надежными. Перенос условий в связь ПО — это фундамент, который позволяет работать с NULL-значениями осознанно и эффективно.

← На главную