В процессе разработки отчетов в системе компоновки данных СКД часто возникает необходимость фильтровать данные не только по полям запроса, но и по значениям вычисляемых ресурсов. Однако при попытке наложить отбор типа «Содержит» на ресурс, вычисляемый через функцию СоединитьСтроки, разработчики часто сталкиваются с тем, что отчет формируется пустым. Давайте разберемся, почему это происходит и как правильно настроить отбор. Для сбора значений из нескольких строк в единый ресурс пригодится материал по объединению значений строк в СКД.
Основная причина заключается в архитектурных особенностях выполнения операций в СКД. Система формирует итоговую таблицу в несколько этапов:
СКД производит группировку данных по заданным измерениям.Когда вы устанавливаете отбор в общих настройках отчета, СКД пытается применить его на самом первом этапе — на уровне исходного запроса. В этот момент поле, содержащее результат функции СоединитьСтроки, физически еще не существует, так как группировка и вычисления еще не произведены. Именно поэтому система не может «отфильтровать» пустой результат или вовсе игнорирует условие.
Важно понимать разницу: обычные агрегатные функции, такие как Сумма, Максимум или Минимум, могут транслироваться в SQL-запрос (через конструкцию HAVING). Функция СоединитьСтроки является клиентской функцией платформы, и сервер баз данных не «понимает» её в контексте SQL-запроса, что делает невозможным применение фильтра на ранних стадиях обработки.
Если вы хотите отфильтровать данные по результатам вычислений СКД, вам необходимо перенести условие отбора из общих настроек в настройки конкретной группировки. Рассмотрим, как это сделать по шагам:
СКД.МоделиЗаказа — Содержит — «ВашаПодстрока».Почему это работает? В данном случае СКД сначала выполняет группировку, затем рассчитывает все необходимые показатели (в том числе наш ресурс МоделиЗаказа), и только после этого применяет заданный отбор к уже сформированной таблице значений. Таким образом, условие проверяется не к источнику данных, а к уже вычисленному результату.
Помимо переноса отбора в группировку, существуют и другие методы оптимизации:
1. Перенос логики в запрос
Если данных в отчете очень много, отбор на уровне группировки может привести к снижению производительности, так как системе придется сначала вычислить все строки, а затем отсечь лишнее. В таких случаях мы рекомендуем перенести логику формирования строки непосредственно в запрос с использованием временных таблиц или вложенных подзапросов, если это позволяет логика конфигурации.
2. Добавление поля в группировку
Иногда полезно добавить «базовое» поле (например, Модель) в состав группировок, даже если вы не планируете выводить его в отчет. Это позволит наложить отбор на уровне группировки по этому полю, что сработает быстрее и будет более прозрачно для системы.
3. Использование представлений
Помните, что использование ПРЕДСТАВЛЕНИЕССЫЛКИ() в запросе может влиять на то, как СКД интерпретирует типы данных. Если вы столкнулись с трудностями, попробуйте явно обращаться к конкретному полю, например Модель.Наименование, чтобы убедиться, что система работает с ожидаемым строковым типом данных.
Итог: Если вы столкнулись с тем, что отбор по вычисляемому ресурсу выдает пустой результат — просто переместите этот отбор из общих настроек в настройки соответствующей группировки. Это стандартный и наиболее эффективный способ решения данной задачи в СКД.