Разработка отчетов на Системе компоновки данных (СКД) часто преподносит сюрпризы: один и тот же запрос, выполненный в обычной консоли запросов, выдает ожидаемые строки, а в отчете СКД возвращает пустой результат. Давайте разберем эту ситуацию подробно, проанализируем внутренние механизмы СКД и выясним, почему "полуфабрикат" запроса в наборе данных может превратиться в совершенно иной исполняемый код.
Первое, что нам необходимо усвоить: текст, который мы пишем на закладке "Набор данных - запрос", не является тем финальным запросом, который уходит на сервер СУБД. Как справедливо замечено в профессиональном сообществе, запрос в СКД — это лишь полуфабрикат. Система компоновки данных — это интеллектуальный генератор. Она анализирует настройки пользователя (выбранные поля, группировки, отборы) и на их основе "собирает" итоговый текст запроса. Если в настройках отчета не используется какая-то таблица или поле, СКД может просто вырезать их из итогового исполнения ради оптимизации.
Чтобы понять, во что превратился наш запрос, мы не можем использовать обычную консоль. Нам потребуется специализированный инструмент — Консоль системы компоновки данных (доступна на ИТС). Разберем по шагам, как с ней работать:
Часто именно на этом этапе выясняется, что СКД добавила лишнее условие ГДЕ или изменила тип соединения таблиц.
Одной из самых частых причин пустого результата являются параметры. В обычной консоли мы задаем их вручную. В СКД параметры могут жить своей жизнью. Рассмотрим подробнее:
РегистрНакопления.Остатки), СКД автоматически пытается подставить параметры периодов. Если на закладке "Параметры" у Период не стоит флаг "Ограничение доступности", пользователь может неявно передать пустую дату, что приведет к пустому результату.СтандартныйПериод. Если в параметрах виртуальной таблицы вы ожидаете Дата, а передаете границы стандартного периода неправильно, запрос не вернет данных. Проанализируем настройки на закладке "Параметры" и убедимся, что выражения для начала и конца периода заполнены корректно, например: &Период.ДатаНачала.На закладке "Наборы данных" есть флаг Автозаполнение. По умолчанию он включен, и это заставляет СКД анализировать все доступные поля. Выясним причину, почему добавление нового поля в группировку (как в описанном случае) может "сломать" отчет:
Если вы используете ЛЕВОЕ СОЕДИНЕНИЕ, но добавляете поле из правой таблицы в отбор или группировку, СКД может автоматически оптимизировать запрос, превратив соединение во ВНУТРЕННЕЕ. Если в правой таблице нет соответствующих записей, вся выборка исчезнет. Чтобы этого избежать, используйте фигурные скобки {} — это расширение языка запросов СКД, которое позволяет жестко управлять необязательными полями и условиями.
Иногда отчет пустеет из-за неправильно настроенных ролей полей. Проанализируем ситуацию с флагом Обязательное на закладке "Наборы данных":
NULL, и на поле наложено условие в самом тексте запроса, данные могут быть отсечены.Не забывайте, что консоль запросов часто запускается разработчиком под полными правами. При запуске отчета в пользовательском интерфейсе вступают в силу механизмы RLS. Система автоматически добавляет в итоговый WHERE условия ограничения прав. Если у пользователя нет прав на чтение какого-то измерения, участвующего в соединении, результат будет пустым. Проверьте выполнение запроса под пользователем с полными правами — если данные появились, проблему нужно искать в ролях и правах доступа.
Рассмотрим пример, когда данные пропадают при добавлении группировки. Если поле, по которому вы пытаетесь сгруппировать результат, содержит NULL, поведение СКД зависит от настроек. В некоторых случаях, особенно при использовании иерархии, записи с пустыми значениями могут скрываться. Всегда полезно использовать функцию ЕСТЬNULL() в тексте запроса для полей, которые могут участвовать в связях или группировках:
ВЫБРАТЬ
ЕСТЬNULL(Продажи.СуммаОборот, 0) КАК Сумма,
ЕСТЬNULL(Номенклатура.Наименование, "Не указано") КАК Товар
ИЗ
РегистрНакопления.Продажи.Обороты AS Продажи
Чтобы ваш отчет в СКД всегда работал предсказуемо, придерживайтесь следующих правил:
ЛЕВОГО СОЕДИНЕНИЯ во ВНУТРЕННЕЕ.{} для управления необязательными участками запроса.ЕСТЬNULL там, где это необходимо.Помните, что СКД — это не просто способ выполнить запрос, это сложный механизм построения отчета, который требует глубокого понимания логики компоновки данных.