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

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

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

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

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


ВЫБРАТЬ
    Регистратор,
    Сумма
ИЗ
    РегистрНакопления.РасчетыСПоставщиками КАК Расчеты
ГДЕ
    Расчеты.Контрагент = &Контрагент

Вы создаете параметр &Контрагент. Однако в терминах СКД «параметр» и «отбор» — это не одно и то же. Пользователь, открывая настройки отчета, может добавить поле Контрагент в «Отборы». При этом система будет пытаться наложить этот отбор поверх вашего запроса, но если параметр &Контрагент внутри текста запроса остается неинициализированным или не связанным с этим отбором, запрос просто не найдет нужных записей.

Как правильно настроить фильтрацию

Существует несколько подходов к решению этой задачи. Рассмотрим их подробно.

  1. Использование параметров СКД. Если вы определили параметр &Контрагент в тексте запроса, перейдите на вкладку «Параметры» в настройках набора данных СКД. Убедитесь, что там стоит флажок «Включать в доступные поля». Если вы хотите, чтобы пользователь мог менять этот параметр прямо в форме отчета, убедитесь, что параметр не является «ограниченным».
  2. Использование автоматических отборов. Самый простой способ избежать пустых отчетов — не прописывать фильтры в секции ГДЕ принудительно. Оставьте запрос «чистым», выбрав все данные, а фильтрацию возложите на саму СКД. Если вы добавите поле Контрагент в структуру отчета или в раздел «Отборы» настроек, система сама отфильтрует данные после выполнения запроса. Это самый производительный и «правильный» способ работы с СКД.
  3. Работа с виртуальными таблицами. Если данные регистра очень объемные, лучше передавать параметры прямо в виртуальную таблицу (например, РегистрНакопления.РасчетыСПоставщиками.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, , , Контрагент = &Контрагент)). В этом случае СКД поймет, что параметр нужно передать на уровень СУБД, и запрос будет работать максимально быстро.

Проверяем права доступа (RLS)

Бывает и так, что запрос написан верно, параметры переданы, но данных всё равно нет. В такой ситуации необходимо проанализировать права пользователя. В типовых конфигурациях 1С активно используются механизмы RLS (ограничение доступа на уровне записей). Если текущий пользователь не имеет прав на просмотр конкретной организации, запрос вернет пустой результат. Попробуйте выполнить отчет под администратором или пользователем с полными правами, чтобы исключить влияние Профилей групп доступа.

Советы по отладке

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

Помните: работа в Консоли запросов и работа в СКД — это разные процессы. Консоль выполняет чистый SQL-запрос, а СКД выполняет запрос, готовит данные, применяет отборы, рассчитывает итоги и формирует макет. Учитесь доверять возможностям СКД по автоматической фильтрации, а не жестко «зашивать» параметры в ГДЕ.

← На главную