При работе с иностранными контрагентами, особенно из Китая, программисты 1С часто сталкиваются с нестандартной задачей — формированием суммы прописью для китайского юаня. Основная сложность заключается в том, что в отличие от привычного деления «рубли-копейки» или «доллары-центы», юань имеет трехкомпонентную структуру: 1 юань делится на 10 цзяо (角), а 1 цзяо — на 10 фэней (分). Таким образом, 1 юань равен 100 фэням, но в промежутке обязательно присутствуют цзяо.
Стандартный механизм 1С 7.7, использующий файлы прописи с расширением .spl, жестко ориентирован на двухкомпонентную систему. Рассмотрим подробнее, почему не получится обойтись простым редактированием файла прописи и как правильно реализовать эту задачу программным путем.
Файл прописи 1С 7.7 имеет фиксированную структуру заголовка, где задаются названия для целой части и одной дробной части (копеек). Программа ожидает, что дробная часть — это число от 0 до 99. Попытка внедрить в этот механизм третье звено (цзяо) не увенчается успехом, так как система просто не знает о существовании промежуточного разряда. Если мы пропишем «цзяо» как название копеек, мы потеряем «фэни», и наоборот.
Разберем, какие специфические требования предъявляются к финансовой прописи в Китае, чтобы учесть их в нашем коде:
Поскольку стандартная функция ЧислоПрописью() нам не подходит в полной мере, проанализируем ситуацию и создадим собственную функцию. Нам необходимо вручную разложить сумму на три составляющие и собрать их в одну строку. Выясним причину, по которой математическое разделение должно быть очень точным.
Для начала рассмотрим логику выделения частей суммы:
// Выделяем целую часть — юани
КоличествоЮаней = Цел(Сумма);
// Вычисляем общее количество копеек (фэней)
ВсегоКопеек = Окр((Сумма - КоличествоЮаней) * 100, 0);
// Выделяем цзяо (десятые части)
КоличествоЦзяо = Цел(ВсегоКопеек / 10);
// Выделяем оставшиеся фэни (единичные копейки)
КоличествоФэней = ВсегоКопеек % 10;
Теперь, когда у нас есть все три компонента, мы можем собрать их. Если нам нужна пропись на английском языке (пиньинь) или на русском, мы можем использовать стандартную функцию для каждой части отдельно, либо написать простой сопоставитель чисел и слов.
Посмотрим на пример функции, которая собирает пропись, обходя ограничения системы. Важно понимать, что в 1С 7.7 функция ЧислоПрописью() работает через файлы прописи. Чтобы не создавать три разных файла, мы можем передавать параметры прямо в строке вызова (если это поддерживается компонентой) или использовать временную подмену файла прописи.
Однако более надежным методом будет создание массива или списка соответствий для чисел. Разберем по шагам реализацию на примере латиницы (Yuan, Jiao, Fen):
Функция глСуммаПрописьюЮань(Сумма) Экспорт
Перем ТекстПрописи;
Юани = Цел(Сумма);
Остаток = Окр((Сумма - Юани) * 100, 0);
Цзяо = Цел(Остаток / 10);
Фэни = Остаток % 10;
// Формируем пропись юаней (используем стандартный spl для USD или создаем свой для Yuan)
// Предположим, у нас есть файл CNY.spl, где прописаны только юани
ТекстЮани = ЧислоПрописью(Юани, "CNY.spl", " ");
// Формируем части для Цзяо и Фэней
ТекстЦзяо = "";
Если Цзяо > 0 Тогда
ТекстЦзяо = СокрЛП(Строка(Цзяо)) + " jiao";
КонецЕсли;
ТекстФэни = "";
Если Фэни > 0 Тогда
ТекстФэни = СокрЛП(Строка(Фэни)) + " fen";
КонецЕсли;
// Собираем итоговую строку
Результат = ТекстЮани;
Если ПустаяСтрока(ТекстЦзяо) = 0 Тогда
Результат = Результат + " " + ТекстЦзяо;
КонецЕсли;
Если ПустаяСтрока(ТекстФэни) = 0 Тогда
Результат = Результат + " " + ТекстФэни;
КонецЕсли;
// Добавляем окончание "Zheng" (Only), если нет дробной части
Если Остаток = 0 Тогда
Результат = Результат + " Only";
КонецЕсли;
Возврат Результат;
КонецФункции
Если ваша задача требует вывода иероглифов Дасе, стандартный механизм ЧислоПрописью() полностью исключается. В этом случае нам необходимо создать таблицу соответствий для цифр и разрядов (десятки, сотни, тысячи, десятки тысяч — «Вань»).
Проанализируем основные соответствия для финансового написания:
При написании функции на 1С 7.7 для иероглифической прописи, рекомендуется использовать СписокЗначений или ТаблицуЗначений, куда заранее загружены соответствия цифр. Программа должна будет перебирать число по разрядам справа налево или слева направо, подставляя нужный иероглиф разряда. Для решения технической подзадачи вывода таких символов на печать подойдёт способ реализации печати иероглифов из 1С.
В процессе разработки часто возникает проблема «0.999999» при вычитании целой части из числа с плавающей точкой. В 1С 7.7 это может привести к тому, что вместо 14 фэней вы получите 13 или 0. Чтобы этого избежать, всегда используйте функцию Окр(Число, 2) перед началом любых манипуляций с дробной частью.
Выясним причину ошибки: переменные типа «Число» в 1С хранятся с определенной точностью, и при умножении (3.14 - 3) * 100 результат может быть равен 13.99999999999997. Функция Цел() от такого числа вернет 13, что приведет к финансовой ошибке в печатной форме.
Правильный подход выглядит так:
СуммаДляОбработки = Окр(Сумма, 2);
ЦелаяЧасть = Цел(СуммаДляОбработки);
ДробнаяЧасть = Цел(Окр((СуммаДляОбработки - ЦелаяЧасть) * 100, 0));
Мы проанализировали специфику китайской валюты и технические ограничения платформы 1С 7.7. Подведем итоги:
.spl не подходит для полноценной прописи CNY из-за наличия «цзяо».глСуммаПрописьюЮань, которая самостоятельно разбивает число на три компонента.Используя предложенные методы, вы сможете корректно выводить суммы в юанях для любых печатных форм, обеспечивая соответствие требованиям как международных, так и локальных китайских стандартов учета.