Почему в отчете СКД значение типа Булево не выводится как «Нет» при пустом значении?

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

При работе с дополнительными реквизитами в СКД часто возникает ситуация, когда требуется отобразить статус объекта (например, «Да» или «Нет»), основываясь на наличии записи в табличной части дополнительных свойств. Если у объекта нет заданного свойства, запрос может возвращать NULL, из-за чего логика ВЫБОР отрабатывает некорректно. Давайте разберем, как правильно построить запрос, чтобы избежать подобных проблем.

Анализ причины проблемы

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

Шаг 1: Правильное использование ЛЕВОГО СОЕДИНЕНИЯ

Чтобы сохранить все объекты (например, все договоры) и при этом получить данные по их свойствам, необходимо использовать ЛЕВОЕ СОЕДИНЕНИЕ. Крайне важно перенести условие фильтрации конкретного свойства из секции ГДЕ непосредственно в условие связи ПО.

Рассмотрим правильный вариант структуры запроса:


ВЫБРАТЬ
    ДоговорыКонтрагентов.Ссылка КАК Договор,
    ВЫБОР
        КОГДА ЕСТЬNULL(ДоговорыКонтрагентовДополнительныеРеквизиты.Значение, ЛОЖЬ) = ЛОЖЬ
            ТОГДА "Нет"
        ИНАЧЕ "Да"
    КОНЕЦ КАК Статус
ИЗ
    Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ДоговорыКонтрагентов.ДополнительныеРеквизиты КАК ДоговорыКонтрагентовДополнительныеРеквизиты
        ПО ДоговорыКонтрагентов.Ссылка = ДоговорыКонтрагентовДополнительныеРеквизиты.Ссылка
            И (ДоговорыКонтрагентовДополнительныеРеквизиты.Свойство = &Свойство)

Шаг 2: Обработка NULL значений

Функция ЕСТЬNULL является незаменимым инструментом в данном сценарии. В коде выше мы принудительно заменяем NULL (который возникает при отсутствии записи в табличной части) на значение ЛОЖЬ. Это позволяет нам унифицировать логику: если значения нет или оно равно ЛОЖЬ, мы выводим «Нет». В противном случае — «Да».

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

  1. ЛЕВОЕ СОЕДИНЕНИЕ оставляет все строки из первой таблицы (договоры).
  2. Условие в ПО находит только нужный реквизит, не фильтруя при этом сам список договоров.
  3. ЕСТЬNULL превращает отсутствие записи в логическое значение, пригодное для дальнейших вычислений.

Рекомендации по отладке

Если вы все еще получаете неожиданные результаты, воспользуйтесь следующими советами:

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

← На главную