В процессе разработки печатных форм, отчетов или при формировании текстовых сообщений для пользователей в 1С часто возникает необходимость вывести дату в красивом, удобочитаемом виде. Например, вместо стандартного числового представления или именительного падежа бизнес-требования могут запрашивать формулировки вида: "Документ подписан в октябре" или "Планируемая дата отгрузки: в августе".
Выясним, как решить эту задачу изящно и без ошибок. Мы разберем по шагам несколько подходов: от простых и надежных до продвинутых встроенных механизмов платформы 1С и Библиотеки Стандартных Подсистем (БСП).
Рассмотрим сначала самый простой способ, который часто приходит на ум начинающим разработчикам: взять название месяца в именительном падеже (например, с помощью функции Формат) и заменить его окончание на "е".
Проанализируем эту ситуацию подробнее. Если для слова "октябрь" замена окончания действительно даст корректное "октябре", то для других месяцев мы получим грубые грамматические ошибки:
Поэтому от простых текстовых манипуляций "в лоб" лучше сразу отказаться и перейти к профессиональным методам решения задачи.
Поскольку месяцев в году всегда ровно 12, их названия абсолютно статичны и никогда не меняются. Нам не нужно изобретать сложные лингвистические алгоритмы там, где можно применить простейшую таблицу соответствия. Этот способ работает абсолютно на любых версиях платформы 1С (начиная с 7.7 и заканчивая самыми современными релизами) и не создает никакой нагрузки на базу данных или внешние компоненты.
Рассмотрим пример реализации такой функции-конвертера:
Функция ПолучитьМесяцВПредложномПадеже(НомерМесяца) Экспорт
Месяцы = Новый Массив;
Месяцы.Добавить("январе");
Месяцы.Добавить("феврале");
Месяцы.Добавить("марте");
Месяцы.Добавить("апреле");
Месяцы.Добавить("мае");
Месяцы.Добавить("июне");
Месяцы.Добавить("июле");
Месяцы.Добавить("августе");
Месяцы.Добавить("сентябре");
Месяцы.Добавить("октябре");
Месяцы.Добавить("ноябре");
Месяцы.Добавить("декабре");
Возврат Месяцы[НомерМесяца - 1];
КонецФункции
Посмотрим на пример вызова этой функции в реальном коде. Передадим в нее номер месяца, извлеченный из нужной нам даты:
НашаДата = ТекущаяДата();
НомерМесяца = Месяц(НашаДата);
МесяцВПадеже = ПолучитьМесяцВПредложномПадеже(НомерМесяца);
Сообщить("Событие произошло в " + МесяцВПадеже); // Выведет, например: "Событие произошло в октябре"
Этот метод идеален своей простотой, независимостью и гарантирует 100% корректность результата.
Начиная с версии 8.3.13, разработчики 1С добавили в платформу мощный встроенный механизм склонения словосочетаний. Он позволяет склонять не только ФИО, но и любые существительные, включая названия месяцев.
Разберем по шагам, как использовать этот метод для нашей задачи:
Формат с маской ДФ='MMMM'.ПолучитьСклоненияСтроки, указав предложный падеж.Посмотрим, как выглядит программный код этого решения:
// Шаг 1: Получаем исходное название месяца (например, "Октябрь")
МесяцИменительный = Формат(ТекущаяДата(), "ДФ='MMMM'");
// Шаг 2: Задаем настройки склонения
ОписаниеСтроки = "Л=ru_RU; ПЛ=Мужской";
ФорматнаяСтрока = "ПД=Предложный";
// Шаг 3: Получаем массив склонений от платформы
МассивСклонений = ПолучитьСклоненияСтроки(МесяцИменительный, ОписаниеСтроки, ФорматнаяСтрока);
// Шаг 4: Вытаскиваем результат
Если МассивСклонений.Количество() > 0 Тогда
МесяцПредложный = МассивСклонений[0]; // На выходе получим "октябре"
Иначе
МесяцПредложный = МесяцИменительный;
КонецЕсли;
Важное примечание: данный метод отлично справляется и со сложными конструкциями. Если передать ему строку вида "Октябрь 2026", на выходе мы получим грамматически верное словосочетание "октябре 2026". Однако помните, что в некоторых серверных файловых базах или определенных релизах платформы (например, в ветке 8.3.23) вызов этого метода на сервере может вызывать ошибку прав доступа к временным папкам операционной системы. Обязательно тестируйте код в рабочей среде.
Если ваша конфигурация разработана на базе БСП (к ним относится абсолютное большинство современных типовых решений: УТ 11, ERP, ЗУП, Бухгалтерия предприятия), вам не нужно писать собственные алгоритмы склонения строк. Разработчики БСП уже добавили готовый функционал в систему.
В общем модуле СклонениеПредставленийОбъектов есть функция ПросклонятьПредставление. В качестве падежа для предложной формы нам необходимо передать числовое значение 6 (соответствует шестому падежу русского языка).
Проанализируем пример использования БСП:
// Шаг 1: Получаем название месяца
МесяцИменительный = Формат(ТекущаяДата(), "ДФ='MMMM'");
// Шаг 2: Обращаемся к общему модулю БСП
МесяцПредложный = СклонениеПредставленийОбъектов.ПросклонятьПредставление(МесяцИменительный, 6);
Этот способ хорош тем, что БСП самостоятельно заботится о кроссплатформенности и совместимости версий, автоматически переключаясь на доступный в вашей системе механизм склонения (встроенный платформенный или с использованием внешних компонент).
Мы рассмотрели три практических способа получения месяца в предложном падеже. Подведем итоги, когда какой способ лучше использовать: