Как склонить дату и название месяца в предложный падеж в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки печатных форм, отчетов или при формировании текстовых сообщений для пользователей в 1С часто возникает необходимость вывести дату в красивом, удобочитаемом виде. Например, вместо стандартного числового представления или именительного падежа бизнес-требования могут запрашивать формулировки вида: "Документ подписан в октябре" или "Планируемая дата отгрузки: в августе".

Выясним, как решить эту задачу изящно и без ошибок. Мы разберем по шагам несколько подходов: от простых и надежных до продвинутых встроенных механизмов платформы 1С и Библиотеки Стандартных Подсистем (БСП).

Почему наивный способ замены окончаний не работает?

Рассмотрим сначала самый простой способ, который часто приходит на ум начинающим разработчикам: взять название месяца в именительном падеже (например, с помощью функции Формат) и заменить его окончание на "е".

Проанализируем эту ситуацию подробнее. Если для слова "октябрь" замена окончания действительно даст корректное "октябре", то для других месяцев мы получим грубые грамматические ошибки:

  1. Месяцы "март" и "август" при замене последней буквы на "е" превратятся в "маре" и "авгусе" (вместо корректных "марте" и "августе").
  2. Месяц "февраль" при простой замене может превратиться в некорректное "февралье" (вместо "феврале").

Поэтому от простых текстовых манипуляций "в лоб" лучше сразу отказаться и перейти к профессиональным методам решения задачи.

Решение 1. Использование статического массива (Быстро и надежно)

Поскольку месяцев в году всегда ровно 12, их названия абсолютно статичны и никогда не меняются. Нам не нужно изобретать сложные лингвистические алгоритмы там, где можно применить простейшую таблицу соответствия. Этот способ работает абсолютно на любых версиях платформы 1С (начиная с 7.7 и заканчивая самыми современными релизами) и не создает никакой нагрузки на базу данных или внешние компоненты.

Рассмотрим пример реализации такой функции-конвертера:


Функция ПолучитьМесяцВПредложномПадеже(НомерМесяца) Экспорт
    Месяцы = Новый Массив;
    Месяцы.Добавить("январе");
    Месяцы.Добавить("феврале");
    Месяцы.Добавить("марте");
    Месяцы.Добавить("апреле");
    Месяцы.Добавить("мае");
    Месяцы.Добавить("июне");
    Месяцы.Добавить("июле");
    Месяцы.Добавить("августе");
    Месяцы.Добавить("сентябре");
    Месяцы.Добавить("октябре");
    Месяцы.Добавить("ноябре");
    Месяцы.Добавить("декабре");
    
    Возврат Месяцы[НомерМесяца - 1];
КонецФункции

Посмотрим на пример вызова этой функции в реальном коде. Передадим в нее номер месяца, извлеченный из нужной нам даты:


НашаДата = ТекущаяДата();
НомерМесяца = Месяц(НашаДата);
МесяцВПадеже = ПолучитьМесяцВПредложномПадеже(НомерМесяца);

Сообщить("Событие произошло в " + МесяцВПадеже); // Выведет, например: "Событие произошло в октябре"

Этот метод идеален своей простотой, независимостью и гарантирует 100% корректность результата.

Решение 2. Встроенный метод платформы ПолучитьСклоненияСтроки (для 1С 8.3.13 и выше)

Начиная с версии 8.3.13, разработчики 1С добавили в платформу мощный встроенный механизм склонения словосочетаний. Он позволяет склонять не только ФИО, но и любые существительные, включая названия месяцев.

Разберем по шагам, как использовать этот метод для нашей задачи:

  1. Сначала получим название месяца в именительном падеже с помощью стандартной функции Формат с маской ДФ='MMMM'.
  2. Настроим параметры склонения, указав мужской род (так как слово "месяц" мужского рода) и русскую локаль.
  3. Передадим параметры в метод ПолучитьСклоненияСтроки, указав предложный падеж.

Посмотрим, как выглядит программный код этого решения:


// Шаг 1: Получаем исходное название месяца (например, "Октябрь")
МесяцИменительный = Формат(ТекущаяДата(), "ДФ='MMMM'"); 

// Шаг 2: Задаем настройки склонения
ОписаниеСтроки = "Л=ru_RU; ПЛ=Мужской"; 
ФорматнаяСтрока = "ПД=Предложный";

// Шаг 3: Получаем массив склонений от платформы
МассивСклонений = ПолучитьСклоненияСтроки(МесяцИменительный, ОписаниеСтроки, ФорматнаяСтрока);

// Шаг 4: Вытаскиваем результат
Если МассивСклонений.Количество() > 0 Тогда
    МесяцПредложный = МассивСклонений[0]; // На выходе получим "октябре"
Иначе
    МесяцПредложный = МесяцИменительный;
КонецЕсли;

Важное примечание: данный метод отлично справляется и со сложными конструкциями. Если передать ему строку вида "Октябрь 2026", на выходе мы получим грамматически верное словосочетание "октябре 2026". Однако помните, что в некоторых серверных файловых базах или определенных релизах платформы (например, в ветке 8.3.23) вызов этого метода на сервере может вызывать ошибку прав доступа к временным папкам операционной системы. Обязательно тестируйте код в рабочей среде.

Решение 3. Использование функций Библиотеки Стандартных Подсистем (БСП)

Если ваша конфигурация разработана на базе БСП (к ним относится абсолютное большинство современных типовых решений: УТ 11, ERP, ЗУП, Бухгалтерия предприятия), вам не нужно писать собственные алгоритмы склонения строк. Разработчики БСП уже добавили готовый функционал в систему.

В общем модуле СклонениеПредставленийОбъектов есть функция ПросклонятьПредставление. В качестве падежа для предложной формы нам необходимо передать числовое значение 6 (соответствует шестому падежу русского языка).

Проанализируем пример использования БСП:


// Шаг 1: Получаем название месяца
МесяцИменительный = Формат(ТекущаяДата(), "ДФ='MMMM'");

// Шаг 2: Обращаемся к общему модулю БСП
МесяцПредложный = СклонениеПредставленийОбъектов.ПросклонятьПредставление(МесяцИменительный, 6);

Этот способ хорош тем, что БСП самостоятельно заботится о кроссплатформенности и совместимости версий, автоматически переключаясь на доступный в вашей системе механизм склонения (встроенный платформенный или с использованием внешних компонент).

Подведем итоги

Мы рассмотрели три практических способа получения месяца в предложном падеже. Подведем итоги, когда какой способ лучше использовать:

← На главную