Разработка и Конфигурация · 10 мин
Как просклонять месяц в 1С: рабочие способы и примеры кода
Как просклонять название месяца в 1С: функция ПолучитьСклоненияСтроки, регистр «Склонения», примеры кода, проверка результата и типичные ошибки разработчиков.
Задача вывести название месяца в нужном падеже возникает в 1С чаще, чем кажется: при формировании печатных форм («от 5 марта», «до конца сентября»), в текстах договоров, в автоматических уведомлениях и в подписях отчётов. Если просто подставить строку вида «март» вместо «марта», документ выглядит непрофессионально, а в юридически значимых формах грамматическая ошибка может стать поводом для претензий.
В типовых конфигурациях на базе Библиотеки стандартных подсистем (БСП) для склонения слов есть готовый механизм — функция ПолучитьСклоненияСтроки общего модуля СклонениеПредставленийОбъектов и регистр сведений «Склонения представлений объектов», где хранятся уже рассчитанные формы. Для месяцев существует и более простой путь: функция НСтр с форматной строкой даты или собственная таблица соответствий, которая работает даже в самописных конфигурациях без БСП.
Когда месяц нужно склонять, а когда нет
Название месяца в именительном падеже корректно в заголовках отчётов («Отчёт за март»), в колонках таблиц и в отборах. Родительный падеж обязателен в датах вида «5 марта», «с 1 по 30 апреля», «в течение июня». Предложный падеж встречается в формулировках «в марте», «по итогам сентября».
Ошибка возникает, когда разработчик берёт представление месяца из функции Месяц() или из периодического реквизита и подставляет его в произвольный текст. Функция Месяц() возвращает число от 1 до 12, а преобразование в строку через Формат() без явного указания падежа даёт именительную форму. Поэтому перед выводом текста определите, какой падеж требует фраза, и только потом выбирайте способ получения строки.
Способ 1. Родительный падеж через функцию Формат
Самый быстрый вариант для дат — длинный формат даты. Вызов Формат(ТекущаяДатаСеанса(), "ДЛФ=DD") возвращает строку вида «5 марта», где месяц уже стоит в родительном падеже. Если нужен только месяц без числа, строку можно разобрать: отделить часть после первого пробела.
ДлиннаяДата = Формат(ДатаДокумента, "ДЛФ=DD");
// "5 марта"
ПозицияПробела = СтрНайти(ДлиннаяДата, " ");
МесяцРодительный = Сред(ДлиннаяДата, ПозицияПробела + 1);
// "марта"
Ограничение способа очевидно: доступен только родительный падеж, привязанный к конкретной дате. Для фраз «в марте» или «с сентябрём» (творительный падеж используется редко, но встречается в автоматически генерируемых текстах) этот метод не подходит. Кроме того, результат зависит от региональных настроек сеанса: при другом языке интерфейса строка будет на другом языке.
Способ 2. Склонение через механизм БСП
В конфигурациях на базе БСП (1С:Бухгалтерия, 1С:Управление торговлей, 1С:ERP, 1С:Зарплата и управление персоналом) есть общий модуль СклонениеПредставленийОбъектов. Его функция ПолучитьСклоненияСтроки принимает строку в именительном падеже и возвращает структуру или массив с формами всех шести падежей.
Формы = СклонениеПредставленийОбъектов.ПолучитьСклоненияСтроки("сентябрь");
// Формы содержит: именительный, родительный, дательный,
// винительный, творительный, предложный
Механизм работает так: при первом обращении строка склоняется программным алгоритмом, результат записывается в регистр сведений «Склонения представлений объектов», и дальнейшие обращения берут готовые формы из регистра без повторного расчёта. Это снижает нагрузку при массовом формировании документов.
Месяцы склоняются корректно, потому что это однословные существительные мужского рода с регулярным склонением. Трудности алгоритм испытывает с аббревиатурами, цифрами и составными фразами — к названиям месяцев это не относится.
- 1Убедитесь, что в конфигурации есть общий модуль СклонениеПредставленийОбъектов
- 2Вызовите ПолучитьСклоненияСтроки с названием месяца в именительном падеже
- 3Извлеките из результата нужную падежную форму
- 4Подставьте форму в шаблон текста печатной формы или сообщения
- 5Проверьте результат на месяцах с разными окончаниями: март, июнь, сентябрь
Способ 3. Собственное соответствие месяцев и падежей
В самописной конфигурации без БСП подключать тяжёлый механизм склонения ради двенадцати слов нерационально. Месяцев всего двенадцать, падежей шесть — это фиксированный набор из 72 строк, который проще задать один раз в коде или хранить в макете.
Функция МесяцВПадеже(НомерМесяца, Падеж) Экспорт
Месяцы = Новый Соответствие;
Если Падеж = "Родительный" Тогда
Месяцы.Вставить(1, "января");
Месяцы.Вставить(2, "февраля");
Месяцы.Вставить(3, "марта");
// ... и так далее до 12
ИначеЕсли Падеж = "Предложный" Тогда
Месяцы.Вставить(1, "январе");
Месяцы.Вставить(2, "феврале");
Месяцы.Вставить(3, "марте");
// ...
КонецЕсли;
Возврат Месяцы[НомерМесяца];
КонецФункции
Плюс подхода — полная предсказуемость: формы зафиксированы, не зависят от версии платформы и алгоритмов склонения. Минус — при добавлении другого языка таблицу придётся дублировать. Для многоязычных решений лучше хранить формы в макете типа «Табличный документ» или в строковых константах с разбивкой по языкам.
Сравнение способов
Подходит для дат в родительном падеже. Не даёт других падежей и зависит от языка сеанса.
Универсальное решение для всех падежей и любых слов. Требует наличия БСП в конфигурации.
Надёжно и быстро для месяцев. Требует ручного ведения списка при добавлении языков.
Как проверить результат склонения
После внедрения любого из способов прогоните проверку минимум на трёх группах месяцев: на «марте» и «августе» (короткие формы), на «июне» и «июле» (мягкий знак в окончаниях меняется на «е» в предложном падеже), на «сентябре», «октябре», «ноябре», «декабре» (однотипное склонение, но частый источник опечаток в ручных таблицах).
Контрольный признак корректной работы: во всех шести падежах основа слова сохраняется, меняется только окончание. Если в предложном падеже получилось «в июнь» вместо «в июне» — используется именительная форма, значит, склонение не сработало или выбран не тот элемент структуры.
Как проверить результат
«от 5 марта» — месяц в родительном падеже
«от 5 март» — именительный падеж вместо родительского
«в июне», «в сентябре»
«в июнь», «в сентябрь»
Каждая форма отличается корректным окончанием
Часть месяцев повторяет именительный падеж
Типичные ошибки и их последствия
Самая распространённая ошибка — подстановка числового представления месяца в текст: «срок до 03» вместо «срок до марта». Такое происходит, когда разработчик использует Месяц(Дата) и забывает преобразовать число в слово. Вторая частая ошибка — жёсткая конкатенация строк вида «от » + Месяц + « года», где месяц остаётся в именительном падеже.
Третья группа ошибок связана с механизмом БСП: вызов функции склонения в цикле при массовой печати без учёта того, что первый вызов для каждой новой строки пишет данные в регистр. На больших объёмах это даёт лишние транзакции. Решение — склонять названия месяцев один раз при инициализации отчёта и переиспользовать результат.
Ограничения и границы самостоятельной доработки
Изменение общих модулей типовой конфигурации снимает её с полной поддержки и усложняет обновления. Безопасный путь — выносить функции склонения в собственный общий модуль расширения конфигурации или в отдельный модуль с префиксом доработок. Прямое редактирование модулей БСП допустимо только при полном понимании последствий и с фиксацией изменений для будущих обновлений.
Если склонение нужно не только для месяцев, но и для ФИО сотрудников, должностей и подразделений, не создавайте параллельные механизмы: используйте единый модуль БСП, который уже умеет определять пол и корректно обрабатывать составные фразы. Дублирование логики приводит к расхождениям в одних и тех же документах.
FAQ
Можно ли просклонять месяц без программирования, в макете печатной формы?
Нет, макет хранит статичный текст и параметры, но не выполняет склонение. Падежную форму нужно вычислить в коде и передать в макет как готовый параметр. Исключение — если в макете заранее прописаны все варианты, а код выбирает нужный, что фактически повторяет способ с собственным соответствием.
Работает ли ПолучитьСклоненияСтроки в файловой базе?
Да, механизм не зависит от клиент-серверного режима. Разница только в том, что в файловой базе регистр склонений хранится локально, а в клиент-серверной — общий для всех пользователей, что даже выгоднее: формы рассчитываются один раз для всех.
Что делать, если в регистре «Склонения представлений объектов» оказалась неверная форма?
Найдите запись по исходной строке и либо исправьте форму вручную, либо удалите запись — при следующем обращении склонение будет рассчитано заново. Перед массовой чисткой регистра сделайте резервную копию данных.
Как получить месяц с заглавной буквы после склонения?
Функции склонения возвращают строку в том регистре, в котором передана исходная форма. Передайте «Март» — получите «Марта». Если исходное слово в нижнем регистре, примените к результату ТРег() или замените первый символ через ВРег(Лев(Строка, 1)).
Нужно ли склонять месяцы в англоязычных документах?
В английском языке названия месяцев не склоняются, падежные формы отсутствуют. Достаточно вывести месяц в именительной форме, например через Формат с английским языком локализации. Механизм склонений БСП ориентирован на русский язык.
Где хранить таблицу падежных форм при многоязычной конфигурации?
Практичный вариант — макет табличного документа с колонками «Язык», «Номер месяца», «Падеж», «Форма» и функция-обёртка, читающая нужную ячейку. Так формы может корректировать редактор без изменения кода, а механизм остаётся единым для всех языков.
Что важно запомнить
Для дат в родительном падеже достаточно Формат с ДЛФ=DD, для всех падежей в типовых конфигурациях — СклонениеПредставленийОбъектов.ПолучитьСклоненияСтроки, в самописных решениях — собственное соответствие из 12 месяцев. Проверяйте результат на «июне», «марте» и «сентябре» и не редактируйте типовые модули напрямую.