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

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

Как в 1С просклонять «рублей» и вывести сумму прописью

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

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

Ручной подход — цепочка Если Прав(Сумма,1) = "1" Тогда ... — почти всегда даёт ошибки на числах 11–14 («одиннадцать рубль» вместо «одиннадцать рублей») и плохо сопровождается. Штатный механизм решает это корректно, но требует понимания форматной строки и предметной области склонения.

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

Почему ручное склонение «рублей» — плохая идея

Классическая самодельная функция смотрит на последнюю цифру: 1 — «рубль», 2–4 — «рубля», остальное — «рублей». На числах 1, 22, 43 это работает. Но 11, 12, 13, 14 требуют формы «рублей», хотя последняя цифра — 1, 2, 3, 4. Если не добавить проверку на диапазон 11–14, в печатную форму счёта или доверенности попадёт грамматически неверная фраза, а такие документы контрагенты и банки могут отклонить.

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

Типичные ошибки
01
Проверка только последней цифры без исключения 11–14 — получается «одиннадцать рубль»
02
Склонение числа как строки через Прав() без преобразования в число — ошибки на нулях и пробелах-разделителях разрядов
03
Жёстко зашитое слово «рубль» в шаблоне печатной формы — ломается при смене валюты документа
04
Игнорирование копеек: сумма 100,50 выводится как «сто рублей» без дробной части

Способ 1: функция ЧислоПрописью()

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

Для рублей с копейками вызов выглядит так:

Сумма = 12345,67;

Пропись = ЧислоПрописью(Сумма, "Л=ru_RU",

"рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2");

// Результат: двенадцать тысяч триста сорок пять рублей 67 копеек

Структура предметной области: три формы целой части (для 1, для 2–4, для 5–0), род («м» — мужской), затем три формы дробной части, её род и количество знаков после запятой. Если дробная часть не нужна, параметр сокращается до "рубль, рубля, рублей, м".

bsl
Пропись = ЧислоПрописью(Сумма, "Л=ru_RU", "рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2");

Способ 2: типовые механизмы конфигураций

В конфигурациях на БСП (Бухгалтерия предприятия, Управление торговлей, ERP и другие) писать вызов ЧислоПрописью вручную обычно не нужно — есть готовые процедуры. Классический вариант — функция РаботаСКурсамиВалют.СформироватьСуммуПрописью(Сумма, Валюта), которая берёт параметры прописи из справочника валют.

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

Как задать параметры прописи для валюты

Если вы добавляете собственную валюту или исправляете существующую, параметры прописи заполняются по шаблону: форма1, форма2, форма3, род, формаДробной1, формаДробной2, формаДробной3, родДробной, разрядность.

Для основных валют значения выглядят так:

ВалютаЦелая частьРодДробная частьРазрядность
Рубль (RUB)рубль, рубля, рублеймкопейка, копейки, копеек, ж2
Доллар (USD)доллар, доллара, долларовмцент, цента, центов, м2
Евро (EUR)евро, евро, евромцент, цента, центов, м2
Тенге (KZT)тенге, тенге, тенгемтиын, тиына, тиынов, м2

Обратите внимание на евро: слово не склоняется, поэтому все три формы одинаковые. Это корректно с точки зрения платформы — она просто подставит нужную по счёту форму.

Склонение в нужном падеже

ЧислоПрописью выводит сумму в именительном падеже. Если в тексте договора нужен родительный («в размере…») или дательный, есть два пути. Первый — перестроить фразу документа так, чтобы сумма стояла в именительном падеже: «Сумма договора составляет: сто рублей 00 копеек». Это общепринятая практика в деловых документах.

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

Маршрут решения

Как выбрать действие

Нужна сумма прописью в типовой конфигурации (БП, УТ, ERP)Вызовите РаботаСКурсамиВалют.СформироватьСуммуПрописью() с валютой документа
Самописная конфигурация без БСПИспользуйте ЧислоПрописью() с явной строкой параметров «рубль, рубля, рублей, м, …»
Нужен падеж, отличный от именительногоПереформулируйте текст документа под именительный падеж или используйте ПолучитьСклоненияСтроки()
Пропись выводится с ошибкой только для одной валютыПроверьте поле параметров прописи в карточке этой валюты в справочнике

Проверка результата на контрольных числах

После внедрения прогоните функцию на наборе чисел, который покрывает все ветки склонения. Это занимает пару минут и гарантированно отлавливает ошибки до того, как их увидит контрагент.

Порядок действий
  1. 1
    Сформируйте тестовый документ или откройте внешнюю обработку с вызовом функции
  2. 2
    Проверьте суммы: 1, 2, 5, 11, 21, 22, 25, 111, 121, 1000, 1001
  3. 3
    Проверьте копейки: 0,01; 0,02; 0,05; 0,11; 0,21
  4. 4
    Проверьте круглые суммы: 100,00 — копейки должны выводиться как «00 копеек»
  5. 5
    Убедитесь, что первая буква прописи заглавная, если этого требует форма документа

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

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

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

Числа 11–14
Норма

«одиннадцать рублей», «четырнадцать рублей»

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

«одиннадцать рубль» — ошибка ручного склонения

Числа, оканчивающиеся на 1 (кроме 11)
Норма

«двадцать один рубль», «сто один рубль»

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

«двадцать один рублей»

Нулевые копейки
Норма

«…рублей 00 копеек»

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

Дробная часть отсутствует или выводится «0 копеек» без ведущего нуля

Смена валюты документа
Норма

Пропись автоматически меняется на «долларов», «евро» и т.д.

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

Слово «рублей» зашито в шаблон и не меняется

Частые проблемы и их решение

Если ЧислоПрописью возвращает число на английском или без склонения, проверьте форматную строку: параметр Л=ru_RU должен быть указан явно, иначе используется язык по умолчанию из настроек. В клиент-серверном варианте функция выполняется на сервере, и региональные настройки сервера могут отличаться от пользовательских.

Ещё одна типовая ситуация — сумма передаётся как строка с пробелами-разделителями разрядов («1 234 567,89»). Перед вызовом преобразуйте её в число через Число(), предварительно убрав неразрывные пробелы, иначе получите либо ошибку преобразования, либо неверный результат.

Наконец, регистр первой буквы: платформа возвращает пропись со строчной буквы. Для печатных форм, где требуется заглавная, используйте ТРег() или ВРег(Лев(Пропись,1)) + Сред(Пропись,2).

Итог

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

Правильный путь — штатные механизмы: ЧислоПрописью() с параметрами «рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2» или типовая СформироватьСуммуПрописью() с параметрами из справочника валют. Ручное склонение по последней цифре ломается на числах 11–14. Результат всегда проверяйте на контрольном наборе: 1, 2, 5, 11, 21, 111.

Частые вопросы

Как вывести только «рублей» без копеек для целых сумм?

Сократите предметную область до «рубль, рубля, рублей, м» — дробная часть не выводится вовсе. Если копейки нужны только при их наличии, проверяйте остаток от деления: при Сумма = Цел(Сумма) вызывайте вариант без дробной части, иначе — полный.

Почему ЧислоПрописью выводит сумму по-английски?

Не указана или неверно указана локаль в форматной строке. Добавьте параметр "Л=ru_RU" вторым аргументом функции. Также проверьте, что код выполняется там, где доступен нужный языковой пакет платформы.

Как сделать первую букву прописи заглавной?

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

Можно ли склонять не деньги, а, например, «штук» или «килограммов»?

Да, механизм универсален: ЧислоПрописью(Количество, "Л=ru_RU", "штука, штуки, штук, ж") или "килограмм, килограмма, килограммов, м". Главное — правильно указать три формы слова и род.

Где в типовой Бухгалтерии хранятся формы «рубль, рубля, рублей»?

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

Что делать, если сумма прописью нужна в родительном падеже для договора?

Штатная функция выводит только именительный падеж. Практичное решение — переформулировать текст: «Сумма договора составляет: сто рублей 00 копеек». Альтернатива — ПолучитьСклоненияСтроки(), но для денежных сумм этот метод используют редко из-за лишней сложности.