При разработке отчетов в 1С:Предприятии часто возникает необходимость получить список объектов, у которых отсутствуют связанные записи в других таблицах. Для этого мы традиционно используем ЛЕВОЕ СОЕДИНЕНИЕ. Однако, на практике нередко случается, что данные «пропадают» из отчета или выводятся неполным списком. Давайте разберем, почему это происходит и как правильно настраивать связи в запросах.
Когда вы используете ЛЕВОЕ СОЕДИНЕНИЕ, система пытается найти соответствие между главной таблицей и подчиненной. Если соответствие найдено — данные подставляются, если нет — поля подчиненной таблицы заполняются значением NULL. Основная ошибка заключается в том, чтобы после такого соединения применить отбор в секции ГДЕ.
Рассмотрим ситуацию: мы хотим получить список сотрудников и информацию об их договорах материальной ответственности (МОЛ). Если мы накладываем условие ГДЕ Договор.Период <= &Дата, то для сотрудников, у которых договора нет (и система подставила NULL), условие сравнения с датой не выполняется. В итоге NULL не проходит проверку, и сотрудник просто исчезает из результата, как будто мы использовали обычное ВНУТРЕННЕЕ СОЕДИНЕНИЕ.
Чтобы сохранить все записи из левой таблицы (например, список всех сотрудников) и при этом правильно отфильтровать данные из правой таблицы, необходимо перенести условия отбора из секции ГДЕ непосредственно в секцию связи ПО.
СЭ_ДоговорыМОЛ.ПО.Посмотрим на пример того, как должен выглядеть исправленный участок кода в вашем запросе:
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СЭ_ДоговорыМОЛ КАК СЭ_ДоговорыМОЛ
ПО (СЭ_ДоговорыМОЛ.Сотрудник = КадроваяИсторияСотрудниковСрезПоследних.Сотрудник)
И (СЭ_ДоговорыМОЛ.Подразделение = КадроваяИсторияСотрудниковСрезПоследних.Подразделение)
И (СЭ_ДоговорыМОЛ.Период <= &Дата)
Когда мы переносим условия в ПО, мы сообщаем платформе 1С:Предприятие следующее: «При попытке сопоставить сотрудника с договором, учитывай только те записи, которые соответствуют подразделению и дате».
Если для сотрудника в базе не найдется договора, удовлетворяющего этим параметрам, платформа все равно сохранит строку с сотрудником в итоговом результате, но поля договора будут пустыми (NULL). Именно это нам и нужно, чтобы вывести сотрудников «без договора».
Для того чтобы отчет работал стабильно и отображал данные корректно, рекомендуем придерживаться следующих правил:
ЕСТЬNULL: Всегда обрабатывайте значения, полученные из правой таблицы, функцией ЕСТЬNULL. Это позволит заменить неопределенные значения на понятный текст (например, «НЕ ЗАКЛЮЧЕН») при выводе в отчет.ГДЕ для правой таблицы: Старайтесь не ограничивать результаты ЛЕВОГО СОЕДИНЕНИЯ в секции ГДЕ, если только вы не уверены, что хотите исключить строки с NULL значениями.СрезПоследних(&Дата, ...)), чтобы отсечь лишние записи еще на этапе обращения к базе данных, а не в процессе соединения.Используя этот подход, вы сможете избежать «исчезновения» данных и сделать отчеты более надежными. Перенос условий в связь ПО — это фундамент, который позволяет работать с NULL-значениями осознанно и эффективно.