При разработке отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда стандартная сортировка по алфавиту или коду не удовлетворяет требованиям заказчика. Чаще всего требуется отсортировать строки отчета по значению ресурса — например, вывести список товаров, начиная с самых продаваемых. Несмотря на кажущуюся простоту, настройки сортировки по итогам имеют свои нюансы, связанные с уровнями группировок и типами данных. В этой статье мы подробно разберем, как добиться корректного упорядочивания данных по итоговым значениям.
Первая и самая распространенная ошибка — попытка установить сортировку по ресурсу на уровне всего отчета (в самом корне дерева настроек). В СКД настройки сортировки для группировок имеют приоритет над общими настройками. Проанализируем правильный алгоритм действий:
Номенклатура или Контрагент).СуммаОборот или КоличествоИтог).Важно помнить: если в списке сортировки уже присутствует элемент Авто, СКД будет пытаться сначала применить автоматическую сортировку по полям группировки. Чтобы сортировка по ресурсу стала первичной, переместим наше поле выше элемента Авто или вовсе удалим его из списка.
Иногда стандартный механизм сортировки по ресурсу не срабатывает из-за особенностей компоновки или сложных условий расчета. В таком случае рассмотрим метод создания специального вычисляемого поля, которое будет дублировать логику ресурса, но использоваться исключительно для упорядочивания. Выясним, как это реализовать:
ПолеДляСортировки.
Выбор
Когда Сумма(Продажи) = 0 Тогда 0
Иначе Сумма(Продажи)
Конец
Такой подход позволяет нам получить "чистое" числовое поле, которое не зависит от визуального отображения ресурса в отчете. Теперь в настройках группировки мы можем выбрать именно это ПолеДляСортировки.
Разберем ситуацию, когда сортировка вроде бы настроена, но работает некорректно (например, число 10 оказывается выше числа 2). Это происходит, если СКД интерпретирует значение как строку. Проанализируем рекомендации по приведению типов:
Никогда не используйте пустые кавычки "" в условиях ВЫБОР для числовых ресурсов. Если итоговое значение должно быть пустым, используйте 0 или NULL, обернутый в функцию обработки. Рассмотрим правильное использование функции ЕстьNull:
ЕстьNull(Сумма(Стоимость), 0)
Использование ЕстьNull гарантирует, что при сравнении значений СУБД будет оперировать числами, а не неопределенными состояниями, что исключает "выпадение" строк из правильного порядка.
Бывают задачи, когда необходимо отсортировать элементы внутри иерархии не относительно их родителя, а "сквозным" образом по всему отчету. В этом нам поможет мощный инструмент СКД — функция ВычислитьВыражение. Рассмотрим пример выражения для вычисляемого поля:
ВычислитьВыражение("Сумма(СуммаОборот)", "ОбщийИтог")
Это выражение рассчитает сумму по всей группировке, игнорируя текущий контекст строки. Используя такое поле в настройках порядка, мы можем выстроить элементы в строгой последовательности, определяемой глобальными итогами.
Работа с кросс-таблицами (таблицами, имеющими и строки, и колонки) добавляет сложности. Если нам нужно отсортировать строки по итогам одной из колонок, выполним следующие шаги:
Если ресурс рассчитывается только по полю "Общие итоги", то внутри строк кросс-таблицы сортировка может не сработать. Проанализируем ситуацию: СКД должна понимать значение ресурса для каждой конкретной комбинации "Строка - Итог по колонкам".
Влияние иерархии: Если в вашем отчете используется тип группировки Иерархия, помните, что стандартная сортировка работает внутри каждого узла. Сначала сортируются родители между собой, затем — дочерние элементы внутри каждого родителя. Если вам нужно нарушить эту логику, придется использовать программную доработку компоновки или сложные вычисляемые поля с функцией ВычислитьВыражение. Для этой задачи можно использовать примеры программной настройки СКД и отчетов со сложными выражениями.
Программная установка порядка: Если визуальный конструктор не позволяет добиться нужного результата (например, при динамическом формировании колонок), мы можем управлять порядком через код перед выводом отчета. Посмотрим на пример обращения к настройкам порядка:
ЭлементПорядка = КомпоновщикНастроек.Настройки.Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
ЭлементПорядка.Поле = Новый ПолеКомпоновкиДанных("ИтоговаяСумма");
ЭлементПорядка.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Убыв;
ЭлементПорядка.Использование = Истина;
Подводя итог, можно сказать, что ключ к успешной сортировке по итогам в СКД — это четкое понимание того, на каком уровне (группировка или отчет) применяется настройка, и контроль за числовым типом данных в выражениях ресурсов.