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