Как убрать «00» копеек (дробную часть) при выводе числа прописью в 1С

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

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

В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем частые ошибки начинающих разработчиков при попытке их исправить, и рассмотрим два решения: быстрое «костыльное» через замену строки и правильное системное через параметры самой функции 1С.

Введение: почему функция ЧислоПрописью добавляет «00»?

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

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

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

Способ 1. Правильное решение через параметры предмета исчисления (Рекомендуется)

Самый надежный и профессиональный способ убрать «00» — это сообщить платформе, что у нашего предмета исчисления в принципе отсутствует дробная часть. Для этого используется третий параметр функции ЧислоПрописью — ПараметрыПредметаИсчисления.

Этот параметр представляет собой строку, в которой через запятую указываются грамматические свойства для целой и дробной частей. Полный формат строки выглядит следующим образом:

"ЕдиницаИменительный, ЕдиницаРодительныйЕд, ЕдиницаРодительныйМн, РодЕдиницы, ДробьИменительный, ДробьРодительныйЕд, ДробьРодительныйМн, РодДроби, РазрядностьДробнойЧасти"

Обратим внимание на самый последний, 9-й параметр — РазрядностьДробнойЧасти. Если установить его в значение 0, платформа полностью отключит вывод дробной части и уберет завершающие нули.

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


// Формируем форматную строку. ДП=Ложь отключает вывод дробной части словами.
ФормСтрока = "Л = ru_RU; ДП = Ложь";

// Задаем параметры предмета исчисления.
// Пропускаем параметры дробной части (5, 6, 7, 8), а на 9-е место ставим "0"
ПарПредмета = "год,года,лет,м,,,,,0";

ПрописьЧисла = ЧислоПрописью(СрокИИП, ФормСтрока, ПарПредмета);
Макет.Параметры.СрокИИП_Прописью = ПрописьЧисла;

Давайте разберем структуру строки ПарПредмета = "год,года,лет,м,,,,,0" по позициям:

  1. год — именительный падеж (1 год);
  2. года — родительный падеж единственного числа (2 года);
  3. лет — родительный падеж множественного числа (5 лет);
  4. м — мужской род предмета исчисления;
  5. (пусто) — именительный падеж дробной части (пропускаем);
  6. (пусто) — родительный падеж ед. ч. дробной части (пропускаем);
  7. (пусто) — родительный падеж мн. ч. дробной части (пропускаем);
  8. (пусто) — род дробной части (пропускаем);
  9. 0 — разрядность дробной части. Этот ноль и является главным решением проблемы!

При таком подходе система никогда не выведет дробные нули, независимо от переданного числа.

Способ 2. Быстрое решение через СтрЗаменить() и его опасности

На форумах часто советуют использовать текстовую замену:


ПрописьЧисла = ЧислоПрописью(СрокИИП, ФормСтрока, ПарПредмета);
ПрописьЧисла = СтрЗаменить(ПрописьЧисла, "00", "");

Хотя этот метод кажется простым и рабочим, в реальной практике использовать его крайне не рекомендуется по следующим причинам:

Используйте строковую замену только в самых крайних случаях, когда нет возможности повлиять на исходные параметры формирования прописи.

Разбор синтаксических ошибок из обсуждения на форуме

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

Посмотрим на ошибочный фрагмент кода:


ФормСтрока = "Л = ru_RU;ДП=Истина;
ПарПредмета="год,года,лет,м";
ПрописьЧисла = ЧислоПрописью(СрокИИП,ФормСтрока,ПарПредмета);
СтрЗаменить(ПрописьЧисла, "00", "");

При проверке этого кода конфигуратор выдал сразу три ошибки. Выясним их причины:

  1. Пропущен символ '"' (двойная кавычка) в строке 17.

    Ошибка возникла из-за незакрытой кавычки в первой строке: ФормСтрока = "Л = ru_RU;ДП=Истина;. Если вы хотите перенести строку или просто завершить присвоение, обязательно закрывайте кавычку перед точкой с запятой: ФормСтрока = "Л = ru_RU;ДП=Истина";.

  2. Встроенная функция может быть использована только в выражении (СтрЗаменить).

    Функция СтрЗаменить() не изменяет переданную в нее переменную «на месте». Она обрабатывает строку и возвращает новый результат. Поэтому ее нельзя вызывать как отдельную команду. Результат работы функции обязательно нужно присвоить переменной:

    ПрописьЧисла = СтрЗаменить(ПрописьЧисла, "00", "");

Резюме и лучшие практики

Для удаления дробной части при работе с функцией ЧислоПрописью всегда используйте штатную настройку разрядности в параметрах предмета исчисления (9-й параметр, равный 0). Это гарантирует стабильную работу программы, исключает появление багов при изменении входных данных и соответствует стандартам разработки фирмы «1С».

← На главную