Как в 1С получить число в нужном падеже (например, превратить "3" в "трех")?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей
← На главную

При разработке печатных форм в 1С:Управление торговлей 10.3 или других конфигурациях часто возникает задача не просто вывести число прописью, а согласовать его с контекстом предложения. Стандартная функция ЧислоПрописью отлично справляется с задачей превращения "3" в "Три", но она всегда возвращает результат в именительном падеже. Если же нам требуется получить форму "трех", "трем" или "о трех", стандартных средств старых версий платформы бывает недостаточно. В этой статье мы разберем, как решить эту задачу различными способами, в зависимости от версии вашей платформы и сложности задачи.

Метод 1: Использование встроенной функции ПолучитьСклоненияСтрокиПоЧислу (для платформы 8.3.14+)

Если ваша информационная база запущена на платформе версии 8.3.14 и выше, вам повезло. Разработчики 1С добавили мощный инструмент для работы с лингвистикой. Функция ПолучитьСклоненияСтрокиПоЧислу позволяет склонять не только существительные, но и сами числа вместе с ними.

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

Разберем конкретный пример кода:


// Параметры:
// "ПД=Родительный" — задаем нужный нам падеж (кого? чего?)
// "ПЧ=ЧислоПрописью" — указываем, что нам нужно именно текстовое представление числа
// "ЧС=Количественное" — задаем тип числительного (три, а не третий)

РезультатМассив = ПолучитьСклоненияСтрокиПоЧислу("", 3, "", "ПД=Родительный; ПЧ=ЧислоПрописью");

Если РезультатМассив.Количество() > 0 Тогда
    СклоненноеЧисло = РезультатМассив[0]; // Вернет "трех"
    Сообщить(СклоненноеЧисло);
КонецЕсли;

Проанализируем ситуацию, когда нам нужно склонить число вместе с объектом. Например, "трех контрагентов". В этом случае функция сама подберет правильные окончания для обоих слов:


Результат = ПолучитьСклоненияСтрокиПоЧислу("контрагент", 3, , "ПД=Родительный")[0];
// Результат будет: "трех контрагентов"

Метод 2: Склонение через функцию ПолучитьСклоненияСтроки (для ФИО и должностей)

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

Метод 3: Решение для старых версий платформы (ниже 8.3.14)

Поскольку УТ 10.3 — это конфигурация на обычных формах, она нередко эксплуатируется на старых версиях платформы 8.2 или ранних 8.3. В этом случае функции ПолучитьСклоненияСтрокиПоЧислу не существует. Выясним, как поступить в такой ситуации.

Использование внешней компоненты "Морфер" или NameDecl.dll

Многие типовые решения 1С (например, ЗУП или УПП) включают в свой состав библиотеку NameDecl.dll. Она позволяет программно склонять слова. Если же стандартных средств нет, программисты часто подключают внешние компоненты, такие как "Морфер". Это позволяет передать слово и падеж, получив на выходе готовую форму.

Создание собственной функции "заглушки" (вариант для небольших чисел)

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


Функция ПолучитьЧислоВРодительномПадеже(ЧислоЗначение)
    Склонения = Новый Соответствие;
    Склонения.Вставить(1, "одного");
    Склонения.Вставить(2, "двух");
    Склонения.Вставить(3, "трех");
    Склонения.Вставить(4, "четырех");
    Склонения.Вставить(5, "пяти");
    
    Результат = Склонения.Получить(ЧислоЗначение);
    
    Если Результат = Неопределено Тогда
        // Если число вне диапазона, возвращаем обычную пропись через стандартную функцию
        Возврат ЧислоПрописью(ЧислоЗначение, "L=ru_RU", "");
    КонецЕсли;
    
    Возврат Результат;
КонецФункции

Метод 4: Использование веб-сервисов

Если база имеет доступ к интернету, мы можем воспользоваться API сторонних сервисов (например, DaData или Morpher). Мы отправляем HTTP-запрос с числом, а сервис возвращает нам все возможные падежные формы. Это избавляет от необходимости обновлять платформу или писать сложные алгоритмы склонения самостоятельно.

Посмотрим на пример логики работы с таким сервисом (условно):

  1. Формируем URL с текстом "3".
  2. Отправляем GET или POST запрос.
  3. Парсим полученный JSON или XML ответ.
  4. Извлекаем значение из поля "Родительный".

Метод 5: Использование алгоритмов из общих модулей типовых конфигураций

В старых конфигурациях разработчики часто писали громоздкие, но эффективные функции, которые разбирали число по разрядам и вручную подставляли нужные окончания. Если вы работаете в УТ 10.3, поищите в глобальном поиске по конфигурации (Ctrl+Shift+F) слово "Склонение". Возможно, в вашей базе уже есть общий модуль (например, ОбщегоНазначения), где реализованы подобные функции для нужд кадрового учета или формирования договоров.

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

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

← На главную