В процессе разработки печатных форм договоров, актов, доверенностей и других документов в 1С часто возникает необходимость вывести число не просто прописью, а в определенном падеже. Стандартный метод платформы ЧислоПрописью() отлично справляется с выводом чисел в именительном падеже (например, «одиннадцать»), однако он не умеет склонять слова по падежам. Из-за этого разработчикам долгое время приходилось писать громоздкие собственные функции или использовать сторонние компоненты.
В этой статье мы подробно разберем, как решить задачу склонения числительного 11 в форму «одиннадцати» штатными средствами платформы 1С:Предприятие 8.3, механизмами БСП, а также рассмотрим альтернативные варианты для старых версий систем.
Начиная с версии платформы 8.3.14.1565, разработчики получили штатный инструмент для решения подобных задач — функцию ПолучитьСклоненияСтрокиПоЧислу(). Этот метод позволяет склонять как числовые значения отдельно, так и целые словосочетания, состоящие из числительного и существительного.
Для того чтобы получить исключительно склоненное числительное «одиннадцати» без привязки к какому-либо объекту или предмету, мы можем передать в качестве первого параметра пустую строку. Давайте разберем готовый пример кода:
// Задаем параметры склонения: родительный падеж и вывод числа прописью
ПараметрыСклонения = "ПД=Родительный; ПЧ=ЧислоПрописью";
// Вызываем системную функцию платформы
Результат = ПолучитьСклоненияСтрокиПоЧислу("", 11, , "ЧС=Количественное", ПараметрыСклонения);
Если Результат.Количество() > 0 Тогда
// В первом элементе массива будет находиться строка "одиннадцати"
ЧислоПрописьюРодительный = Результат[0];
Сообщить(ЧислоПрописьюРодительный);
КонецЕсли;
Проанализируем параметры, которые мы передали в эту функцию:
"", так как нас интересует только само числительное. Если бы нам нужно было согласовать число с существительным (например, "11 дней"), мы бы передали туда строку "день".11."ЧС=Количественное". Это гарантирует, что число будет преобразовано в количественное числительное («одиннадцать»), а не в порядковое («одиннадцатый»)."ПД=Родительный; ПЧ=ЧислоПрописью". Код ПД=Родительный указывает платформе, что слово нужно поставить в родительный падеж (также подойдет Дательный или Предложный, где форма слова совпадает), а ПЧ=ЧислоПрописью велит системе преобразовать число в текст вместо цифр.Если ваша конфигурация построена на базе Библиотеки Стандартных Подсистем (БСП) (а это практически все современные типовые решения: 1С:ERP, 1С:Бухгалтерия, 1С:Управление торговлей, 1С:ЗУП и др.), вы можете использовать программный интерфейс БСП. Это избавит вас от необходимости писать проверки на версию платформы вручную.
Давайте посмотрим, как выглядит обращение к общему модулю БСП для склонения числа:
// Вызываем метод склонения из программного интерфейса БСП
Результат = СклонениеПредставленийОбъектов.ПросклонятьПредставление("11", , "ПД=Родительный; ПЧ=ЧислоПрописью");
// Переменная "Результат" будет содержать значение "одиннадцати"
Сообщить(Результат);
Преимущество этого метода заключается в том, что БСП берет на себя все низкоуровневые проверки совместимости версий платформы и предоставляет простой, лаконичный программный интерфейс для разработчика.
Если ваша задача состоит в том, чтобы динамически формировать текст сообщения, в котором число и существительное согласуются между собой (например, «остался 1 день», «осталось 11 дней», «осталось 2 дня»), то платформа версии 8.3.10 предлагает замечательную функцию СтрокаСЧислом().
Хотя этот метод возвращает само число цифрами, он избавляет вас от написания сложной логики с ветвлением условий «если число оканчивается на 1, но не на 11...». Давайте разберем по шагам, как устроен этот механизм:
// Шаблон строки, содержащий формы для разных категорий числительного через точку с запятой
ШаблонСклонения = ";остался %1 день;;осталось %1 дня;осталось %1 дней;осталось %1 дня";
ЧислоДней = 11;
РезультатСтрока = СтрокаСЧислом(ШаблонСклонения, ЧислоДней, ВидЧисловогоЗначения.Количественное, "L=ru");
// Для числа 11 результат выполнения функции будет: "осталось 11 дней"
Сообщить(РезультатСтрока);
В русском языке шаблон разделяется на 6 позиций:
Если вы вынуждены поддерживать старую конфигурацию, которая работает на платформе, не поддерживающей новые функции склонения, вам придется воспользоваться альтернативными методами.
Вариант А. Внешние компоненты (например, «Морфер»)
Популярным решением для старых версий 1С является интеграция с внешними библиотеками склонения, такими как «Морфер» (Morpher.dll). Компонента подключается к системе как Native API, после чего вы можете передавать туда строку «одиннадцать» (полученную через ЧислоПрописью()) и запрашивать её представление в родительном или дательном падеже.
Вариант Б. Написание собственной функции замены окончаний (словарь соответствий)
Поскольку базовых числительных в русском языке конечное количество, для простых задач (когда числа находятся в небольшом диапазоне, например, от 1 до 20) можно написать простую функцию перевода в родительный падеж на основе соответствия. Проанализируем пример такой функции:
Функция ПолучитьЧислоВРодительномПадеже(Знач ИсходноеЧисло) Экспорт
// Получаем стандартное строковое представление числа в именительном падеже
ИменительныйПадеж = ЧислоПрописью(ИсходноеЧисло, "L=ru_RU", ",,,,,,,,0");
ИменительныйПадеж = СокрЛП(НРег(ИменительныйПадеж));
// Создаем карту замен для простых числительных
СловарьСклонения = Новый Соответствие;
СловарьСклонения.Вставить("одиннадцать", "одиннадцати");
СловарьСклонения.Вставить("двенадцать", "двенадцати");
СловарьСклонения.Вставить("тринадцать", "тринадцати");
СловарьСклонения.Вставить("четырнадцать", "четырнадцати");
СловарьСклонения.Вставить("пятнадцать", "пятнадцати");
СловарьСклонения.Вставить("шестнадцать", "шестнадцати");
СловарьСклонения.Вставить("семнадцать", "семнадцати");
СловарьСклонения.Вставить("восемнадцать", "восемнадцати");
СловарьСклонения.Вставить("девятнадцать", "девятнадцати");
СловарьСклонения.Вставить("двадцать", "двадцати");
СклоненноеЗначение = СловарьСклонения.Получить(ИменительныйПадеж);
Если СклоненноеЗначение <> Неопределено Тогда
Возврат СклоненноеЗначение;
КонецЕсли;
// Для более сложных составных числительных потребуется полноценный алгоритм разбора строки
Возврат ИменительныйПадеж;
КонецФункции
Конечно, ручной разбор слов и замена окончаний — это трудоемкий и потенциально ошибочный путь, так как составные числительные (например, «сто пятьдесят один») требуют склонения каждого слова в связке. Поэтому мы настоятельно рекомендуем использовать штатные возможности платформы 1С версии 8.3.14 или механизмы БСП, которые гарантируют стопроцентную лингвистическую точность.