Как настроить сортировку по значениям итогов в отчетах СКД

Программист 1С v8.3 (Управляемые формы) Управленческий учет IT и автоматизация бизнеса
← На главную

При разработке отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда стандартная сортировка по алфавиту или коду не удовлетворяет требованиям заказчика. Чаще всего требуется отсортировать строки отчета по значению ресурса — например, вывести список товаров, начиная с самых продаваемых. Несмотря на кажущуюся простоту, настройки сортировки по итогам имеют свои нюансы, связанные с уровнями группировок и типами данных. В этой статье мы подробно разберем, как добиться корректного упорядочивания данных по итоговым значениям.

Способ 1. Сортировка внутри конкретной группировки

Первая и самая распространенная ошибка — попытка установить сортировку по ресурсу на уровне всего отчета (в самом корне дерева настроек). В СКД настройки сортировки для группировок имеют приоритет над общими настройками. Проанализируем правильный алгоритм действий:

  1. Откроем вкладку Настройки в схеме компоновки данных.
  2. В дереве настроек выберем не корень "Отчет", а конкретную группировку, строки которой мы хотим упорядочить (например, Номенклатура или Контрагент).
  3. В нижней части окна перейдем на закладку Сортировка.
  4. Добавим в список поле, которое является ресурсом (например, СуммаОборот или КоличествоИтог).
  5. Укажем направление сортировки: По убыванию или По возрастанию.

Важно помнить: если в списке сортировки уже присутствует элемент Авто, СКД будет пытаться сначала применить автоматическую сортировку по полям группировки. Чтобы сортировка по ресурсу стала первичной, переместим наше поле выше элемента Авто или вовсе удалим его из списка.

Способ 2. Использование вычисляемых полей для сложной сортировки

Иногда стандартный механизм сортировки по ресурсу не срабатывает из-за особенностей компоновки или сложных условий расчета. В таком случае рассмотрим метод создания специального вычисляемого поля, которое будет дублировать логику ресурса, но использоваться исключительно для упорядочивания. Выясним, как это реализовать:

  1. Перейдем на вкладку Вычисляемые поля.
  2. Добавим новое поле, назовем его, например, ПолеДляСортировки.
  3. В выражении этого поля пропишем ту же формулу, которая используется в ресурсе, но без агрегатных функций (если это возможно на уровне детальных записей) или оставим его пустым, определив логику на вкладке ресурсов.
  4. На вкладке Ресурсы укажем выражение для этого поля. Проанализируем пример корректного выражения, которое исключает ошибки при пустых значениях:

Выбор 
    Когда Сумма(Продажи) = 0 Тогда 0 
    Иначе Сумма(Продажи) 
Конец

Такой подход позволяет нам получить "чистое" числовое поле, которое не зависит от визуального отображения ресурса в отчете. Теперь в настройках группировки мы можем выбрать именно это ПолеДляСортировки.

Способ 3. Проблема типов данных и пустых значений

Разберем ситуацию, когда сортировка вроде бы настроена, но работает некорректно (например, число 10 оказывается выше числа 2). Это происходит, если СКД интерпретирует значение как строку. Проанализируем рекомендации по приведению типов:

Никогда не используйте пустые кавычки "" в условиях ВЫБОР для числовых ресурсов. Если итоговое значение должно быть пустым, используйте 0 или NULL, обернутый в функцию обработки. Рассмотрим правильное использование функции ЕстьNull:

ЕстьNull(Сумма(Стоимость), 0)

Использование ЕстьNull гарантирует, что при сравнении значений СУБД будет оперировать числами, а не неопределенными состояниями, что исключает "выпадение" строк из правильного порядка.

Способ 4. Сквозная сортировка с помощью функции ВычислитьВыражение

Бывают задачи, когда необходимо отсортировать элементы внутри иерархии не относительно их родителя, а "сквозным" образом по всему отчету. В этом нам поможет мощный инструмент СКД — функция ВычислитьВыражение. Рассмотрим пример выражения для вычисляемого поля:

ВычислитьВыражение("Сумма(СуммаОборот)", "ОбщийИтог")

Это выражение рассчитает сумму по всей группировке, игнорируя текущий контекст строки. Используя такое поле в настройках порядка, мы можем выстроить элементы в строгой последовательности, определяемой глобальными итогами.

Способ 5. Сортировка в кросс-таблицах

Работа с кросс-таблицами (таблицами, имеющими и строки, и колонки) добавляет сложности. Если нам нужно отсортировать строки по итогам одной из колонок, выполним следующие шаги:

  1. В настройках отчета найдем группировку строк кросс-таблицы.
  2. На вкладке Сортировка выберем поле ресурса.
  3. Убедимся, что для данного ресурса на вкладке Ресурсы в колонке Рассчитывать по... указаны те группировки, которые участвуют в строках и колонках нашей таблицы.

Если ресурс рассчитывается только по полю "Общие итоги", то внутри строк кросс-таблицы сортировка может не сработать. Проанализируем ситуацию: СКД должна понимать значение ресурса для каждой конкретной комбинации "Строка - Итог по колонкам".

Дополнительные рекомендации

Влияние иерархии: Если в вашем отчете используется тип группировки Иерархия, помните, что стандартная сортировка работает внутри каждого узла. Сначала сортируются родители между собой, затем — дочерние элементы внутри каждого родителя. Если вам нужно нарушить эту логику, придется использовать программную доработку компоновки или сложные вычисляемые поля с функцией ВычислитьВыражение. Для этой задачи можно использовать примеры программной настройки СКД и отчетов со сложными выражениями.

Программная установка порядка: Если визуальный конструктор не позволяет добиться нужного результата (например, при динамическом формировании колонок), мы можем управлять порядком через код перед выводом отчета. Посмотрим на пример обращения к настройкам порядка:


ЭлементПорядка = КомпоновщикНастроек.Настройки.Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
ЭлементПорядка.Поле = Новый ПолеКомпоновкиДанных("ИтоговаяСумма");
ЭлементПорядка.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Убыв;
ЭлементПорядка.Использование = Истина;

Подводя итог, можно сказать, что ключ к успешной сортировке по итогам в СКД — это четкое понимание того, на каком уровне (группировка или отчет) применяется настройка, и контроль за числовым типом данных в выражениях ресурсов.

← На главную