При формировании печатных форм часто возникает задача вывести число прописью без копеек или вообще без указания валюты (рублей). Разработчики нередко сталкиваются с ситуацией, когда попытка отключить дробную часть с помощью параметра форматной строки НД = Ложь приводит к неожиданному результату: слова «рублей» и «копеек» исчезают, но в конце строки всё равно остаются цифры «00». Кроме того, при удалении наименования валюты в конце результирующей строки появляется лишний хвостовой пробел.
Разберем детально, почему так происходит, как правильно настраивать параметры функции ЧислоПрописью и как гарантированно избавиться от нежелательных символов.
Проанализируем работу параметра форматной строки НД (или FN в англоязычном варианте). Аббревиатура НД расшифровывается как «Выводить наименование дробной части». Данный флаг управляет исключительно выводом текста единицы измерения дробной части (например, «копейка», «копейки», «копеек», «цент»), но совершенно не затрагивает само числовое значение.
По умолчанию в платформе 1С для русской локализации применяются стандартные параметры валюты с точностью в 2 знака после запятой. Если мы передаем конструкцию вида:
Результат = ЧислоПрописью(123, "НД = Ложь");
Платформа отключает вывод слова «копеек», однако числовое значение дробной части с разрядностью 2 остается активным. В результате получается строка «Сто двадцать три 00». Таким образом, форматная строка в одиночку не решает задачу полного скрытия копеек.
Посмотрим на третий параметр функции ЧислоПрописью — «ПараметрыПредметаИсчисления». Этот параметр представляет собой строку, в которой через запятую перечисляются грамматические формы целой и дробной частей, их род, а также разрядность. Формат строки выглядит следующим образом:
"Целая1, Целая2, Целая5, РодЦелой, Дробная1, Дробная2, Дробная5, РодДробной, Разрядность"
Именно девятый параметр (разрядность дробной части) определяет, сколько знаков после запятой необходимо обрабатывать и выводить. Если передать туда 0, дробная часть будет полностью отключена.
Рассмотрим пример с выводом рублей, но без копеек:
Параметры = "рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 0";
Результат = ЧислоПрописью(123, , Параметры);
Обратите внимание: при указании нулевой разрядности передавать форматную строку "НД = Ложь" во второй параметр уже не требуется. Платформа видит нулевую точность и формирует строку «Сто двадцать три рубля» без каких-либо копеек и цифр «00».
Часто требуется вывести число прописью как абстрактное количество (например, «Сто двадцать три»), не привязываясь к рублям или штукам. Для этого в строке предмета исчисления пропускают наименования, оставляя только нужные позиционные разделители.
Разберем по шагам, как сформировать такую строку:
м). Если требуется женский род — указываем ж, средний — с.0, чтобы исключить вывод дробных долей.Посмотрим на пример кода:
// Для мужского рода ("Сто двадцать один")
РезультатМ = ЧислоПрописью(121, , ",,,м,,,,0");
// Для женского рода ("Сто двадцать одна")
РезультатЖ = ЧислоПрописью(121, , ",,,ж,,,,0");
// Для среднего рода ("Сто двадцать одно")
РезультатС = ЧислоПрописью(121, , ",,,с,,,,0");
Проанализируем еще одну частую проблему: если наименование целой части опущено, в конце сформированной строки всегда остается невидимый пробел. Конструкция ЧислоПрописью(123, , ",,,м,,,,0") возвращает значение "Сто двадцать три ".
Причина кроется во внутреннем алгоритме платформы: строка формируется по шаблону склейки компонентов, где между прописью числа и наименованием единицы измерения заложен фиксированный символ пробела:
[Число прописью] + " " + [Наименование единицы]
Поскольку наименование единицы пустое, разделительный пробел оказывается в самом конце строки. Во встроенном языке 1С нет штатного параметра форматной строки, способного отключить этот автоматический разделитель.
Единственным правильным и надежным решением является удаление концевых пробелов с помощью встроенных строковых функций СокрП (сократить справа) или СокрЛП (сократить слева и справа):
ЧислоДляВывода = 123;
Результат = СокрП(ЧислоПрописью(ЧислоДляВывода, , ",,,м,,,,0"));
При таком подходе результат гарантированно будет очищен от хвостового пробела и готов для конкатенации с любыми другими строками в печатных формах.