Почему запрос в консоли возвращает данные, а в отчете СКД выводит 0 строк

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

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

Основные причины расхождения данных между консолью и СКД

В отличие от консоли запросов, которая отправляет текст в СУБД практически без изменений, СКД выполняет многоэтапную генерацию макета. Проанализируем ключевые факторы, приводящие к потере строк:

  1. Автоматическая оптимизация и вырезание подзапросов. Генератор макета СКД анализирует только те поля, которые выбраны в структуре отчета, группировках, отборах или условном оформлении. Если поле из временной таблицы или левого соединения явно не выведено в результат, СКД может полностью удалить эту временную таблицу или ветку соединения из итогового текста SQL-запроса.
  2. Неявная передача параметров в виртуальные таблицы. СКД автоматически сопоставляет стандартные параметры схемы (например, Период, НачалоПериода, КонецПериода) с параметрами виртуальных таблиц регистров. Если параметры не заполнены в пользовательских настройках или инициализированы пустой датой, виртуальные таблицы регистров остатков и оборотов возвращают 0 записей.
  3. Обработка нулевых значений и значений NULL. При агрегации и соединениях генератор макета может отсекать строки с нулевыми или неопределенными значениями ресурсов, если они не обработаны функцией ЕСТЬNULL() или исключены настройками отбора.
  4. Ограничения прав доступа на уровне записей (RLS). Консоль запросов нередко запускается с полными правами или в привилегированном режиме, тогда как СКД по умолчанию исполняется в контексте прав текущего пользователя с наложением ограничений RLS.

Способ 1. Получение фактического исполняемого запроса СКД

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


КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки());

Для Каждого НаборДанных Из МакетКомпоновки.НаборыДанных Цикл
    Если ТипЗнч(НаборДанных) = Тип("НаборДанныхЗапросМакетаКомпоновкиДанных") Тогда
        ТекстИсполняемогоЗапроса = НаборДанных.Запрос;
        Сообщить(ТекстИсполняемогоЗапроса);
    КонецЕсли;
КонецЦикла;

Скопируем полученный текст запроса обратно в консоль запросов и проанализируем, какие именно секции или временные таблицы были усечены платформой.

Способ 2. Использование специализированной консоли компоновки данных

Для детального анализа поведения отчетов рекомендуется использовать специализированную консоль компоновки данных. Этот инструмент позволяет:

  1. Пошагово отслеживать процесс компоновки макета и формирование результирующего дерева данных.
  2. Видеть сформированный текст запроса для каждого набора данных с подставленными значениями параметров.
  3. Выполнять отладку схемы без необходимости модификации кода конфигурации.

Способ 3. Установка свойства «Обязательное» и отключение автозаполнения

Если СКД удаляет временные таблицы или промежуточные поля, которые необходимы для корректного расчета, применим следующие настройки в схеме:

  1. Перейдем на вкладку Наборы данных в схеме компоновки.
  2. В списке полей набора найдем ключевые поля временных таблиц и установим для них флаг Обязательное. Это запретит генератору макета вырезать поля и связанные соединения из итогового запроса.
  3. Если используется ручное управление полями и фильтрами, отключим механизм автозаполнения в запросе и явно опишем доступные поля через конструкцию {ВЫБРАТЬ ...} и {ГДЕ ...}.

Способ 4. Проверка виртуальных таблиц и обработки ресурсов

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

  1. В параметрах виртуальных таблиц явно переданы параметры периода, например РегистрНакопления.ОстаткиНоменклатуры.Остатки(&Период, ), а на вкладке Параметры для них снят признак ограничения доступности и заданы корректные значения по умолчанию.
  2. Все числовые поля и ресурсы обернуты в функцию ЕСТЬNULL(Поле, 0), чтобы исключить исключение строк при группировках.
  3. В настройках структуры отчета на вкладке Настройки добавлена группировка Детальные записи или задана корректная иерархия группировок, если отчет содержит не только ресурсы, но и аналитические разрезы.
← На главную