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