Как настроить отбор по ресурсам при объединении наборов данных в СКД

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

При разработке сложных отчетов в системе компоновки данных (СКД) нередко возникает необходимость объединять несколько источников данных в единый набор-объединение. Однако при установке стандартного отбора по полю ресурса можно столкнуться с неожиданным поведением: платформа отсекает данные до их объединения и агрегации.

Разберем природу этой проблемы и выясним, как правильно наложить отбор на итоговые значения ресурсов после объединения наборов.

Анализ проблемы: почему СКД отсекает данные

Проанализируем типовую ситуацию. Допустим, отчет строится на базе объединения двух наборов данных:

  1. Первый набор содержит несколько одинаковых строк с небольшими значениями ресурса (например, 1 и 1, что в сумме дает 2).
  2. Второй набор содержит одну строку со значением ресурса 2.

Если сформировать отчет без отборов, мы получим две итоговые строки, и сумма по каждой из них будет не меньше 2. Но если добавить условие Ресурс >= 2 в общие отборы отчета на вкладке «Настройки», результат изменится: строка из первого набора полностью исчезнет.

Выясним причину такого поведения. Оптимизатор СКД по умолчанию стремится минимизировать объем обрабатываемых данных и переносит все глобальные отборы отчета на самый глубокий уровень — непосредственно в условия ГДЕ каждого входящего запроса или во внутренние фильтры выборки. В итоге условие Ресурс >= 2 проверяется для каждой детальной записи по отдельности еще до суммирования и объединения. Так как детальные записи первого набора меньше 2, они исключаются до того, как СКД успеет посчитать их сумму.

Основное решение: перенос отбора на уровень группировки

Чтобы платформа проверяла условие не для детальных записей в наборах, а для уже рассчитанных и агрегированных итогов (аналог секции ИМЕЮЩИЕ / HAVING в языке запросов), отбор необходимо накладывать не на весь отчет, а на конкретную группировку.

Разберем пошаговый порядок настройки:

  1. Откроем схему компоновки данных и перейдем на вкладку «Настройки».
  2. В окне структуры отчета выберем нужную группировку (например, группировку верхнего уровня или группировку по ключевому разрезу).
  3. В нижней части окна перейдем на вкладку «Отбор» выбранной группировки (не путать с общей вкладкой отбора всего отчета).
  4. Добавим условие по ресурсу, например: Ресурс Больше или равно 2.
  5. Чтобы этот фильтр был доступен пользователю в режиме предприятия на главной форме отчета, нажмем по нему правой кнопкой мыши и выберем пункт «Свойства элемента пользовательских настроек».
  6. Установим флаг «Включать в пользовательские настройки» и укажем понятный режим редактирования (например, «Быстрый доступ»).

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

Альтернативные подходы и их особенности

Рассмотрим другие варианты решения задачи и нюансы их применения:

  1. Использование вычисляемых полей с агрегатными функциями. Если создать вычисляемое поле с выражением агрегации (например, Сумма(Ресурс)), платформа запретит использовать его в отборах на уровне детальных записей и автоматически разрешит накладывать условие только на уровне группировок. Однако этот метод требует точного указания доступных полей расчета, иначе при формировании схемы возникнет ошибка отсутствия поля.
  2. Формирование единого запроса с объединением. Если объединить выборки с помощью конструкции ОБЪЕДИНИТЬ ВСЕ внутри одного набора данных-запроса и поместить их во вложенный запрос, СКД не сможет внедрить условие ГДЕ во внутренние таблицы при снятом флаге автозаполнения. Однако использование нескольких наборов данных часто предпочтительнее, так как платформа автоматически исключает неиспользуемые наборы из выполнения, если их поля не выбраны пользователем.
  3. Использование вложенных схем компоновки. В сложных архитектурных решениях агрегацию наборов можно вынести во вложенную СКД, а результирующий фильтр наложить во внешней схеме. Это гарантирует полную изоляцию выборки от пост-фильтрации.

Итог

Наиболее простым, надежным и стандартным решением для фильтрации объединенных наборов данных является перенос отбора с общего уровня отчета на уровень соответствующей группировки строк с последующим включением условия в пользовательские настройки.

← На главную