Почему при отборе в СКД исчезают строки с пустыми значениями из левого соединения?

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

Часто в процессе разработки отчетов на базе Системы Компоновки Данных (СКД) мы сталкиваемся с ситуацией, когда использование Левого соединения ведет себя не совсем так, как ожидает пользователь. Рассмотрим типичный сценарий: у нас есть основной набор данных (например, Реализация товаров и услуг) и вспомогательный (например, Электронные счета-фактуры). Мы соединяем их, чтобы получить отчет, где видны все реализации, даже те, к которым еще не выставлена счет-фактура. Однако, как только бухгалтер накладывает отбор по полю счета-фактуры, записи без счета-фактуры магическим образом исчезают из отчета. Давайте разберемся, почему так происходит и как это исправить.

Разбор причины «исчезновения» данных

Проблема кроется в фундаментальных принципах работы СУБД и СКД. Когда мы выполняем Левое соединение, система для тех строк основной таблицы, для которых нет пары в связанной таблице, подставляет значение NULL. В языке запросов 1С и в механизме СКД значение NULL — это не «пустое значение» в привычном нам понимании, это индикатор отсутствия данных.

Когда вы накладываете отбор в настройках СКД, он применяется к уже сформированному результату запроса. Логика SQL-движка работает следующим образом: любое сравнение любого поля с NULL (будь то равно, не равно, больше или меньше) всегда возвращает ЛОЖЬ. Таким образом, любая запись, где в поле счета-фактуры стоит NULL, автоматически отсекается фильтром, так как она не соответствует заданному условию.

Способ решения №1: Использование функции ЕСТЬNULL в запросе

Самый надежный и правильный способ борьбы с этой проблемой — это «зачистка» значений NULL на этапе получения данных. Вместо того чтобы позволять системе оперировать неопределенным значением, мы принудительно заменим его на пустую ссылку. Для этого в запросе СКД воспользуемся функцией ЕСТЬNULL.

Рассмотрим пример реализации:


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

После такой модификации, когда бухгалтер установит отбор по конкретному ЭСФ или даже попытается отфильтровать документы, где ЭСФ — это «пустая ссылка», СКД будет работать корректно. Сравнение «Пустая ссылка» = «Пустая ссылка» даст ИСТИНА, и ваши документы реализации останутся в отчете.

Способ решения №2: Настройка логики отбора

Если по каким-то причинам вы не можете изменить текст запроса, можно изменить логику самого отбора в настройках отчета. Однако будьте осторожны: этот способ требует от пользователя дополнительных действий и понимания логики построения условий.

В настройках СКД, в разделе Отбор, можно добавить группировку условий:

  1. Добавьте условие на поле ЭСФ: «Равно [Значение]».
  2. Добавьте второе условие на поле ЭСФ: «Это пустое».
  3. Объедините эти условия через логическое ИЛИ.

Хотя этот метод рабочий, он значительно усложняет жизнь конечному пользователю, поэтому рекомендуем использовать ЕСТЬNULL в коде запроса как стандарт индустрии.

Итоги и рекомендации

Для того чтобы отчеты работали стабильно и предсказуемо, следуйте этим простым правилам при разработке на СКД:

Применение этих простых методик позволит избежать лишних вопросов от пользователей и сделает ваши отчеты профессиональными и надежными.

← На главную