В 1С не нужны макросы и внешние сервисы — перевод числа в текст встроен в платформу. Проблема обычно не в том, чтобы получить пропись, а в том, чтобы получить её в нужном виде: с заглавной буквы, с копейками цифрами и в формате «сумма (пропись)».
Разберём встроенную функцию и способы собрать из неё привычную формулировку.
Базовый синтаксис
Платформа 1С:Предприятие 8 предоставляет глобальную функцию ЧислоПрописью:
ЧислоПрописью(<Число>, <ФорматнаяСтрока>, <ПараметрыПредметаИсчисления>)
Минимальный рабочий вызов для рублей:
Сумма = 25000;
Результат = ЧислоПрописью(
Сумма,
"Л=ru_RU",
"рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2"
);
// Двадцать пять тысяч рублей 00 копеек
Функция возвращает готовую строку с учётом согласования: «одна тысяча», «две тысячи», «пять тысяч» — окончания подставляются автоматически.
Параметры предмета исчисления
Третий аргумент — строка из девяти элементов через запятую. Порядок жёсткий:
| № | Что задаёт | Пример |
|---|---|---|
| 1 | Целая часть, единственное число | рубль |
| 2 | Целая часть, для 2–4 | рубля |
| 3 | Целая часть, для 5–20 | рублей |
| 4 | Род целой части: м, ж, с | м |
| 5 | Дробная часть, единственное число | копейка |
| 6 | Дробная часть, для 2–4 | копейки |
| 7 | Дробная часть, для 5–20 | копеек |
| 8 | Род дробной части | ж |
| 9 | Разрядность дробной части | 2 |
Род важен: он определяет форму числительного. Для рубля мужского рода — «одна тысяча один рубль», для копейки женского — «одна копейка». Перепутанный род даёт «один копейка».
Для другой валюты меняется только эта строка:
// Доллары США
"доллар, доллара, долларов, м, цент, цента, центов, м, 2"
// Евро
"евро, евро, евро, м, цент, цента, центов, м, 2"
// Тенге
"тенге, тенге, тенге, м, тиын, тиына, тиынов, м, 2"
Слово «евро» не склоняется, поэтому во всех трёх позициях стоит одинаковая форма.
Форматная строка
Второй аргумент управляет режимом вывода.
Л=ru_RU — язык. Обязателен, иначе используется язык сеанса, и на нерусской локали результат окажется английским.
ДП=Истина — дробную часть тоже писать прописью:
ЧислоПрописью(25000.50, "Л=ru_RU;ДП=Истина",
"рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2");
// Двадцать пять тысяч рублей пятьдесят копеек
По умолчанию ДП=Ложь, и копейки выводятся цифрами — именно тот вариант, который принят в первичных документах.
НП=Истина — не выводить пропись целой части, оставив только дробную. Применяется редко.
Формат «25 000 (Двадцать пять тысяч) рублей 00 копеек»
Это самая востребованная формулировка для договоров и счетов, и одним вызовом её не получить — платформа возвращает либо чистую пропись, либо ничего. Собирается вручную:
Функция СуммаВФорматеДокумента(Сумма) Экспорт
ЦелаяЧасть = Цел(Сумма);
Копейки = Окр((Сумма - ЦелаяЧасть) * 100, 0);
Пропись = ЧислоПрописью(
ЦелаяЧасть,
"Л=ru_RU",
"рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 0"
);
// ЧислоПрописью вернёт "Двадцать пять тысяч рублей" —
// отсекаем слово "рублей", оно понадобится вне скобок
Позиция = СтрНайти(Пропись, " рубл");
Если Позиция > 0 Тогда
Пропись = Лев(Пропись, Позиция - 1);
КонецЕсли;
Возврат СтрШаблон(
"%1 (%2) рублей %3 копеек",
Формат(Сумма, "ЧЦ=15; ЧДЦ=2; ЧРГ=' '"),
Пропись,
Формат(Копейки, "ЧЦ=2; ЧВН=")
);
КонецФункции
Результат: 25 000,00 (Двадцать пять тысяч) рублей 00 копеек
Разберём форматирование числа. ЧЦ=15 — общее количество знаков, ЧДЦ=2 — два знака после запятой, ЧРГ=' ' — разделитель групп разрядов пробелом. Для копеек ЧВН= включает вывод ведущих нулей, чтобы получить «05», а не «5».
Заглавная буква
ЧислоПрописью возвращает результат с заглавной буквы, если сумма начинается с первого разряда. Но при сборке строки вручную регистр может потеряться. Надёжный способ:
Пропись = ВРег(Лев(Пропись, 1)) + Сред(Пропись, 2);
Заглавная буква в документах не украшение: она не даёт дописать разряд перед суммой.
Где это уже реализовано
В типовых конфигурациях на базе Библиотеки стандартных подсистем печатные формы счетов, актов и накладных уже содержат готовый вывод суммы прописью. Отдельная функция нужна, когда вы делаете собственную печатную форму или внешнюю обработку.
Перед тем как писать свою реализацию, поищите в конфигурации существующий общий модуль с работой над суммами — велика вероятность, что нужная функция уже есть и поддерживается при обновлениях.
Когда встроенной функции недостаточно
ЧислоПрописью покрывает деньги и стандартные единицы измерения. Но она не умеет:
- склонять произвольные словосочетания по падежам
- работать с суммой в родительном или дательном падеже («двадцати пяти тысяч рублей»)
- выдавать сумму прописью для валют с нестандартной разрядностью
Для таких задач подключают внешний сервис. У PropNum есть HTTP API, вызываемый из 1С через HTTPСоединение, — он возвращает пропись с указанием падежа и режима НДС.
→ Документация API на propnum.ru
Частые ошибки
Пропущен параметр языка. Без Л=ru_RU на сервере с другой локалью результат вернётся на английском.
Перепутан род. «Копейка» женского рода, «рубль» мужского. Ошибка даёт «один копейка».
Округление копеек через Цел. Цел((Сумма - ЦелаяЧасть) * 100) из-за представления дробных чисел иногда даёт 49 вместо 50. Используйте Окр с явным указанием разрядности.
Копейки без ведущего нуля. «5 копеек» вместо «05 копеек» — визуально допускает дописку.
Разрядность 0 при живых копейках. Девятый параметр отвечает за дробную часть; поставив 0, вы потеряете копейки в выводе.
Проверьте результат
Если нужно быстро сверить, что выдаёт ваша функция, или получить пропись без доработки конфигурации — воспользуйтесь конвертером.