При разработке отчетов в системе компоновки данных (СКД) разработчики часто сталкиваются с ситуацией, когда колонки таблицы, содержащие числа или интервалы (например, "1", "2", "11"), сортируются не по числовому значению, а по алфавиту. В результате получается нелогичный порядок: "1", "11", "2", "3". Это происходит потому, что СКД воспринимает эти значения как строковые. Рассмотрим подробно, как решить эту задачу несколькими способами, от простых настроек в конструкторе до использования вычисляемых полей и макетов.
Это самый правильный и архитектурно верный способ решения проблемы. В СКД у каждого поля есть свойство, позволяющее указать, по какому правилу или полю его нужно сортировать, независимо от того, что видит пользователь. Разберем по шагам, как это настроить:
Интервал или НомерКолонки).
ВЫРАЗИТЬ(ИмяПоля КАК ЧИСЛО)
Проанализируем ситуацию: теперь, когда СКД будет строить таблицу, она обратится к этому выражению для определения порядка вывода колонок, при этом в заголовке останется исходное строковое представление.
Часто программисты пытаются настроить общую сортировку отчета, но для таблиц в СКД это работает иначе. Сортировка колонок определяется настройками конкретной группировки. Выполним следующие действия:
ПорядокВывода), даже если оно не выбрано для отображения в отчете.Рассмотрим пример: если наше поле колонок содержит текст "свыше 10 дн.", мы можем добавить в запрос поле КоличествоДней (числовое) и в настройках группировки колонок указать сортировку именно по этому числовому полю.
Если структура данных не позволяет получить числовое поле напрямую из запроса (как в случае из сообщения 13: "свыше 1 дн.", "свыше 11 дн."), мы можем создать вычисляемое поле. Выясним, как это сделать:
На закладке Вычисляемые поля добавим новое поле, назовем его, например, ПорядокКолонок. В выражении напишем код, который извлекает число из строки. Если мы точно знаем структуру строки, можно использовать функции СТРЗАМЕНИТЬ, ПОДСТРОКА или обратиться к функции общего модуля:
// Пример выражения, если нужно убрать текст и оставить число
ВЫРАЗИТЬ(СтрЗаменить(ИмяПоля, "свыше ", "") КАК ЧИСЛО)
После создания такого поля, вернемся к методу 1 или 2 и укажем это вычисляемое поле в качестве критерия для сортировки. Обратите внимание, что само вычисляемое поле не обязательно выводить в отчет — оно может служить исключительно технической цели.
Рассмотрим более простой, но "визуальный" способ. Если мы приведем все строковые значения к одной длине, добавив нули в начало (например, "01", "02", "11"), то алфавитная сортировка автоматически станет эквивалентна числовой. Однако пользователю видеть нули не всегда приятно.
Посмотрим, как это реализовать красиво:
"0" + ИмяПоля (с проверкой длины).Хотя этот метод кажется менее элегантным, он выручает, когда нет возможности менять структуру запроса или использовать сложные макеты.
Для самых сложных случаев, когда логика определения порядка и представления сильно разнится, проанализируем вариант с макетом. Мы можем создать макет группировки для колонок. В ячейке макета можно указать параметр и в его свойствах прописать выражение, вызывающее функцию общего модуля.
// В макете ячейки для параметра "Заголовок"
ОбщийМодульОтчетов.ПолучитьПредставлениеИнтервала(ИмяПоля)
В этом случае мы можем хранить в самом поле СКД "чистые" числа для идеальной сортировки, а в макете "на лету" превращать их в красивые строки типа "Интервал: от 1 до 5 дней". СКД сначала отсортирует данные как числа, а затем применит макет для отрисовки заголовков.
Проанализируем ситуацию, когда нам нужно быстро исправить порядок "1, 11, 2" без создания новых полей. В настройках упорядочивания группировки можно добавить два уровня сортировки:
ДЛИНА(ИмяПоля) по возрастанию.ИмяПоля по возрастанию.В таком случае строка "2" (длина 1) всегда будет выше строки "11" (длина 2), и проблема будет решена минимальными усилиями.
Подведем итог: для решения проблемы сортировки колонок в СКД лучше всего использовать Выражение упорядочивания в настройках набора данных или явно указывать поле сортировки в настройках Группировки. Использование вычисляемых полей и функций общих модулей позволяет реализовать любую, даже самую сложную логику расположения столбцов в отчете.