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

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

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

Понятие запроса-полуфабриката в СКД

Первое, что нам необходимо усвоить: текст, который мы пишем на закладке "Набор данных - запрос", не является тем финальным запросом, который уходит на сервер СУБД. Как справедливо замечено в профессиональном сообществе, запрос в СКД — это лишь полуфабрикат. Система компоновки данных — это интеллектуальный генератор. Она анализирует настройки пользователя (выбранные поля, группировки, отборы) и на их основе "собирает" итоговый текст запроса. Если в настройках отчета не используется какая-то таблица или поле, СКД может просто вырезать их из итогового исполнения ради оптимизации.

Использование консоли СКД для диагностики

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

  1. Загрузите схему компоновки данных в консоль СКД.
  2. Установите все необходимые настройки (периоды, отборы).
  3. Сформируйте макет компоновки.
  4. Проанализируйте вкладку "Исполняемый запрос". Именно здесь вы увидите реальный SQL-подобный код со всеми примененными фильтрами и соединениями.

Часто именно на этом этапе выясняется, что СКД добавила лишнее условие ГДЕ или изменила тип соединения таблиц.

Проблема параметров и виртуальных таблиц

Одной из самых частых причин пустого результата являются параметры. В обычной консоли мы задаем их вручную. В СКД параметры могут жить своей жизнью. Рассмотрим подробнее:

Влияние автозаполнения и оптимизация соединений

На закладке "Наборы данных" есть флаг Автозаполнение. По умолчанию он включен, и это заставляет СКД анализировать все доступные поля. Выясним причину, почему добавление нового поля в группировку (как в описанном случае) может "сломать" отчет:

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

Роли полей и обязательные данные

Иногда отчет пустеет из-за неправильно настроенных ролей полей. Проанализируем ситуацию с флагом Обязательное на закладке "Наборы данных":

  1. Если поле помечено как "Обязательное", СКД будет всегда включать его в запрос, даже если оно не выбрано пользователем.
  2. Если это поле связано с таблицей, которая при определенных условиях возвращает NULL, и на поле наложено условие в самом тексте запроса, данные могут быть отсечены.
  3. Проверьте роли для остатков и оборотов. Если вы неверно указали поле "Период" или "Счет" в ролях, СКД может некорректно построить дерево итогов, и визуально отчет будет казаться пустым.

Ограничение доступа на уровне записей (RLS)

Не забывайте, что консоль запросов часто запускается разработчиком под полными правами. При запуске отчета в пользовательском интерфейсе вступают в силу механизмы RLS. Система автоматически добавляет в итоговый WHERE условия ограничения прав. Если у пользователя нет прав на чтение какого-то измерения, участвующего в соединении, результат будет пустым. Проверьте выполнение запроса под пользователем с полными правами — если данные появились, проблему нужно искать в ролях и правах доступа.

Обработка NULL в группировках и ресурсах

Рассмотрим пример, когда данные пропадают при добавлении группировки. Если поле, по которому вы пытаетесь сгруппировать результат, содержит NULL, поведение СКД зависит от настроек. В некоторых случаях, особенно при использовании иерархии, записи с пустыми значениями могут скрываться. Всегда полезно использовать функцию ЕСТЬNULL() в тексте запроса для полей, которые могут участвовать в связях или группировках:


ВЫБРАТЬ
    ЕСТЬNULL(Продажи.СуммаОборот, 0) КАК Сумма,
    ЕСТЬNULL(Номенклатура.Наименование, "Не указано") КАК Товар
ИЗ
    РегистрНакопления.Продажи.Обороты AS Продажи

Итоги и рекомендации

Чтобы ваш отчет в СКД всегда работал предсказуемо, придерживайтесь следующих правил:

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

← На главную