Как вывести число прописью без дробной части и лишних пробелов в 1С

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

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

В этой статье мы подробно разберем, почему возникает эта проблема, рассмотрим классические и современные способы ее решения, а также развенчаем популярные мифы, связанные с параметрами форматирования в 1С.

Причина возникновения проблемы: откуда берется лишний пробел?

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


ФорматнаяСтрока = "Л=ru_RU";
ПараметрыПредметаИсчисления = " , , , , , , , , 0";
Результат = ЧислоПрописью(ВыводимоеЧисло, ФорматнаяСтрока, ПараметрыПредметаИсчисления);

В данном примере в качестве параметров предмета исчисления мы передаем пустые строки для целой и дробной частей, а последним параметром указываем 0 — это разрядность (точность) дробной части. На первый взгляд, все логично: разрядность равна нулю, значит, дробная часть выводиться не должна. Однако на выходе для числа 15 мы получаем строку вида "Пятнадцать " с пробелом на конце.

Выясним причину этого поведения. Платформа 1С:Предприятие устроена так, что при формировании строки прописью она резервирует место под разделитель между целой и дробной частью. Даже если мы явно указали точность 0 и передали пустые параметры для копеек, алгоритм генерации текста все равно добавляет пробел-разделитель в самый конец результирующей строки. Это особенность работы движка платформы, которую необходимо учитывать при написании кода.

Способ 1. Классическое решение с использованием очистки пробелов

Самый простой и проверенный временем способ избавиться от нежелательного пробела в конце строки — это использование встроенных функций очистки пробелов, таких как СокрЛП() (Сократить Левые и Правые пробелы) или СокрП() (Сократить Правые пробелы).

Давайте посмотрим на пример совмещения преобразования числа и очистки концевых символов в одну строку:


// Однострочный вариант решения проблемы
ДниПрописью = СокрЛП(ЧислоПрописью(ВыводимоеЧисло, "Л=ru_RU", " , , , , , , , , 0"));

В этом примере функция СокрЛП() перехватывает результат выполнения ЧислоПрописью() и моментально удаляет любые пробелы в начале и конце полученной строки. На выходе мы получаем чистый текст без каких-либо побочных символов — например, "Пятнадцать".

Если вам необходимо, чтобы число выводилось со строчной (маленькой) буквы, вы можете дополнительно обернуть выражение в функцию НРег():


ДниСтрокойМаленькимиБуквами = НРег(СокрЛП(ЧислоПрописью(ВыводимоеЧисло, "Л=ru_RU", " , , , , , , , , 0")));
// Для числа 15 вернет: "пятнадцать"

Разоблачение мифа о параметре НП=Ложь

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

Параметр НП расшифровывается как «НачальнаяПрописная». Он принимает логические значения (Истина/Ложь) и управляет регистром первой буквы формируемой строки:

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

Способ 2. Использование современного метода ПолучитьСклоненияСтрокиПоЧислу()

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

Этот метод самостоятельно анализирует переданное число, правильно склоняет существительные во всех падежах русского языка и — что самое главное — не оставляет никаких паразитных пробелов в конце строки.

Рассмотрим, как получить только число прописью в именительном падеже без указания единиц измерения:


РезультатМассив = ПолучитьСклоненияСтрокиПоЧислу(
    "", // Единицу измерения оставляем пустой
    ВыводимоеЧисло, 
    "", 
    "ЧС=Количественное", 
    "ПД=Именительный; ПЧ=ЧислоПрописью"
);
ДниПрописью = РезультатМассив[0]; 
// Для числа 15 вернет: "пятнадцать" без лишних пробелов в конце!

А теперь давайте усложним задачу. Что если нам нужно вывести не просто абстрактное число прописью, а связать его со словом «день» в правильном склонении? С использованием старого подхода нам пришлось бы писать громоздкие конструкции. С новым методом это делается в несколько строк:


ВыводимоеЧисло = 21;
РезультатМассив = ПолучитьСклоненияСтрокиПоЧислу(
    "день", 
    ВыводимоеЧисло, 
    "", 
    "ЧС=Количественное", 
    "ПД=Именительный; ПЧ=ЧислоПрописью"
);
РезультатСклонения = РезультатМассив[0];
// Получим идеальный результат: "двадцать один день"

Метод автоматически подберет правильную форму существительного:

  1. Для числа 1 вернет: "один день"
  2. Для числа 3 вернет: "три дня"
  3. Для числа 5 вернет: "пять дней"
  4. Для числа 21 вернет: "двадцать один день"

Это делает код чистым, надежным и избавляет разработчика от необходимости изобретать велосипеды для склонения слов. Если же требуется рассчитать и перевести в текст со склонением интервалы времени и стаж, можно применить разработку для расчета разницы между датами и вывода результата в текст.

Способ 3. Вывод сумм без копеек с помощью Библиотеки Стандартных Подсистем (БСП)

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

В составе БСП есть общий модуль РаботаСКурсамиВалют, который содержит готовую функцию для вывода сумм прописью с возможностью отключения копеек. Нам не нужно вручную прописывать параметры валют и заниматься обрезкой строк.

Посмотрим на пример использования этой функции:


// Параметр "ВыводитьСуммуБезКопеек" устанавливаем в значение Истина
СуммаПрописью = РаботаСКурсамиВалют.СформироватьСуммуПрописью(
    ВыводимоеЧисло, 
    СсылкаНаВалютуРубль, 
    Истина // Отключаем вывод копеек
);

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

Важный нюанс: округление и приведение к целому типу

При работе с числами, полученными расчетным путем (например, среднее количество дней отпуска, рассчитываемое по сложным формулам), в системе могут возникать погрешности округления. На экране пользователь может видеть ровное число 15, но в памяти компьютера из-за особенностей представления чисел с плавающей точкой оно может храниться как 14.999999999997 или 15.000000000002.

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

Поэтому хорошей практикой программирования в 1С является принудительное приведение числа к целому типу или его предварительное округление:


// Вариант 1. Отрезаем дробную часть с помощью функции Цел()
ЧислоДляВывода = Цел(ВыводимоеЧисло);

// Вариант 2. Выполняем математическое округление до целого числа с помощью Окр()
ЧислоДляВывода = Окр(ВыводимоеЧисло, 0);

// Теперь передаем гарантированно целое число в функцию форматирования
ДниПрописью = СокрЛП(ЧислоПрописью(ЧислоДляВывода, "Л=ru_RU", " , , , , , , , , 0"));

Использование Цел() или Окр() защитит ваш код от случайных ошибок, связанных с микроскопическими долями секунд или копеек, которые могут испортить внешний вид официальных документов.

Резюме

Мы подробно разобрали проблему вывода чисел прописью без копеек и лишних пробелов. Для решения этой задачи у вас есть три отличных инструмента:

  1. Классический метод СокрЛП(ЧислоПрописью(...)) с разрядностью 0 — универсальный вариант, работающий на любых, даже самых старых версиях платформы 1С.
  2. Современный метод ПолучитьСклоненияСтрокиПоЧислу() — наиболее изящный способ для версий платформы 8.3.14 и выше, автоматически решающий проблемы склонения существительных.
  3. Методы БСП (РаботаСКурсамиВалют.СформироватьСуммуПрописью) — лучший выбор для разработки внутри типовых конфигураций 1С.
← На главную