При оформлении печатных форм договоров, актов или других документов разработчики часто сталкиваются с необходимостью вывести количество лет, месяцев или предметов прописью. При использовании стандартной функции ЧислоПрописью на конце строки часто появляются нежелательные нули дробной части (например, «20 лет 00» или «Двадцать лет 00»).
В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем частые ошибки начинающих разработчиков при попытке их исправить, и рассмотрим два решения: быстрое «костыльное» через замену строки и правильное системное через параметры самой функции 1С.
По умолчанию встроенная функция 1С ЧислоПрописью настроена на вывод денежных величин (рубли и копейки). В финансовом учете принято всегда указывать копейки, даже если их количество равно нулю. Платформа резервирует под дробную часть два знака после запятой и выводит их в конце строки.
Если мы передаем в функцию собственные параметры предмета исчисления (например, «год, года, лет»), но не переопределяем правила вывода дробной части, система автоматически добавляет «00» в конце сформированного текста.
Рассмотрим, как решить эту задачу правильно, не нарушая стандарты разработки 1С.
Самый надежный и профессиональный способ убрать «00» — это сообщить платформе, что у нашего предмета исчисления в принципе отсутствует дробная часть. Для этого используется третий параметр функции ЧислоПрописью — ПараметрыПредметаИсчисления.
Этот параметр представляет собой строку, в которой через запятую указываются грамматические свойства для целой и дробной частей. Полный формат строки выглядит следующим образом:
"ЕдиницаИменительный, ЕдиницаРодительныйЕд, ЕдиницаРодительныйМн, РодЕдиницы, ДробьИменительный, ДробьРодительныйЕд, ДробьРодительныйМн, РодДроби, РазрядностьДробнойЧасти"
Обратим внимание на самый последний, 9-й параметр — РазрядностьДробнойЧасти. Если установить его в значение 0, платформа полностью отключит вывод дробной части и уберет завершающие нули.
Проанализируем готовый шаблон кода для вывода лет:
// Формируем форматную строку. ДП=Ложь отключает вывод дробной части словами.
ФормСтрока = "Л = ru_RU; ДП = Ложь";
// Задаем параметры предмета исчисления.
// Пропускаем параметры дробной части (5, 6, 7, 8), а на 9-е место ставим "0"
ПарПредмета = "год,года,лет,м,,,,,0";
ПрописьЧисла = ЧислоПрописью(СрокИИП, ФормСтрока, ПарПредмета);
Макет.Параметры.СрокИИП_Прописью = ПрописьЧисла;
Давайте разберем структуру строки ПарПредмета = "год,года,лет,м,,,,,0" по позициям:
год — именительный падеж (1 год);года — родительный падеж единственного числа (2 года);лет — родительный падеж множественного числа (5 лет);м — мужской род предмета исчисления;0 — разрядность дробной части. Этот ноль и является главным решением проблемы!При таком подходе система никогда не выведет дробные нули, независимо от переданного числа.
На форумах часто советуют использовать текстовую замену:
ПрописьЧисла = ЧислоПрописью(СрокИИП, ФормСтрока, ПарПредмета);
ПрописьЧисла = СтрЗаменить(ПрописьЧисла, "00", "");
Хотя этот метод кажется простым и рабочим, в реальной практике использовать его крайне не рекомендуется по следующим причинам:
СтрЗаменить удалит нули внутри этих чисел. Число "200" превратится в "2", что приведет к юридической ошибке в документе.Используйте строковую замену только в самых крайних случаях, когда нет возможности повлиять на исходные параметры формирования прописи.
В процессе обсуждения автор темы попытался внедрить решение со строковой заменой и совершил несколько типичных ошибок, которые часто допускают начинающие разработчики 1С. Разберем их, чтобы не повторять в будущем.
Посмотрим на ошибочный фрагмент кода:
ФормСтрока = "Л = ru_RU;ДП=Истина;
ПарПредмета="год,года,лет,м";
ПрописьЧисла = ЧислоПрописью(СрокИИП,ФормСтрока,ПарПредмета);
СтрЗаменить(ПрописьЧисла, "00", "");
При проверке этого кода конфигуратор выдал сразу три ошибки. Выясним их причины:
Ошибка возникла из-за незакрытой кавычки в первой строке: ФормСтрока = "Л = ru_RU;ДП=Истина;. Если вы хотите перенести строку или просто завершить присвоение, обязательно закрывайте кавычку перед точкой с запятой: ФормСтрока = "Л = ru_RU;ДП=Истина";.
Функция СтрЗаменить() не изменяет переданную в нее переменную «на месте». Она обрабатывает строку и возвращает новый результат. Поэтому ее нельзя вызывать как отдельную команду. Результат работы функции обязательно нужно присвоить переменной:
ПрописьЧисла = СтрЗаменить(ПрописьЧисла, "00", "");
Для удаления дробной части при работе с функцией ЧислоПрописью всегда используйте штатную настройку разрядности в параметрах предмета исчисления (9-й параметр, равный 0). Это гарантирует стабильную работу программы, исключает появление багов при изменении входных данных и соответствует стандартам разработки фирмы «1С».