При разработке отчетов на базе Системы компоновки данных (СКД), особенно таких как «Сравнение продаж», разработчики часто сталкиваются с проблемой некорректной сортировки периодов. Если месяц представлен в виде строки (например, «Январь», «Февраль»), система сортирует его по алфавиту, из-за чего «Август» оказывается в начале списка, а «Январь» — в конце. Рассмотрим детально, как решить эту задачу несколькими способами, от простых настроек оформления до тонкой настройки наборов данных.
Прежде чем переходить к решениям, разберем ситуацию. В языке запросов 1С или при вычислении полей в СКД программисты часто преобразуют дату в строку для «красивого» отображения. Как только поле становится строковым, СКД теряет информацию о том, что это дата. Для системы это просто набор символов, и единственно возможный способ автоматической сортировки для них — алфавитный порядок. Наша задача — вернуть системе понимание хронологии или явно указать, по какому правилу выстраивать последовательность.
Проанализируем самый эффективный и «чистый» метод. Вместо того чтобы превращать дату в строку на уровне запроса, нам следует оставить поле с типом Дата (приведенное к началу месяца). Рассмотрим пошагово, как это реализовать:
НАЧАЛОПЕРИОДА(Продажи.Период, МЕСЯЦ). Назовем это поле ПериодМесяц.ПериодМесяц найдем колонку «Оформление».ДФ='MMMM yyyy'.Почему это работает: В этом случае в данных отчета хранится полноценная дата (например, 01.01.2023). СКД автоматически сортирует даты хронологически. Однако благодаря заданному формату пользователь увидит в ячейке привычное название: «Январь 2023». Это исключает необходимость в громоздких конструкциях ВЫБОР КОГДА и дополнительных технических полях.
Если по каким-то причинам нам крайне необходимо выводить именно строковое поле, в СКД предусмотрен механизм разделения данных для отображения и данных для сортировки. Разберем, как настроить свойство Выражение упорядочивания:
На закладке «Наборы данных» для нашего строкового поля «Месяц» в соответствующей колонке выберем поле, которое содержит реальную дату или числовой номер месяца. Например, если у нас в наборе данных есть скрытое поле ПериодМесяц (типа Дата), мы указываем его в качестве выражения упорядочивания для текстового поля. Теперь, когда пользователь нажмет кнопку сортировки по колонке «Месяц», система «под капотом» будет использовать значения из поля даты.
Иногда разработчики решают задачу «в лоб», создавая дополнительное числовое поле для сортировки. Посмотрим на пример кода, который можно использовать в вычисляемых полях или непосредственно в запросе:
ВЫБОР
КОГДА МесяцСтрокой = "Январь" ТОГДА 1
КОГДА МесяцСтрокой = "Февраль" ТОГДА 2
...
ИНАЧЕ 12
КОНЕЦ
После создания такого поля (назовем его НомерМесяца), нам достаточно зайти в настройки отчета на закладку «Сортировка» и добавить туда это поле. Важно помнить, что это поле не обязательно выводить в сам отчет — оно может служить исключительно техническим целям. Однако этот метод считается менее гибким, так как он чувствителен к языку интерфейса и требует ручного обновления при изменении логики отчета.
Проанализируем ситуацию, когда данные выводятся не в таблицу, а в график. В СКД настройки сортировки для диаграмм живут отдельно от общих настроек. Чтобы график отображался корректно:
Без этой явной настройки точки на оси времени могут перемешаться, даже если в детальных записях все настроено верно.
Часто вместе с сортировкой возникает вопрос расчета отклонений (Дельта %). Для корректного расчета в СКД важно правильно прописать выражения для ресурсов, чтобы итоги считались не как сумма процентов, а как процент от сумм. Выясним причину, по которой обычное вычисляемое поле может «не отрабатывать»: оно не учитывает контекст группировки.
Рассмотрим правильное выражение для ресурса ДельтаПроцент:
ВЫБОР
КОГДА Сумма(ПродажиТекущий) <> 0
ТОГДА (Сумма(ПродажиТекущий) - Сумма(ПродажиПрошлый)) / Сумма(ПродажиТекущий) * 100
ИНАЧЕ 0
КОНЕЦ
Это выражение гарантирует, что на любом уровне группировки (будь то месяц или год) процент будет рассчитан математически верно. Для сортировки по такому показателю необходимо использовать вкладку «Сортировка» в настройках соответствующей группировки, так как ресурсы рассчитываются после выборки детальных записей.
Для повышения качества отчета полезно использовать роль Период в настройках набора данных. Если пометить поле ПериодМесяц соответствующей ролью и указать тип «Месяц», это активирует механизм «Дополнение периодов». Если в каком-то месяце продаж не было, СКД сама добавит эту строку в отчет с нулевыми значениями, что сохранит целостность временной шкалы и правильный порядок вывода данных.
Также рекомендуем использовать функцию ПРЕДСТАВЛЕНИЕ() в запросе. СКД умеет обрабатывать такие поля особым образом: для сортировки берется ссылка или дата, а для отображения — готовая строка, что зачастую решает проблему автоматически без лишних манипуляций.