Как получить сумму прописью в китайских юанях (CNY) на английском и русском языках в 1С

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

При работе с внешнеэкономической деятельностью (ВЭД) часто возникает задача корректного отображения денежных сумм в иностранных валютах. Китайский юань (CNY/RMB) имеет свои особенности: он делится на 10 цзяо (jiao), которые, в свою очередь, делятся на 10 фэней (fen). Таким образом, 1 юань равен 100 фэням, но в разговорной и официальной речи часто выделяется промежуточная единица — цзяо.

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

Вариант 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

Разберем структуру строки параметров:

Для русского языка параметры будут выглядеть аналогично, но с учетом правил склонения (хотя 1С для английского языка требует меньше форм, для русского их нужно больше — три формы для целой части и три для дробной):


// Пример вывода на русском языке
ПараметрыВалюты = "юань, юаня, юаней, м, фэнь, фэня, фэней, м, 2";
Результат = ЧислоПрописью(Сумма, "L=ru_RU; DP=Истина", ПараметрыВалюты);

Вариант 2: Реализация трехкомпонентной суммы (Юань, Цзяо, Фэнь)

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

Проанализируем ситуацию: нам нужно отдельно получить количество целых юаней, количество полных цзяо (первый знак после запятой) и количество фэней (второй знак после запятой).

Рассмотрим пример кода, реализующий такой подход:


Функция СуммаЮанейПрописьюАнглийский(Сумма)
    
    ЦелаяЧасть = Цел(Сумма);
    ДробнаяЧасть = (Сумма - ЦелаяЧасть) * 100;
    
    КоличествоЦзяо = Цел(ДробнаяЧасть / 10);
    КоличествоФеней = Цел(ДробнаяЧасть % 10);
    
    // Получаем пропись для юаней
    // Используем "пустышки" для дробной части, чтобы получить только целую
    ПараметрыЮань = "yuan, yuans, , , 0";
    ПрописьЮань = ЧислоПрописью(ЦелаяЧасть, "L=en_US; DP=False", ПараметрыЮань);
    
    // Формируем итоговую строку
    Результат = ПрописьЮань;
    
    Если КоличествоЦзяо > 0 Тогда
        Результат = Результат + " " + КоличествоЦзяо + " jiao";
    КонецЕсли;
    
    Если КоличествоФеней > 0 Тогда
        Результат = Результат + " " + КоличествоФеней + " fen";
    КонецЕсли;
    
    // В международной практике принято добавлять "Only" в конце
    Возврат Результат + " Only";
    
КонецФункции

Вариант 3: Комбинированный метод с использованием ЧислоПрописью для каждого сегмента

Чтобы избежать написания цифр (1 jiao, 2 fen) и получить полностью текстовое представление (One jiao, Two fens), мы можем вызвать ЧислоПрописью трижды. Посмотрим на этот алгоритм подробнее:

  1. Выделяем целую часть (юани) и переводим в строку.
  2. Выделяем десятые доли (цзяо) как целое число и переводим в строку.
  3. Выделяем сотые доли (фэни) как целое число и переводим в строку.
  4. Соединяем полученные части, следя за грамматикой.

// Более продвинутый метод сборки строки
КоличествоЮаней = Цел(Сумма);
КоличествоЦзяо  = Цел(Окр(Сумма - КоличествоЮаней, 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";

Важные замечания по оформлению финансовых документов

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

Проанализировав вышеописанные способы, можно сделать вывод: для большинства отчетов в 1С достаточно первого (штатного) варианта с использованием параметров yuan, yuans, fen, fens. Это корректно с точки зрения математики и понятно зарубежным партнерам. Если же требуется строгое соблюдение лингвистических традиций Китая с выделением цзяо, следует использовать программное разделение суммы, как показано в вариантах 2 и 3.

← На главную