К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как просклонять месяц в 1С: рабочие способы и примеры кода

Как просклонять название месяца в 1С: функция ПолучитьСклоненияСтроки, регистр «Склонения», примеры кода, проверка результата и типичные ошибки разработчиков.

Задача вывести название месяца в нужном падеже возникает в 1С чаще, чем кажется: при формировании печатных форм («от 5 марта», «до конца сентября»), в текстах договоров, в автоматических уведомлениях и в подписях отчётов. Если просто подставить строку вида «март» вместо «марта», документ выглядит непрофессионально, а в юридически значимых формах грамматическая ошибка может стать поводом для претензий.

В типовых конфигурациях на базе Библиотеки стандартных подсистем (БСП) для склонения слов есть готовый механизм — функция ПолучитьСклоненияСтроки общего модуля СклонениеПредставленийОбъектов и регистр сведений «Склонения представлений объектов», где хранятся уже рассчитанные формы. Для месяцев существует и более простой путь: функция НСтр с форматной строкой даты или собственная таблица соответствий, которая работает даже в самописных конфигурациях без БСП.

Когда месяц нужно склонять, а когда нет

Название месяца в именительном падеже корректно в заголовках отчётов («Отчёт за март»), в колонках таблиц и в отборах. Родительный падеж обязателен в датах вида «5 марта», «с 1 по 30 апреля», «в течение июня». Предложный падеж встречается в формулировках «в марте», «по итогам сентября».

Ошибка возникает, когда разработчик берёт представление месяца из функции Месяц() или из периодического реквизита и подставляет его в произвольный текст. Функция Месяц() возвращает число от 1 до 12, а преобразование в строку через Формат() без явного указания падежа даёт именительную форму. Поэтому перед выводом текста определите, какой падеж требует фраза, и только потом выбирайте способ получения строки.

Способ 1. Родительный падеж через функцию Формат

Самый быстрый вариант для дат — длинный формат даты. Вызов Формат(ТекущаяДатаСеанса(), "ДЛФ=DD") возвращает строку вида «5 марта», где месяц уже стоит в родительном падеже. Если нужен только месяц без числа, строку можно разобрать: отделить часть после первого пробела.

ДлиннаяДата = Формат(ДатаДокумента, "ДЛФ=DD");

// "5 марта"

ПозицияПробела = СтрНайти(ДлиннаяДата, " ");

МесяцРодительный = Сред(ДлиннаяДата, ПозицияПробела + 1);

// "марта"

Ограничение способа очевидно: доступен только родительный падеж, привязанный к конкретной дате. Для фраз «в марте» или «с сентябрём» (творительный падеж используется редко, но встречается в автоматически генерируемых текстах) этот метод не подходит. Кроме того, результат зависит от региональных настроек сеанса: при другом языке интерфейса строка будет на другом языке.

Способ 2. Склонение через механизм БСП

В конфигурациях на базе БСП (1С:Бухгалтерия, 1С:Управление торговлей, 1С:ERP, 1С:Зарплата и управление персоналом) есть общий модуль СклонениеПредставленийОбъектов. Его функция ПолучитьСклоненияСтроки принимает строку в именительном падеже и возвращает структуру или массив с формами всех шести падежей.

Формы = СклонениеПредставленийОбъектов.ПолучитьСклоненияСтроки("сентябрь");

// Формы содержит: именительный, родительный, дательный,

// винительный, творительный, предложный

Механизм работает так: при первом обращении строка склоняется программным алгоритмом, результат записывается в регистр сведений «Склонения представлений объектов», и дальнейшие обращения берут готовые формы из регистра без повторного расчёта. Это снижает нагрузку при массовом формировании документов.

Месяцы склоняются корректно, потому что это однословные существительные мужского рода с регулярным склонением. Трудности алгоритм испытывает с аббревиатурами, цифрами и составными фразами — к названиям месяцев это не относится.

Порядок действий при использовании БСП
  1. 1
    Убедитесь, что в конфигурации есть общий модуль СклонениеПредставленийОбъектов
  2. 2
    Вызовите ПолучитьСклоненияСтроки с названием месяца в именительном падеже
  3. 3
    Извлеките из результата нужную падежную форму
  4. 4
    Подставьте форму в шаблон текста печатной формы или сообщения
  5. 5
    Проверьте результат на месяцах с разными окончаниями: март, июнь, сентябрь

Способ 3. Собственное соответствие месяцев и падежей

В самописной конфигурации без БСП подключать тяжёлый механизм склонения ради двенадцати слов нерационально. Месяцев всего двенадцать, падежей шесть — это фиксированный набор из 72 строк, который проще задать один раз в коде или хранить в макете.

Функция МесяцВПадеже(НомерМесяца, Падеж) Экспорт

Месяцы = Новый Соответствие;

Если Падеж = "Родительный" Тогда

Месяцы.Вставить(1, "января");

Месяцы.Вставить(2, "февраля");

Месяцы.Вставить(3, "марта");

// ... и так далее до 12

ИначеЕсли Падеж = "Предложный" Тогда

Месяцы.Вставить(1, "январе");

Месяцы.Вставить(2, "феврале");

Месяцы.Вставить(3, "марте");

// ...

КонецЕсли;

Возврат Месяцы[НомерМесяца];

КонецФункции

Плюс подхода — полная предсказуемость: формы зафиксированы, не зависят от версии платформы и алгоритмов склонения. Минус — при добавлении другого языка таблицу придётся дублировать. Для многоязычных решений лучше хранить формы в макете типа «Табличный документ» или в строковых константах с разбивкой по языкам.

Сравнение способов

Формат с ДЛФ=DD

Подходит для дат в родительном падеже. Не даёт других падежей и зависит от языка сеанса.

БСП: ПолучитьСклоненияСтроки

Универсальное решение для всех падежей и любых слов. Требует наличия БСП в конфигурации.

Собственное соответствие

Надёжно и быстро для месяцев. Требует ручного ведения списка при добавлении языков.

Как проверить результат склонения

После внедрения любого из способов прогоните проверку минимум на трёх группах месяцев: на «марте» и «августе» (короткие формы), на «июне» и «июле» (мягкий знак в окончаниях меняется на «е» в предложном падеже), на «сентябре», «октябре», «ноябре», «декабре» (однотипное склонение, но частый источник опечаток в ручных таблицах).

Контрольный признак корректной работы: во всех шести падежах основа слова сохраняется, меняется только окончание. Если в предложном падеже получилось «в июнь» вместо «в июне» — используется именительная форма, значит, склонение не сработало или выбран не тот элемент структуры.

Контрольные точки

Как проверить результат

Дата в печатной форме
Норма

«от 5 марта» — месяц в родительном падеже

Тревожный признак

«от 5 март» — именительный падеж вместо родительского

Фраза с предлогом «в»
Норма

«в июне», «в сентябре»

Тревожный признак

«в июнь», «в сентябрь»

Все 12 месяцев в таблице
Норма

Каждая форма отличается корректным окончанием

Тревожный признак

Часть месяцев повторяет именительный падеж

Типичные ошибки и их последствия

Самая распространённая ошибка — подстановка числового представления месяца в текст: «срок до 03» вместо «срок до марта». Такое происходит, когда разработчик использует Месяц(Дата) и забывает преобразовать число в слово. Вторая частая ошибка — жёсткая конкатенация строк вида «от » + Месяц + « года», где месяц остаётся в именительном падеже.

Третья группа ошибок связана с механизмом БСП: вызов функции склонения в цикле при массовой печати без учёта того, что первый вызов для каждой новой строки пишет данные в регистр. На больших объёмах это даёт лишние транзакции. Решение — склонять названия месяцев один раз при инициализации отчёта и переиспользовать результат.

Типичные ошибки
01
Подстановка Месяц(Дата) в текст — в документе появляется число вместо названия месяца
02
Использование именительного падежа после предлогов «от», «до», «с» — грамматически неверные формулировки в договорах
03
Вызов склонения внутри цикла печати — лишние записи в регистр и замедление формирования
04
Зависимость от ДЛФ=DD без учёта языка сеанса — месяц выводится не на языке документа

Ограничения и границы самостоятельной доработки

Изменение общих модулей типовой конфигурации снимает её с полной поддержки и усложняет обновления. Безопасный путь — выносить функции склонения в собственный общий модуль расширения конфигурации или в отдельный модуль с префиксом доработок. Прямое редактирование модулей БСП допустимо только при полном понимании последствий и с фиксацией изменений для будущих обновлений.

Если склонение нужно не только для месяцев, но и для ФИО сотрудников, должностей и подразделений, не создавайте параллельные механизмы: используйте единый модуль БСП, который уже умеет определять пол и корректно обрабатывать составные фразы. Дублирование логики приводит к расхождениям в одних и тех же документах.

FAQ

Можно ли просклонять месяц без программирования, в макете печатной формы?

Нет, макет хранит статичный текст и параметры, но не выполняет склонение. Падежную форму нужно вычислить в коде и передать в макет как готовый параметр. Исключение — если в макете заранее прописаны все варианты, а код выбирает нужный, что фактически повторяет способ с собственным соответствием.

Работает ли ПолучитьСклоненияСтроки в файловой базе?

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

Что делать, если в регистре «Склонения представлений объектов» оказалась неверная форма?

Найдите запись по исходной строке и либо исправьте форму вручную, либо удалите запись — при следующем обращении склонение будет рассчитано заново. Перед массовой чисткой регистра сделайте резервную копию данных.

Как получить месяц с заглавной буквы после склонения?

Функции склонения возвращают строку в том регистре, в котором передана исходная форма. Передайте «Март» — получите «Марта». Если исходное слово в нижнем регистре, примените к результату ТРег() или замените первый символ через ВРег(Лев(Строка, 1)).

Нужно ли склонять месяцы в англоязычных документах?

В английском языке названия месяцев не склоняются, падежные формы отсутствуют. Достаточно вывести месяц в именительной форме, например через Формат с английским языком локализации. Механизм склонений БСП ориентирован на русский язык.

Где хранить таблицу падежных форм при многоязычной конфигурации?

Практичный вариант — макет табличного документа с колонками «Язык», «Номер месяца», «Падеж», «Форма» и функция-обёртка, читающая нужную ячейку. Так формы может корректировать редактор без изменения кода, а механизм остаётся единым для всех языков.

Итог

Что важно запомнить

Для дат в родительном падеже достаточно Формат с ДЛФ=DD, для всех падежей в типовых конфигурациях — СклонениеПредставленийОбъектов.ПолучитьСклоненияСтроки, в самописных решениях — собственное соответствие из 12 месяцев. Проверяйте результат на «июне», «марте» и «сентябре» и не редактируйте типовые модули напрямую.