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

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

Часто разработчики сталкиваются с ситуацией: в консоли запросов SQL-код работает безупречно, фильтрует данные как надо, а стоит перенести этот же текст в систему компоновки данных (СКД), как отчет перестает «видеть» условия и выводит все записи подряд. Давайте разберем, почему это происходит и как настроить отчет так, чтобы он работал корректно.

Разберем причину: работа с NULL и левые соединения

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

Если мы пишем в секции ГДЕ условие вида:


И ОперацииДокументов.Операция <> ЗНАЧЕНИЕ(Справочник.ТиповыеОперации.НужнаяОперация)

Система 1С исключает из выборки все записи, где поле Операция равно NULL, так как сравнение NULL с любым значением дает результат «неизвестно» (логически это не равно ИСТИНА). В итоге мы теряем документы, у которых просто нет записей в регистре, или наоборот, получаем непредсказуемый результат.

Шаг 1: Правильная обработка NULL в запросе

Чтобы условие работало корректно, нам нужно явно указать системе, как поступать с пустыми значениями. Используйте функцию ЕСТЬNULL или конструкцию ВЫБОР КОГДА. Давайте рассмотрим правильный подход к написанию условия:


И (ЕСТЬNULL(ОперацииДокументов.Операция, ЗНАЧЕНИЕ(Справочник.ТиповыеОперации.ПустаяСсылка)) 
    <> ЗНАЧЕНИЕ(Справочник.ТиповыеОперации.НужнаяОперация))

Или используйте конструкцию ВЫБОР, которая поможет четко определить поведение для отсутствующих связей:


И ВЫБОР
    КОГДА НЕ ОперацииДокументов.Операция ЕСТЬ NULL
        ТОГДА ОперацииДокументов.Операция <> ЗНАЧЕНИЕ(Справочник.ТиповыеОперации.НужнаяОперация)
    ИНАЧЕ ИСТИНА
КОНЕЦ

Шаг 2: Проверка настроек СКД

Если запрос в консоли работает, а СКД упорно «игнорирует» фильтр, проблема может скрываться в настройках самой схемы компоновки:

  1. Автозаполнение наборов данных: Если в наборе данных стоит галочка «Автозаполнение», СКД может самостоятельно менять структуру запроса. Попробуйте отключить автозаполнение, чтобы видеть все поля в явном виде и контролировать их использование.
  2. Закладка «Параметры»: Проверьте, стоят ли галочки напротив параметров НачалоПериода и КонецПериода в колонке «Включать в доступные поля». Если параметр не активен, он не будет передавать данные в отчет.
  3. Настройки отбора в детальных записях: Перейдите на вкладку «Настройки» в СКД. Убедитесь, что в группировке (или «Детальных записях») нет установленных отборов, которые перекрывают или конфликтуют с условиями, прописанными непосредственно в тексте запроса.

Шаг 3: Диагностика через пользовательский режим

Чтобы понять, что именно происходит в момент формирования отчета, воспользуйтесь следующим приемом:

Помните, что СКД — это мощный инструмент, который может накладывать свои фильтры поверх ваших. Поэтому всегда полезно проверять, какой именно запрос генерирует система.

Что делать, если ничего не помогает?

Иногда настройки схемы компоновки повреждаются — это редкое, но встречающееся явление, особенно при частом редактировании отчета разными программистами. Если вы уверены, что запрос верный, синтаксис ВЫБОР КОГДА корректен, а отборы на закладке «Настройки» пусты, но данные все равно выводятся ошибочно, попробуйте самый радикальный, но действенный метод:

  1. Скопируйте текст рабочего запроса в текстовый файл.
  2. Создайте новую схему компоновки данных с нуля.
  3. Заново добавьте набор данных — запрос и вставьте туда проверенный текст.
  4. Настройте параметры заново.

Как показывает практика, в 90% случаев при переносе запроса в чистую схему СКД все начинает работать корректно. Это говорит о том, что в старых настройках скрывались неявные связи или параметры, которые конфликтовали с условиями отбора.

Используйте метод «от противного»: начните с минимального запроса без условий, убедитесь, что данные выводятся, а затем постепенно добавляйте условия в ГДЕ, проверяя результат на каждом этапе. Это позволит локализовать ошибку максимально быстро.

← На главную