При разработке сложных отчетов в СКД часто возникает ситуация, когда иерархические данные хранятся в разных полях. Например, у вас есть «Статья затрат» и «Договор комитента», которые логически должны следовать друг за другом в едином списке, основанном на числовом префиксе в наименовании. Рассмотрим пошагово, как добиться такой сортировки, если стандартные настройки группировок не дают нужного результата.
Основная сложность заключается в том, что СКД применяет сортировку для каждой группировки независимо. Если вы настроили сортировку отдельно для поля «Статья затрат» и отдельно для «Договора комитента», система не видит между ними связи и не может выстроить сквозной порядок. Для решения этой задачи нам нужно создать «единый знаменатель» для сортировки.
Первым делом нам необходимо извлечь числовую часть из представлений обоих полей. Для этого в наборе данных СКД на вкладке «Вычисляемые поля» создадим два новых поля, например: КодСортировкиСтатьи и КодСортировкиДоговора.
Для извлечения первых трех цифр воспользуемся выражением:
ВЫРАЗИТЬ(ПОДСТРОКА(СтатьяЗатрат.Наименование, 1, 3) КАК ЧИСЛО(3))
Аналогичную операцию проведем для поля ДоговорКомитента. Это позволит нам получить числовое значение, которое система сможет корректно упорядочить.
Чтобы добиться «сквозной» сортировки, мы можем использовать механизм выбора в зависимости от текущего контекста группировки. Создадим общее вычисляемое поле ЕдиныйКодСортировки, которое будет возвращать значение в зависимости от того, какой объект мы сейчас обрабатываем:
ВЫБОР
КОГДА ЕстьNULL(СтатьяЗатрат, НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО ТОГДА КодСортировкиСтатьи
ИНАЧЕ КодСортировкиДоговора
КОНЕЦ
Это поле станет ключом к решению. Теперь нам не нужно сортировать по исходным полям, достаточно указать ЕдиныйКодСортировки в качестве поля сортировки для всех соответствующих группировок в настройках СКД.
Если данные по-прежнему выводятся некорректно, рассмотрим вариант объединения данных на уровне запроса. Если вы используете ОБЪЕДИНИТЬ ВСЕ, вы можете создать общее поле НаименованиеОбъекта и поле ЧисловойКод. В настройках структуры отчета вы будете использовать только эти два поля.
Код, которое будет содержать числовое значение для обоих типов данных.СКД в настройках группировки добавьте это поле Код в список полей сортировки.Если задача становится слишком сложной из-за глубокой вложенности групп, рассмотрите следующие советы:
1. Использование функции ВычислитьВыражение: Иногда оправдано использование функции ВычислитьВыражение для получения родительских значений, но этот путь требует глубокого тестирования производительности отчета.
2. Унификация данных: Помните, что СКД работает лучше всего, когда объекты одного уровня имеют общую структуру. Попытка «склеить» сортировку для принципиально разных полей без приведения их к общему реквизиту — это борьба с механизмом компоновки. Лучше один раз подготовить данные в запросе, добавив колонку СортировочныйКод, чем пытаться вычислять сложные выражения в настройках.
3. Проверка иерархии: Если «Статья затрат» является родителем для «Договора», убедитесь, что в запросе связь между ними определена четко. Если иерархия строится «на лету» в СКД, обязательно задайте порядок сортировки для каждой группы, чтобы система не теряла логическую последовательность при переходе от одного уровня к другому.
Применяя эти методы, вы сможете добиться требуемого порядка отображения данных, независимо от того, какие именно поля участвуют в группировках. Главное — всегда сводить задачу сортировки к числовому значению, понятному для платформы.