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