При разработке сложных отчетов в системе компоновки данных (СКД) нередко возникает необходимость объединять несколько источников данных в единый набор-объединение. Однако при установке стандартного отбора по полю ресурса можно столкнуться с неожиданным поведением: платформа отсекает данные до их объединения и агрегации.
Разберем природу этой проблемы и выясним, как правильно наложить отбор на итоговые значения ресурсов после объединения наборов.
Проанализируем типовую ситуацию. Допустим, отчет строится на базе объединения двух наборов данных:
Если сформировать отчет без отборов, мы получим две итоговые строки, и сумма по каждой из них будет не меньше 2. Но если добавить условие Ресурс >= 2 в общие отборы отчета на вкладке «Настройки», результат изменится: строка из первого набора полностью исчезнет.
Выясним причину такого поведения. Оптимизатор СКД по умолчанию стремится минимизировать объем обрабатываемых данных и переносит все глобальные отборы отчета на самый глубокий уровень — непосредственно в условия ГДЕ каждого входящего запроса или во внутренние фильтры выборки. В итоге условие Ресурс >= 2 проверяется для каждой детальной записи по отдельности еще до суммирования и объединения. Так как детальные записи первого набора меньше 2, они исключаются до того, как СКД успеет посчитать их сумму.
Чтобы платформа проверяла условие не для детальных записей в наборах, а для уже рассчитанных и агрегированных итогов (аналог секции ИМЕЮЩИЕ / HAVING в языке запросов), отбор необходимо накладывать не на весь отчет, а на конкретную группировку.
Разберем пошаговый порядок настройки:
Ресурс Больше или равно 2.В результате пользователь сможет менять значение отбора прямо в шапке отчета, но СКД применит его строго после объединения всех наборов данных и расчета итогов группировки.
Рассмотрим другие варианты решения задачи и нюансы их применения:
Сумма(Ресурс)), платформа запретит использовать его в отборах на уровне детальных записей и автоматически разрешит накладывать условие только на уровне группировок. Однако этот метод требует точного указания доступных полей расчета, иначе при формировании схемы возникнет ошибка отсутствия поля.ОБЪЕДИНИТЬ ВСЕ внутри одного набора данных-запроса и поместить их во вложенный запрос, СКД не сможет внедрить условие ГДЕ во внутренние таблицы при снятом флаге автозаполнения. Однако использование нескольких наборов данных часто предпочтительнее, так как платформа автоматически исключает неиспользуемые наборы из выполнения, если их поля не выбраны пользователем.Наиболее простым, надежным и стандартным решением для фильтрации объединенных наборов данных является перенос отбора с общего уровня отчета на уровень соответствующей группировки строк с последующим включением условия в пользовательские настройки.