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

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

Часто в практике разработчика 1С встречается ситуация, когда отчет, построенный на базе Системы компоновки данных, внезапно перестает выдавать данные при наложении конкретного отбора. В списке полей отбора мы видим нужный параметр, выбираем значение, но отчет становится пустым. Давайте вместе разберем пошаговый алгоритм поиска причины и устранения такой неполадки.

1. Проверка типов данных и значений

Первым делом проанализируем, нет ли расхождения в типах данных. Самая распространенная причина заключается в том, что тип значения, передаваемого в поле Отбор, не совпадает с типом данных, который ожидает поле запроса. Убедимся, что:

  1. Сотрудник, выбранный в отборе, действительно существует в базе и не является «битой» ссылкой.
  2. Тип значения в Отборе совпадает с типом поля в Наборе данных. Если поле в базе имеет составной тип, убедимся, что мы выбираем объект из нужного справочника.
  3. Данные не отсекаются из-за логики самого запроса или прав доступа RLS, которые могут скрывать запись конкретно для текущего пользователя.

2. Анализ генерируемого текста запроса

Чтобы понять, что именно происходит на «кухне» СКД, воспользуемся консолью СКД. Посмотрим, какой итоговый запрос формирует Компоновщик настроек при наложении отбора. Рассмотрим последовательность действий:

  1. Откроем схему компоновки данных в консоли отчетов.
  2. Наложим нужный отбор (в нашем случае — по сотруднику) и сформируем отчет.
  3. Сравним полученный текст запроса с тем, который работает корректно без этого отбора.

Часто при наложении отбора СКД может переносить условие не в тот раздел запроса или некорректно связывать наборы данных, что приводит к схлопыванию результата (например, при использовании Внутреннего соединения). Для упрощения этой задачи можно использовать расширение для отладки сложных отчетов на СКД.

3. Использование признака «Обязательное поле»

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

4. Проверка связей наборов данных

Разберем ситуацию, когда в отчете используется несколько наборов данных. Если мы соединяем таблицы, обратим внимание на параметры Связи наборов данных:

5. Анализ параметров виртуальных таблиц

Рассмотрим, не используем ли мы отбор в параметрах виртуальной таблицы. Если в тексте запроса параметр задан жестко:


ВЫБРАТЬ
    Таблица.Сотрудник,
    Таблица.Сумма
ИЗ
    РегистрНакопления.Зарплата.Остатки(&Период, ) КАК Таблица

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

6. Метод исключения: самый простой способ проверки

Если предложенные методы не дали результата, создадим максимально простой тестовый отчет. В новом отчете добавим только один набор данных с простым запросом ВЫБРАТЬ * ИЗ Справочник.Сотрудники. Наложим отбор на этом отчете. Если отбор работает — значит, проблема кроется в структуре связей или специфических настройках основного отчета. Если не работает даже в простом примере — возможно, существуют ограничения прав доступа RLS, которые применяются на уровне всей платформы.

Работая над устранением проблемы, всегда держите перед глазами результат генерации запроса — это «золотой ключ» к пониманию того, что делает Компоновщик. Анализируйте связи, проверяйте типы и не бойтесь упрощать отчет для локализации ошибки.

← На главную