При разработке отчетов на базе Системы компоновки данных (СКД) часто возникает задача кастомизации представления дат. Например, вместо полной даты (день, месяц, год, время) пользователю бывает удобнее видеть только название месяца. Это делает отчет более читаемым и компактным. В данной статье мы разберем несколько способов реализации этой задачи, проанализируем нюансы сортировки и рассмотрим дополнительные возможности оформления.
Это самый простой и правильный путь, если вам нужно изменить только визуальное представление данных, не меняя структуру самого запроса. Рассмотрим по шагам, как это сделать:
Регистратор.Дата или просто Дата).Для отображения месяца используются следующие коды формата ДФ (Дата-Формат):
ДФ=М — выведет номер месяца без лидирующего нуля (1, 2, ..., 12).ДФ=ММ — выведет номер месяца с лидирующим нулем (01, 02, ..., 12).ДФ=МММ — выведет краткое название месяца (янв., февр. и т.д.).ДФ=ММММ — выведет полное название месяца (Январь, Февраль и т.д.).Важный нюанс: если вы укажете просто ММММ, система применит настройки по умолчанию. Чтобы гарантировать корректность, лучше писать полную конструкцию: ДФ=ММММ.
Иногда требуется получить месяц не как оформление, а как отдельное данное для расчетов или группировок. В этом случае мы можем воспользоваться функциями языка запросов 1С. Проанализируем два варианта:
Вариант А: Функция МЕСЯЦ(). Эта функция возвращает число от 1 до 12. Рассмотрим пример кода:
ВЫБРАТЬ
МЕСЯЦ(Продажи.Период) КАК НомерМесяца,
Продажи.СуммаОборот КАК Сумма
ИЗ
РегистрНакопления.Продажи.Обороты КАК Продажи
Этот метод хорош для расчетов, но для вывода в отчет он потребует дополнительного преобразования числа в название.
Вариант Б: Функция НАЧАЛОПЕРИОДА(). Это более гибкий метод для СКД. Мы получаем дату, приведенную к началу месяца, и к ней применяем оформление ДФ=ММММ. Рассмотрим ситуацию: если мы просто возьмем номер месяца, то данные за январь 2023 и январь 2024 года сольются в одну строку. Использование начала периода сохраняет привязку к году:
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(Продажи.Период, МЕСЯЦ) КАК МесяцДляОтчета,
Продажи.СуммаОборот КАК Сумма
ИЗ
РегистрНакопления.Продажи.Обороты КАК Продажи
Если мы не хотим менять основной набор данных, мы можем добавить Вычисляемое поле на соответствующей вкладке СКД. Это позволит нам оставить исходную дату нетронутой, но добавить колонку с названием месяца.
В выражении вычисляемого поля достаточно указать путь к данным (например, Дата), а в колонке Оформление задать уже знакомый нам формат ДФ=ММММ.
Разберем типичную ошибку: пользователь устанавливает формат ММММ, и месяцы в отчете начинают выстраиваться по алфавиту: Август, Апрель, Декабрь... Это происходит потому, что СКД сортирует строковое представление. Чтобы этого избежать, выполним следующие действия:
НАЧАЛОПЕРИОДА(Дата, "МЕСЯЦ").Таким образом, визуально пользователь будет видеть "Январь", "Февраль", но система будет знать, что "Январь" идет раньше "Февраля", так как сравнивает даты, а не строки.
Выясним, как сделать вывод еще более профессиональным, используя продвинутые параметры форматной строки и функций.
Управление регистром: По умолчанию названия месяцев могут выводиться со строчной (маленькой) буквы. Если нам нужно всегда начинать название с заглавной, в выражении поля (на вкладке Наборы данных или Вычисляемые поля) можно прописать следующую конструкцию:
ВРег(Лев(Формат(Дата, "ДФ=ММММ"), 1)) + Сред(Формат(Дата, "ДФ=ММММ"), 2)
Здесь мы берем первую букву, переводим ее в верхний регистр функцией ВРег и соединяем с остальной частью строки.
Локализация: Если отчет должен выводить названия месяцев на определенном языке (например, на английском), независимо от настроек операционной системы, в форматную строку добавляется параметр Л:
ДФ='ММММ'; Л=en_US — результат: "January".ДФ='ММММ'; Л=ru_RU — результат: "Январь".Роли полей: Для корректной работы иерархии периодов в СКД, рекомендуется в колонке Роль для поля месяца указать тип Дополнительный период и выбрать уровень Месяц. Это поможет системе правильно обрабатывать группировки и дополнять периоды, если в каком-то месяце не было движений. Для практической реализации группировки периодов можно использовать пример настройки шапки отчета по месяцам и неделям в СКД.
Подводя итог, можно сказать, что наиболее эффективным и гибким методом является сочетание функции НАЧАЛОПЕРИОДА в запросе и настройки Формата в оформлении компоновки данных. Это обеспечивает корректную сортировку, сохранение данных о годе и эстетичный внешний вид отчета.