При разработке печатных форм, отчетов или различных документов в системе 1С:Предприятие программисты регулярно сталкиваются с необходимостью вывести числовое значение прописью. Это может быть количество товара, число упаковок, количество дней отпуска или любая другая целая величина. Для решения этой задачи в платформе предусмотрена стандартная функция ЧислоПрописью(). Однако при её базовом использовании разработчики часто натыкаются на неприятную особенность: функция упорно пытается вывести дробную часть, дописывая в конце строки нежелательные нули (например, "Один 00" вместо лаконичного "Один").
В этой статье мы подробно разберем, почему возникает эта проблема, детально изучим структуру параметров функции ЧислоПрописью(), найдем самый простой и элегантный способ избавиться от нулей, а также рассмотрим современные альтернативные инструменты, доступные в новых версиях платформы 1С.
Часто начинающие разработчики пытаются решить проблему «в лоб», используя второй параметр функции ЧислоПрописью() — форматную строку. В ней настраивается код локализации и параметры представления чисел. Логика подсказывает использовать параметр ДП (дробная часть прописью) со значением Ложь, надеясь, что это полностью отключит вывод копеек:
// Попытка отключить копейки через форматную строку
Результат = ЧислоПрописью(цел(Стр.Количество), "Л = ru_RU; ДП=Ложь");
// Результат все равно содержит нули: "Один 00"
Давайте проанализируем ситуацию и разберемся, как этот параметр работает на самом деле в платформе 1С. Параметр форматной строки ДП (в англоязычном варианте FS — Fractional part to words) управляет исключительно способом отображения дробной части, но никак не её наличием в результирующей строке:
ДП=Ложь (значение по умолчанию) — указывает платформе выводить дробную часть в виде числового значения (например, «Один 00», «Двадцать пять 30»).ДП=Истина — указывает платформе выводить дробную часть буквами (прописью), например: «Один ноль копеек», «Двадцать пять тридцать сотых».Таким образом, с помощью одного лишь второго параметра (форматной строки) полностью скрыть копейки или секунды невозможно. Платформа по умолчанию резервирует два знака под дробную часть, считая, что любое число потенциально является денежной суммой.
Для того чтобы полностью избавиться от дробной части, нам необходимо обратиться к третьему параметру функции ЧислоПрописью(). Этот параметр называется ПараметрыПредметаИсчисления и представляет собой строку, в которой описываются правила именования целой и дробной частей числа, их род и, самое главное, разрядность.
Для русского языка (локаль ru_RU) структура этой строки состоит ровно из 9 параметров, которые перечисляются через запятую в строго определенном порядке:
"м" — мужской, "ж" — женский, "с" — средний). Этот параметр крайне важен, так как от него зависит правильное склонение числительных (например, «один день», но «одна штука»)."м", "ж", "с").2.Если мы установим девятый параметр равным 0, платформа поймет, что у данного числа вообще нет дробной части, и полностью уберет любые упоминания копеек или нулей из итоговой строки.
Рассмотрим несколько вариантов использования этой настройки в реальном коде 1С.
Если перед вами стоит задача вывести просто число буквами (например, для нумерации разделов, количества страниц или произвольных математических расчетов) без привязки к конкретным рублям или штукам, вы можете опустить названия единиц измерения. Для этого достаточно передать пустые значения, разделив их запятыми, и в самом конце указать желаемую разрядность 0:
// Задаем число для вывода
ВыводимоеЧисло = 154;
// Передаем пустые параметры для единиц измерения, но в конце ставим 0
Результат = ЧислоПрописью(ВыводимоеЧисло, , ",,,,,,,,0");
// В результате переменная Результат будет содержать строку:
// "Сто пятьдесят четыре"
Важный момент: обратите внимание, что мы опустили второй параметр (форматную строку), просто поставив запятую. Платформа в таком случае применит системные настройки локализации по умолчанию (обычно это русский язык).
Посмотрим на пример из обсуждения на форуме. Разработчику требовалось вывести количество отработанного времени в часах. В этом случае мы заполняем первые три параметра для правильного склонения слова «час», указываем мужской род ("м"), пропускаем параметры для дробной части (так как минут у нас нет) и в конце жестко задаем разрядность дробной части равной 0:
КоличествоЧасов = 40;
// Настраиваем параметры исчисления для слова "час" без дробной части
ПараметрыВремени = "час, часа, часов, м, , , , , 0";
СуммаПрописью = ЧислоПрописью(КоличествоЧасов, , ПараметрыВремени);
// Результат: "Сорок часов"
Этот подход гарантирует, что даже если в переменную КоличествоЧасов случайно попадет число с плавающей точкой, платформа отбросит дробную часть при формировании строки прописью, избавив ваш документ от странных «00» копеек. Для комплексного расчёта интервалов времени и их вывода в виде текста со склонением единиц подойдёт готовое решение для перевода разницы дат в текст.
Начиная с версии платформы 8.3.14, разработчикам стал доступен более гибкий и мощный механизм для работы с числительными — метод глобального контекста ПолучитьСклоненияСтрокиПоЧислу(). Он позволяет не только выводить числа прописью, но и автоматически склонять связанные с ними существительные по падежам.
Давайте посмотрим, как можно решить нашу задачу с помощью этого метода:
// Нам нужно вывести фразу "21 рабочий день" в именительном падеже прописью
РезультатСклонения = ПолучитьСклоненияСтрокиПоЧислу(
"рабочий день",
21,
,
"ЧС=Количественное",
"ПД=Именительный; ПЧ=ЧислоПрописью"
);
// Метод возвращает массив строк. Нам нужен первый элемент.
Сообщить(РезультатСклонения[0]);
// Выведет: "двадцать один рабочий день"
Этот способ гораздо удобнее, если вам нужно динамически изменять падежи в текстах договоров или актов (например, «в течение двадцати одного рабочего дня»). Параметр ПЧ=ЧислоПрописью автоматически преобразует числовую часть в текст, не добавляя никаких копеек или лишних нулей, если исходное существительное не предполагает дробной части.
Если вы ведете разработку в современной типовой конфигурации 1С (такой как ERP, Управление торговлей, Бухгалтерия предприятия или ЗУП), то в вашем распоряжении есть готовые механизмы БСП. В конфигурациях часто требуется выводить прописью именно денежные суммы, но при этом отбрасывать копейки. Для этого отлично подойдет общий модуль РаботаСКурсамиВалют.
Проанализируем следующий пример кода:
СуммаЧислом = 1500.00;
ВалютаСсылка = Справочники.Валюты.НайтиПоКоду("643"); // Рубль
// Используем готовую функцию БСП с флагом вывода без копеек
СуммаПрописью = РаботаСКурсамиВалют.СформироватьСуммуПрописью(СуммаЧислом, ВалютаСсылка, Истина);
// Результат: "Одна тысяча пятьсот рублей" (без "00 копеек")
Третий параметр этой функции (ВыводитьСуммуБезКопеек) принимает булево значение. Передавая туда Истина, мы перекладываем всю работу по форматированию, определению рода валюты и скрытию копеек на надежные плечи БСП.
Мы подробно разобрали проблему появления лишних нулей при выводе чисел прописью в 1С и изучили три надежных способа ее решения:
",,,,,,,,0" в качестве третьего параметра функции ЧислоПрописью(). Это идеальный и самый быстрый вариант для простых целых чисел.ПолучитьСклоненияСтрокиПоЧислу() для сложных сценариев со склонениями по падежам.РаботаСКурсамиВалют.СформироватьСуммуПрописью() при работе с финансовыми документами и справочником валют в типовых конфигурациях.