Как вывести сумму цифрами с правильным склонением рублей и копеек в 1С?

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

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

Почему стандартная функция ЧислоПрописью не выводит рубли цифрами?

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

Рассмотрим несколько надежных способов обойти это ограничение и получить строку с числом и склоняемым существительным.

Способ 1. Использование универсальной функции склонения количества

Разберем классический алгоритм склонения существительных на основе остатков от деления на 10 и 100. Этот метод полностью автономен и подходит для любых единиц измерения (рубли, штуки, коробки, сотрудники).

Посмотрим на пример реализации функции:


Функция СклонениеКоличества(Знач Количество, ЕдинственноеЧисло, ДвойственноеЧисло, МножественноеЧисло) Экспорт
    
    Остаток10 = Количество % 10;
    Остаток100 = ((Количество - Остаток10) / 10) % 10;
    Результат = МножественноеЧисло;
    
    Если Остаток100 <> 1 Тогда
        Если Остаток10 = 1 Тогда
            Результат = ЕдинственноеЧисло;
        ИначеЕсли Остаток10 = 2 Или Остаток10 = 3 Или Остаток10 = 4 Тогда
            Результат = ДвойственноеЧисло;
        КонецЕсли;
    КонецЕсли;
    
    Возврат Результат;    
    
КонецФункции

Теперь разберем, как применить данную функцию для формирования итоговой строки суммы с рублями и копейками:


Функция СформироватьСуммуЦифрами(Сумма) Экспорт
    
    ЦелаяЧасть = Цел(Сумма);
    ДробнаяЧасть = Окр((Сумма - ЦелаяЧасть) * 100, 0);
    
    СтрокаРублей = СклонениеКоличества(ЦелаяЧасть, "рубль", "рубля", "рублей");
    СтрокаКопеек = СклонениеКоличества(ДробнаяЧасть, "копейка", "копейки", "копеек");
    
    Возврат СтрШаблон("%1 %2 %3 %4", ЦелаяЧасть, СтрокаРублей, ДробнаяЧасть, СтрокаКопеек);
    
КонецФункции

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

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

  1. СтроковыеФункцииКлиентСервер.СтрокаСЧисломДляЛюбогоЯзыка() — позволяет сформировать строку вида «5 рублей» с автоматической подстановкой правильной грамматической формы.
  2. Методы модуля СклонениеПредставленийОбъектовКлиентСервер — предоставляют широкие возможности для склонения словосочетаний и предметов исчисления.

Способ 3. Замена прописи на число через поиск корня слова

В некоторых случаях разработчики используют результат ЧислоПрописью() и заменяют текст до названия валюты на числовое значение:


СтрокаПрописью = ЧислоПрописью(Сумма, "L=ru_RU", "рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2");
ПозицияРубл = Найти(НРег(СтрокаПрописью), "рубл");

Если ПозицияРубл > 0 Тогда
    Результат = Строка(Цел(Сумма)) + " " + Сред(СтрокаПрописью, ПозицияРубл);
Иначе
    Результат = СтрокаПрописью;
КонецЕсли;

Важное предостережение: прямой вызов функции СтрЗаменить(Строка, "один", "1") использовать категорически не рекомендуется. Подобная замена повредит числа, содержащие этот корень (например, слово «одиннадцать» превратится в «1надцать»). Также при отделении дробной части всегда используйте округление Окр(), чтобы избежать погрешностей вещественных чисел.

← На главную