При формировании печатных форм для международных контрактов, инвойсов или двуязычных документов часто требуется продублировать сумму прописью на английском языке. Разберем, как реализовать вывод суммы прописью на английском в 1С:Предприятие (в частности, в конфигурации «Управление нашей фирмой») и почему стандартные функции конфигурации не всегда подходят для этой задачи.
В типовых конфигурациях, таких как 1С:УНФ, для формирования суммы прописью часто используется процедура общего модуля РаботаСКурсамиВалют.СформироватьСуммуПрописью. Посмотрим на типовую реализацию подобной функции:
Функция СформироватьСуммуПрописью(СуммаЧислом, Валюта, ВыводитьСуммуБезКопеек = Ложь) Экспорт
Сумма = ?(СуммаЧислом < 0, -СуммаЧислом, СуммаЧислом);
ПараметрыПредмета = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Валюта, "ПараметрыПрописиНаРусском");
Результат = ЧислоПрописью(Сумма, "Л=ru_RU;ДП=Ложь", ПараметрыПредмета.ПараметрыПрописиНаРусском);
Если ВыводитьСуммуБезКопеек И Цел(Сумма) = Сумма Тогда
Результат = Лев(Результат, СтрНайти(Результат, "0") - 1);
КонецЕсли;
Возврат Результат;
КонецФункции
Проанализируем этот код и выясним причину, по которой типовой вызов не переводит сумму на английский язык:
Валюты по умолчанию хранится только реквизит ПараметрыПрописиНаРусском.Л=ru_RU. Даже если передать ссылку на валюту USD, типовой метод сформирует русскоязычный текст (например, «Сто долларов 00 центов»).Платформа 1С:Предприятие нативно поддерживает англоязычную пропись чисел. Для этого используется встроенная функция ЧислоПрописью с указанием соответствующей локали в форматной строке и передачей параметров предмета исчисления на английском языке.
Синтаксис функции:
ЧислоПрописью(<Число>, <ФорматнаяСтрока>, <ПараметрыПредметаИсчисления>)
Разберем структуру параметров подробнее:
Л=en_US (или Л=en_GB). Дополнительно можно управлять выводом копеек: ДП=Истина (дробная часть словами) или ДП=Ложь (дробная часть цифрами).dollar);dollars);dollars);m — мужской, f — женский, n — средний);cent);cents);cents);m);2).Рассмотрим готовые строки параметров для наиболее распространенных валют:
"dollar, dollars, dollars, m, cent, cents, cents, m, 2""euro, euros, euros, m, cent, cents, cents, m, 2""ruble, rubles, rubles, m, kopek, kopeks, kopeks, m, 2"Посмотрим на пример вызова функции в программном коде:
Сумма = 6330.28;
// Вывод суммы в долларах (дробная часть цифрами)
СтрокаUSD = ЧислоПрописью(Сумма, "Л=en_US; ДП=Ложь", "dollar, dollars, dollars, m, cent, cents, cents, m, 2");
// Результат: "six thousand three hundred thirty dollars 28 cents"
// Вывод суммы в рублях (дробная часть прописью)
СтрокаRUB = ЧислоПрописью(Сумма, "Л=en_US; ДП=Истина", "ruble, rubles, rubles, m, kopek, kopeks, kopeks, m, 2");
// Результат: "six thousand three hundred thirty rubles twenty eight kopeks"
Создадим функцию, которую можно вызывать в печатных формах или внешних печатных формах для получения текста с заглавной буквы и корректным форматированием:
Функция СформироватьСуммуПрописьюНаАнглийском(СуммаЧислом, КодВалюты = "USD", ДробнаяЧастьПрописью = Ложь) Экспорт
Сумма = ?(СуммаЧислом < 0, -СуммаЧислом, СуммаЧислом);
// Определяем параметры предмета исчисления по коду валюты
ПараметрыВалюты = "";
Если ВРег(СокрЛП(КодВалюты)) = "USD" Или КодВалюты = "840" Тогда
ПараметрыВалюты = "dollar, dollars, dollars, m, cent, cents, cents, m, 2";
ИначеЕсли ВРег(СокрЛП(КодВалюты)) = "EUR" Или КодВалюты = "978" Тогда
ПараметрыВалюты = "euro, euros, euros, m, cent, cents, cents, m, 2";
ИначеЕсли ВРег(СокрЛП(КодВалюты)) = "RUB" Или КодВалюты = "643" Тогда
ПараметрыВалюты = "ruble, rubles, rubles, m, kopek, kopeks, kopeks, m, 2";
КонецЕсли;
ФорматнаяСтрока = "Л=en_US; ДП=" + ?(ДробнаяЧастьПрописью, "Истина", "Ложь");
Результат = ЧислоПрописью(Сумма, ФорматнаяСтрока, ПараметрыВалюты);
// Платформа формирует текст с маленькой буквы — делаем первую букву заглавной
Если Не ПустаяСтрока(Результат) Тогда
Результат = ВРег(Лев(Результат, 1)) + Сред(Результат, 2);
КонецЕсли;
Возврат Результат;
КонецФункции
Для постоянного использования англоязычной прописи в базе вы можете выбрать один из следующих подходов:
Валюты реквизит ПараметрыПрописиНаАнглийском (тип Строка) и заполнить его для нужных валют.