При разработке печатных форм, отчетов или интерфейсных решений в системе «1С:Предприятие» часто возникает задача преобразовать стандартную дату (например, 15.10.2018) в читабельный текстовый формат вида «Октябрь 2018». Несмотря на кажущуюся простоту, начинающие разработчики часто сталкиваются с вопросами: можно ли сделать это прямо в запросе, как настроить автоматическое отображение в макете и как избежать написания месяца со строчной буквы.
В этой статье мы подробно разберем все доступные методы решения данной задачи, проанализируем их преимущества и выберем оптимальный подход для каждой конкретной ситуации.
Если ваша задача заключается исключительно в том, чтобы вывести красивую дату в печатной форме (макете), то писать программный код или изменять запрос вовсе не обязательно. Платформа 1С обладает мощным встроенным механизмом форматирования данных в ячейках.
Рассмотрим по шагам, как это настроить:
ДФ='MMMM yyyy'.Здесь MMMM означает полное название месяца на языке локализации, а yyyy — четырехзначный год. После применения этих настроек любое значение типа Дата, переданное в эту ячейку, будет автоматически преобразовываться в нужный нам вид. Для комплексной работы с макетами документов без доработки конфигурации можно использовать инструкцию по редактированию печатных форм в 1С.
Бывают случаи, когда строковое представление месяца нужно получить непосредственно в модуле (например, для формирования заголовка окна или сложного текстового описания). Для этого используется встроенная функция Формат().
Разберем пример кода:
ДатаСобытия = Дата(2018, 10, 5);
ТекстМесяцГод = Формат(ДатаСобытия, "ДФ='MMMM yyyy'");
// Результат: "октябрь 2018"
Важно помнить, что функция Формат() по умолчанию возвращает название месяца со строчной (маленькой) буквы. Если вам требуется вывести название с заглавной буквы (например, для заголовка документа), необходимо выполнить дополнительную обработку строки.
Проанализируем ситуацию и напишем универсальную функцию для заглавной буквы:
РезультатФормата = Формат(ДатаСобытия, "ДФ='MMMM yyyy'");
Если ЗначениеЗаполнено(РезультатФормата) Тогда
ТекстСЗаглавной = ТРег(Лев(РезультатФормата, 1)) + Сред(РезультатФормата, 2);
КонецЕсли;
// Результат: "Октябрь 2018"
В этом примере мы используем функцию ТРег() для преобразования первой буквы в верхний регистр и соединяем её с остальной частью строки, полученной через Сред().
Иногда разработчики пытаются использовать функцию Формат() прямо в тексте запроса. Сразу оговоримся: функция Формат в языке запросов 1С не поддерживается. Если вам критически важно получить название месяца именно в результате выполнения запроса (например, для группировки данных), придется использовать конструкцию ВЫБОР.
Посмотрим на пример реализации в запросе:
ВЫБРАТЬ
ВЫБОР
КОГДА МЕСЯЦ(Документ.Дата) = 1 ТОГДА "Январь"
КОГДА МЕСЯЦ(Документ.Дата) = 2 ТОГДА "Февраль"
КОГДА МЕСЯЦ(Документ.Дата) = 3 ТОГДА "Март"
КОГДА МЕСЯЦ(Документ.Дата) = 4 ТОГДА "Апрель"
КОГДА МЕСЯЦ(Документ.Дата) = 5 ТОГДА "Май"
КОГДА МЕСЯЦ(Документ.Дата) = 6 ТОГДА "Июнь"
КОГДА МЕСЯЦ(Документ.Дата) = 7 ТОГДА "Июль"
КОГДА МЕСЯЦ(Документ.Дата) = 8 ТОГДА "Август"
КОГДА МЕСЯЦ(Документ.Дата) = 9 ТОГДА "Сентябрь"
КОГДА МЕСЯЦ(Документ.Дата) = 10 ТОГДА "Октябрь"
КОГДА МЕСЯЦ(Документ.Дата) = 11 ТОГДА "Ноябрь"
КОГДА МЕСЯЦ(Документ.Дата) = 12 ТОГДА "Декабрь"
КОНЕЦ + " " + СТРОКА(ГОД(Документ.Дата)) КАК МесяцГодТекст
ИЗ
Документ.РеализацияТоваровУслуг КАК Документ
Данный метод довольно громоздкий и менее гибкий с точки зрения локализации (если программу запустят на английском языке, запрос все равно вернет русские названия), поэтому его стоит применять только тогда, когда постобработка результата запроса невозможна.
При разработке отчетов на базе СКД, программисту предоставляется еще больше гибкости. Вы можете не менять запрос, а задать формат вывода прямо в настройках поля компоновки.
Разберем по шагам:
ДФ='MMMM yyyy'.Также в СКД можно использовать «Вычисляемые поля». Это позволяет вызвать функцию общего модуля или встроенную функцию Формат() для создания отдельного строкового поля, которое будет содержать название месяца. Для вывода и оформления периодических группировок в отчете можно использовать пример формирования шапки отчета по неделям и месяцам в СКД.
Если вы работаете в современной типовой конфигурации (например, 1С:ERP, УТ 11 или БП 3.0), в вашем распоряжении есть готовые инструменты из состава БСП. В модуле РаботаСДатами часто присутствуют функции для формирования представлений периодов.
Использование готовых функций БСП предпочтительно, так как они учитывают множество нюансов: от склонения названий месяцев до часовых поясов пользователя.
Пример вызова функции (название может варьироваться от версии БСП):
ПредставлениеПериода = РаботаСДатами.ПредставлениеПериода(НачалоМесяца(Дата), КонецМесяца(Дата), "ФП=Истина");
Такой подход позволяет автоматически получать строки вида «Октябрь 2018 г.», следуя стандартам интерфейса, принятым в решениях 1С.
Выясним важную причину, по которой иногда формат MMMM работает не так, как ожидалось. В некоторых системных окружениях использование «M» может приводить к выводу месяца в родительном падеже (например, «Октября»), если платформа пытается интерпретировать это как часть полной даты.
Профессиональный совет: Если вам нужно гарантированно получить месяц в именительном падеже («Октябрь»), используйте в форматной строке символ L вместо M:
// LLLL — формат для самостоятельного (stand-alone) написания месяца в именительном падеже
Текст = Формат(ТекущаяДата(), "ДФ='LLLL yyyy'");
Буква L (от английского «Stand-alone month») специально предназначена для ситуаций, когда месяц выводится отдельно от дня месяца, что предотвращает его нежелательное склонение.
Мы рассмотрели несколько способов вывода месяца прописью. Подведем итог:
Выбор метода зависит от конкретной архитектурной задачи, но знание всех вариантов позволит вам писать более гибкий и чистый код.