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