Часто при разработке сложных отчетов в Системе Компоновки Данных (СКД) мы сталкиваемся с тем, что стандартные механизмы сортировки работают не так, как ожидает пользователь. Особенно это заметно, когда отчет представлен в виде кросс-таблицы, где в строках располагаются подразделения, а в колонках — периоды. Если необходимо отсортировать данные по конкретному месяцу, стандартная сортировка по Ресурсу пытается применить правило ко всем колонкам сразу, что приводит к некорректному результату или «каше» в данных.
Разберем подробно, как реализовать гибкую сортировку, которая позволит пользователю выбирать, по какой именно колонке (месяцу) нужно отсортировать строки.
Когда мы пытаемся сортировать по Выручке, СКД видит набор значений для каждого подразделения во всех периодах. Система не понимает, что именно текущий контекст сортировки должен быть ограничен только одним, выбранным пользователем месяцем. В результате попытки упорядочить данные приводят к попытке усреднения или агрегации по всей таблице.
Для решения этой задачи мы воспользуемся комбинацией Параметра и Вычисляемого поля. Суть метода заключается в создании вспомогательного «поля сортировки», которое будет содержать значение Выручки только тогда, когда месяц совпадает с выбором пользователя.
СКД на вкладку Параметры. Создайте параметр МесяцСортировки. Установите тип значения Строка (или Число, если используете нумерацию периодов). В поле Доступные значения укажите список периодов (например, '01', '02', '03'). Обязательно включите этот параметр в Пользовательские настройки, чтобы пользователь мог менять его при запуске отчета.Вычисляемые поля. Создайте новое поле с именем Ордер (или ПолеСортировки). В выражении укажите формулу, которая будет динамически подставлять значение выручки:
ВЫБОР
КОГДА НомерМесяцаСтрокой = &МесяцСортировки
ТОГДА Выручка
ИНАЧЕ 0
КОНЕЦ
Настройки, выберите группировку строк (в нашем примере это Подразделение). На вкладке Сортировка добавьте новое поле Ордер. Выберите направление сортировки — По возрастанию или По убыванию.Чтобы система работала корректно, убедитесь в соблюдении следующих условий:
НомерМесяцаСтрокой), чтобы формула ВЫБОР КОГДА могла его сравнить с параметром &МесяцСортировки. Если в запросе такого поля нет, добавьте его через Вычисляемые поля или непосредственно в основной запрос данных.Выручка корректно определена как Ресурс в одноименной вкладке СКД.Подразделение (Наименование), чтобы обеспечить однозначность вывода строк.Когда вы выбираете значение в параметре МесяцСортировки, выражение вычисляемого поля Ордер пересчитывается для каждой строки отчета. Для всех периодов, кроме выбранного, значение Ордер становится равным 0, а для выбранного месяца оно принимает значение реальной выручки. Таким образом, сортировка СКД фактически выполняется по одному числу для каждого подразделения, что исключает конфликты между периодами и позволяет получить нужный порядок.
Этот подход является наиболее эффективным для СКД, так как он не требует написания сложного программного кода в модуле объекта и позволяет пользователю самостоятельно управлять отображением данных прямо в пользовательском режиме.