Как правильно настроить сортировку по месяцам в отчете СКД?

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

При разработке отчетов на базе Системы компоновки данных (СКД), особенно таких как «Сравнение продаж», разработчики часто сталкиваются с проблемой некорректной сортировки периодов. Если месяц представлен в виде строки (например, «Январь», «Февраль»), система сортирует его по алфавиту, из-за чего «Август» оказывается в начале списка, а «Январь» — в конце. Рассмотрим детально, как решить эту задачу несколькими способами, от простых настроек оформления до тонкой настройки наборов данных.

Причина возникновения проблемы

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

Способ 1. Использование типа Дата и условного оформления (Рекомендуемый)

Проанализируем самый эффективный и «чистый» метод. Вместо того чтобы превращать дату в строку на уровне запроса, нам следует оставить поле с типом Дата (приведенное к началу месяца). Рассмотрим пошагово, как это реализовать:

  1. В запросе выбираем поле периода, приведенное к началу месяца. Обычно это функция НАЧАЛОПЕРИОДА(Продажи.Период, МЕСЯЦ). Назовем это поле ПериодМесяц.
  2. Перейдем на закладку «Наборы данных» в конструкторе СКД.
  3. Для поля ПериодМесяц найдем колонку «Оформление».
  4. В параметрах оформления установим «Формат». Используем строку формата: ДФ='MMMM yyyy'.

Почему это работает: В этом случае в данных отчета хранится полноценная дата (например, 01.01.2023). СКД автоматически сортирует даты хронологически. Однако благодаря заданному формату пользователь увидит в ячейке привычное название: «Январь 2023». Это исключает необходимость в громоздких конструкциях ВЫБОР КОГДА и дополнительных технических полях.

Способ 2. Использование свойства «Выражение упорядочивания»

Если по каким-то причинам нам крайне необходимо выводить именно строковое поле, в СКД предусмотрен механизм разделения данных для отображения и данных для сортировки. Разберем, как настроить свойство Выражение упорядочивания:

На закладке «Наборы данных» для нашего строкового поля «Месяц» в соответствующей колонке выберем поле, которое содержит реальную дату или числовой номер месяца. Например, если у нас в наборе данных есть скрытое поле ПериодМесяц (типа Дата), мы указываем его в качестве выражения упорядочивания для текстового поля. Теперь, когда пользователь нажмет кнопку сортировки по колонке «Месяц», система «под капотом» будет использовать значения из поля даты.

Способ 3. Создание технического поля через «ВЫБОР КОГДА»

Иногда разработчики решают задачу «в лоб», создавая дополнительное числовое поле для сортировки. Посмотрим на пример кода, который можно использовать в вычисляемых полях или непосредственно в запросе:


ВЫБОР 
    КОГДА МесяцСтрокой = "Январь" ТОГДА 1 
    КОГДА МесяцСтрокой = "Февраль" ТОГДА 2 
    ...
    ИНАЧЕ 12 
КОНЕЦ

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

Настройка сортировки в диаграммах

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

  1. Выделим в структуре отчета элемент «Диаграмма».
  2. Перейдем в настройки этой конкретной группировки (обычно это точки диаграммы).
  3. На вкладке «Сортировка» добавим наше поле периода или номер месяца.

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

Расчет сложных показателей: Дельта в процентах

Часто вместе с сортировкой возникает вопрос расчета отклонений (Дельта %). Для корректного расчета в СКД важно правильно прописать выражения для ресурсов, чтобы итоги считались не как сумма процентов, а как процент от сумм. Выясним причину, по которой обычное вычисляемое поле может «не отрабатывать»: оно не учитывает контекст группировки.

Рассмотрим правильное выражение для ресурса ДельтаПроцент:


ВЫБОР 
    КОГДА Сумма(ПродажиТекущий) <> 0 
    ТОГДА (Сумма(ПродажиТекущий) - Сумма(ПродажиПрошлый)) / Сумма(ПродажиТекущий) * 100 
    ИНАЧЕ 0 
КОНЕЦ

Это выражение гарантирует, что на любом уровне группировки (будь то месяц или год) процент будет рассчитан математически верно. Для сортировки по такому показателю необходимо использовать вкладку «Сортировка» в настройках соответствующей группировки, так как ресурсы рассчитываются после выборки детальных записей.

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

Для повышения качества отчета полезно использовать роль Период в настройках набора данных. Если пометить поле ПериодМесяц соответствующей ролью и указать тип «Месяц», это активирует механизм «Дополнение периодов». Если в каком-то месяце продаж не было, СКД сама добавит эту строку в отчет с нулевыми значениями, что сохранит целостность временной шкалы и правильный порядок вывода данных.

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

← На главную