При работе с внешнеэкономической деятельностью (ВЭД) часто возникает задача корректного отображения денежных сумм в иностранных валютах. Китайский юань (CNY/RMB) имеет свои особенности: он делится на 10 цзяо (jiao), которые, в свою очередь, делятся на 10 фэней (fen). Таким образом, 1 юань равен 100 фэням, но в разговорной и официальной речи часто выделяется промежуточная единица — цзяо.
В этой статье мы проанализируем, как реализовать вывод суммы прописью в юанях средствами 1С, рассмотрим штатные возможности функции ЧислоПрописью и разберем нестандартные подходы для реализации сложной структуры «юань-цзяо-фэнь».
Стандартная функция 1С ЧислоПрописью отлично справляется с двухкомпонентными валютами (например, доллар и цент, рубль и копейка). Если заказчик допускает упрощение, при котором сумма выводится в формате «целые юани и сотые доли (фэни)», мы можем воспользоваться встроенным механизмом локализации.
Рассмотрим пример настройки для английского языка. В параметрах функции необходимо указать локаль en_US и передать строку с названиями единиц:
// Пример вывода на английском языке (юани и фэни)
Сумма = 1234.56;
ПараметрыВалюты = "yuan, yuans, fen, fens, 2";
Результат = ЧислоПрописью(Сумма, "L=en_US; DP=True", ПараметрыВалюты);
// Результат: One thousand two hundred thirty-four yuans and fifty-six fens
Разберем структуру строки параметров:
yuan — название целой части в единственном числе.yuans — название целой части во множественном числе.fen — название дробной части в единственном числе.fens — название дробной части во множественном числе.2 — количество знаков после запятой (точность).Для русского языка параметры будут выглядеть аналогично, но с учетом правил склонения (хотя 1С для английского языка требует меньше форм, для русского их нужно больше — три формы для целой части и три для дробной):
// Пример вывода на русском языке
ПараметрыВалюты = "юань, юаня, юаней, м, фэнь, фэня, фэней, м, 2";
Результат = ЧислоПрописью(Сумма, "L=ru_RU; DP=Истина", ПараметрыВалюты);
Если требования документации жестко регламентируют наличие цзяо (десятых долей), штатная функция ЧислоПрописью не сможет автоматически разделить число на три составляющие, так как она рассчитана только на два уровня. В этом случае нам придется выполнить разделение суммы программно и объединить результаты.
Проанализируем ситуацию: нам нужно отдельно получить количество целых юаней, количество полных цзяо (первый знак после запятой) и количество фэней (второй знак после запятой).
Рассмотрим пример кода, реализующий такой подход:
Функция СуммаЮанейПрописьюАнглийский(Сумма)
ЦелаяЧасть = Цел(Сумма);
ДробнаяЧасть = (Сумма - ЦелаяЧасть) * 100;
КоличествоЦзяо = Цел(ДробнаяЧасть / 10);
КоличествоФеней = Цел(ДробнаяЧасть % 10);
// Получаем пропись для юаней
// Используем "пустышки" для дробной части, чтобы получить только целую
ПараметрыЮань = "yuan, yuans, , , 0";
ПрописьЮань = ЧислоПрописью(ЦелаяЧасть, "L=en_US; DP=False", ПараметрыЮань);
// Формируем итоговую строку
Результат = ПрописьЮань;
Если КоличествоЦзяо > 0 Тогда
Результат = Результат + " " + КоличествоЦзяо + " jiao";
КонецЕсли;
Если КоличествоФеней > 0 Тогда
Результат = Результат + " " + КоличествоФеней + " fen";
КонецЕсли;
// В международной практике принято добавлять "Only" в конце
Возврат Результат + " Only";
КонецФункции
Чтобы избежать написания цифр (1 jiao, 2 fen) и получить полностью текстовое представление (One jiao, Two fens), мы можем вызвать ЧислоПрописью трижды. Посмотрим на этот алгоритм подробнее:
// Более продвинутый метод сборки строки
КоличествоЮаней = Цел(Сумма);
КоличествоЦзяо = Цел(Окр(Сумма - КоличествоЮаней, 2, РежимОкругления.Окр15как2) * 10);
КоличествоФеней = Окр(Сумма * 100 - (КоличествоЮаней * 100 + КоличествоЦзяо * 10), 0);
// Юани
СтрокаЮаней = ЧислоПрописью(КоличествоЮаней, "L=en_US", "yuan, yuans, , , 1");
// Удаляем возможные "ноль дробной части"
СтрокаЮаней = СтрЗаменить(СтрокаЮаней, " zero", "");
// Цзяо
СтрокаЦзяо = ?(КоличествоЦзяо > 0, ЧислоПрописью(КоличествоЦзяо, "L=en_US", "jiao, jiao, , , 1"), "");
СтрокаЦзяо = СтрЗаменить(СтрокаЦзяо, " zero", "");
// Фэни
СтрокаФеней = ?(КоличествоФеней > 0, ЧислоПрописью(КоличествоФеней, "L=en_US", "fen, fens, , , 1"), "");
СтрокаФеней = СтрЗаменить(СтрокаФеней, " zero", "");
ИтоговаяСтрока = СтрокаЮаней + " " + СтрокаЦзяо + " " + СтрокаФеней + " Only";
Выясним причину, по которой в документах на английском языке часто используются специфические термины:
Say Chinese Yuan Renminbi [Сумма] Only.CNY для обозначения юаня в электронных системах обмена данными, так как это международный стандарт ISO 4217.Проанализировав вышеописанные способы, можно сделать вывод: для большинства отчетов в 1С достаточно первого (штатного) варианта с использованием параметров yuan, yuans, fen, fens. Это корректно с точки зрения математики и понятно зарубежным партнерам. Если же требуется строгое соблюдение лингвистических традиций Китая с выделением цзяо, следует использовать программное разделение суммы, как показано в вариантах 2 и 3.