При разработке отчетов в системе компоновки данных (СКД) часто возникает ситуация, когда колонки с названиями месяцев (например, «Январь», «Февраль», «Март») сортируются в алфавитном порядке вместо хронологического. В результате «Август» оказывается первым, а «Декабрь» — где-то в середине списка. Разберем детально, как заставить систему выводить месяцы в правильной последовательности, учитывая различные способы хранения данных.
Если в вашем источнике данных месяц представлен как строка, самым надежным способом будет создание вспомогательного поля НомерМесяца. Это позволит системе опираться на числа при сортировке, сохраняя строковое представление в заголовках колонок.
Проанализируем ситуацию, когда месяц выбирается пользователем как строка. В тексте запроса мы можем использовать конструкцию ВЫБОР, чтобы сопоставить название месяца с его порядковым номером:
ВЫБРАТЬ
Регистрация.Дата,
Регистрация.Клиент,
Регистрация.Сумма,
Регистрация.Месяц КАК Месяц,
ВЫБОР Регистрация.Месяц
КОГДА "Январь" ТОГДА 1
КОГДА "Февраль" ТОГДА 2
КОГДА "Март" ТОГДА 3
КОГДА "Апрель" ТОГДА 4
КОГДА "Май" ТОГДА 5
КОГДА "Июнь" ТОГДА 6
КОГДА "Июль" ТОГДА 7
КОГДА "Август" ТОГДА 8
КОГДА "Сентябрь" ТОГДА 9
КОГДА "Октябрь" ТОГДА 10
КОГДА "Ноябрь" ТОГДА 11
КОГДА "Декабрь" ТОГДА 12
КОНЕЦ КАК НомерМесяца
ИЗ
Документ.Регистрация КАК Регистрация
После добавления этого поля в запрос, выполним следующие настройки в СКД:
Месяц.НомерМесяца по возрастанию.Чтобы не загромождать настройки каждого варианта отчета сортировкой, мы можем прописать логику упорядочивания непосредственно в определении поля набора данных. Рассмотрим, как это сделать правильно.
В конструкторе схемы компоновки данных перейдем на закладку Наборы данных. Найдем наше поле Месяц. В колонке Выражение упорядочивания мы можем прописать логику, которая будет автоматически применяться везде, где используется это поле. Это может быть как ссылка на другое поле (например, тот же НомерМесяца), так и само выражение ВЫБОР...КОНЕЦ.
Важный нюанс: при использовании числовых значений для сортировки убедитесь, что в колонке Тип значения для поля сортировки указано Число. Если оставить тип неопределенным или строковым, то значение «10» при сортировке может оказаться раньше, чем «2», так как система будет сравнивать их посимвольно.
Если данные в вашем запросе привязаны к реальной дате (поле Дата), то это самый правильный и гибкий путь. Выясним, как использовать возможности платформы для автоматизации вывода названий.
В запросе получим начало месяца:
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(Регистрация.Дата, МЕСЯЦ) КАК МесяцПорядок,
Регистрация.Сумма
ИЗ
Документ.Регистрация КАК Регистрация
Теперь в СКД для поля МесяцПорядок на закладке Наборы данных в колонке Оформление установим параметр Формат. В строке формата укажем ДФ=ММММ. Это заставит систему выводить полную дату как название месяца («Январь», «Февраль» и т.д.).
Преимущество этого метода в том, что поле остается типом Дата. СКД по умолчанию сортирует даты хронологически, поэтому вам даже не придется настраивать сортировку вручную. Кроме того, это решает проблему перехода через год.
Рассмотрим ситуацию, когда отчет строится за длительный период, например, с ноября 2023 по март 2024 года. Если мы будем сортировать просто по номеру месяца (1–12), то январь 2024 года окажется в самом начале отчета, перед ноябрем 2023 года. Это логическая ошибка.
Чтобы избежать этого, проанализируем использование составного ключа сортировки. В выражении упорядочивания или в дополнительном поле лучше использовать формулу:
ГОД(Дата) * 100 + МЕСЯЦ(Дата)
В таком случае ноябрь 2023 года получит индекс 202311, а январь 2024 — 202401. При числовой сортировке эти значения выстроятся в единственно верном хронологическом порядке.
Использование жестких строковых конструкций типа КОГДА "Январь" ТОГДА 1 имеет один существенный недостаток: если пользователь сменит язык интерфейса на английский, условие перестанет работать. Если ваш отчет предполагает использование в многоязычной среде, постарайтесь избегать сравнения строк. В таких случаях лучше использовать функции работы с датами МЕСЯЦ(ДатаДокумента) или хранить в базе данных ссылки на предопределенные элементы перечислений, которые уже имеют внутренний порядок.