При формировании печатных форм договоров, залоговых билетов (в ломбардах и микрофинансовых организациях) или нормативных финансовых документов часто требуется выводить числовые значения, такие как годовая процентная ставка, прописью с высокой точностью (например, до тысячных долей: «Сто сорок шесть целых четыреста пятьдесят тысячных процента»).
В платформе 1С 7.7 стандартная функция Формат() с управляющей конструкцией "ЧП" или "ЧПДС" предназначена только для целых чисел либо для денежных сумм, где дробная часть жестко зафиксирована в виде двух знаков копеек. Рассмотрим, как решить задачу вывода произвольной неденежной дробной части прописью, а также разберем подводные камни каждого способа.
Простейший и наиболее быстрый подход — математически разделить исходное число на целую и дробную составляющие, перевести каждую из них в текст с помощью флага "ЧП" и соединить полученные строки с добавлением нужных слов.
Разберем реализацию этого алгоритма:
// Исходное число процентов
ПечСредневзвешанный = 146.450;
// Выделяем целую часть и дробную часть, приведенную к тысячным
ЦелаяЧасть = Цел(ПечСредневзвешанный);
ДробнаяЧасть = Окр((ПечСредневзвешанный - ЦелаяЧасть) * 1000, 0);
// Формируем строковое представление
ТекстПрописью = Формат(ЦелаяЧасть, "ЧП") + " целых " + Формат(ДробнаяЧасть, "ЧП") + " тысячных процента";
ТекстПрописью = ВРег(ТекстПрописью);
Обратим внимание на важный технический нюанс: при вычислении разности ПечСредневзвешанный - Цел(ПечСредневзвешанный) из-за особенностей арифметики чисел с плавающей точкой результат может превратиться в значение вроде 0.4499999999. Поэтому умножение на 1000 обязательно необходимо оборачивать в функцию Окр(..., 0), чтобы избежать потери единицы в младшем разряде.
Платформа 1С 7.7 позволяет переопределять правила вывода чисел и валют через специальные файлы шаблонов прописи с расширением .spl (Spelling). В таких файлах можно задать собственные наименования целой и дробной части.
Проанализируем порядок работы с файлами прописи:
percent.spl), в котором указываем наименования единиц исчисления в различных падежах.Пропись("percent.spl").Формат().Пропись(""), так как команда Пропись() действует глобально на весь программный модуль и может повлиять на вывод обычных денежных сумм в других документах.Посмотрим на пример кода с подключением шаблона:
// Включаем пользовательский шаблон прописи
Пропись("percent.spl");
// Получаем отформатированную строку
СтрокаПроцентов = Формат(ЧислоПроцентов, "ЧПДС");
// Сбрасываем шаблон на системный по умолчанию
Пропись("");
Ограничение данного способа заключается в том, что стандартная структура секции Money в файле .spl рассчитана на деление 1/100 (сотые доли). Если требуется вывод именно тысячных долей (3 знака после запятой), предпочтительнее использовать программную обработку.
При использовании прямого перевода чисел прописью необходимо учитывать правила русского языка:
Формат(1, "ЧП") вернет «Один», тогда как грамматически верно писать «Одна целая» или «Одна тысячная». Аналогично для двойки: «Две целых / тысячных», а не «Два».Если в задаче значения процентов кратны десяткам или сотням (например, 146.450, 10.500), окончание «тысячных» остается неизменным. Если же на входе могут появляться произвольные значения (например, 146.001), для полной корректности рекомендуется написать универсальную процедуру склонения с заменой окончаний числительных «один/два» на «одна/две» перед словами «целая/тысячная».