Как вывести сумму прописью на английском языке в 1С?

Программист 1С v8.3 (Управляемые формы) 1С:Управление нашей фирмой IT и автоматизация бизнеса
← На главную

При формировании печатных форм для международных контрактов, инвойсов или двуязычных документов часто требуется продублировать сумму прописью на английском языке. Разберем, как реализовать вывод суммы прописью на английском в 1С:Предприятие (в частности, в конфигурации «Управление нашей фирмой») и почему стандартные функции конфигурации не всегда подходят для этой задачи.

Анализ типовых механизмов и их ограничений

В типовых конфигурациях, таких как 1С:УНФ, для формирования суммы прописью часто используется процедура общего модуля РаботаСКурсамиВалют.СформироватьСуммуПрописью. Посмотрим на типовую реализацию подобной функции:


Функция СформироватьСуммуПрописью(СуммаЧислом, Валюта, ВыводитьСуммуБезКопеек = Ложь) Экспорт
    
    Сумма = ?(СуммаЧислом < 0, -СуммаЧислом, СуммаЧислом);
    ПараметрыПредмета = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Валюта, "ПараметрыПрописиНаРусском");
    
    Результат = ЧислоПрописью(Сумма, "Л=ru_RU;ДП=Ложь", ПараметрыПредмета.ПараметрыПрописиНаРусском);
    
    Если ВыводитьСуммуБезКопеек И Цел(Сумма) = Сумма Тогда
        Результат = Лев(Результат, СтрНайти(Результат, "0") - 1);
    КонецЕсли;
    
    Возврат Результат;
    
КонецФункции

Проанализируем этот код и выясним причину, по которой типовой вызов не переводит сумму на английский язык:

  1. В справочнике Валюты по умолчанию хранится только реквизит ПараметрыПрописиНаРусском.
  2. Форматная строка жестко фиксирует локаль Л=ru_RU. Даже если передать ссылку на валюту USD, типовой метод сформирует русскоязычный текст (например, «Сто долларов 00 центов»).

Использование платформенной функции ЧислоПрописью

Платформа 1С:Предприятие нативно поддерживает англоязычную пропись чисел. Для этого используется встроенная функция ЧислоПрописью с указанием соответствующей локали в форматной строке и передачей параметров предмета исчисления на английском языке.

Синтаксис функции:

ЧислоПрописью(<Число>, <ФорматнаяСтрока>, <ПараметрыПредметаИсчисления>)

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

  1. Форматная строка: задает язык и правила вывода. Основной параметр — локаль Л=en_US (или Л=en_GB). Дополнительно можно управлять выводом копеек: ДП=Истина (дробная часть словами) или ДП=Ложь (дробная часть цифрами).
  2. Параметры предмета исчисления: строка из 9 параметров, разделенных запятыми:
    • Форма единственного числа целой части (например, dollar);
    • Форма множественного числа целой части (например, dollars);
    • Форма множественного числа целой части (для английского совпадает: dollars);
    • Род целой части (m — мужской, f — женский, n — средний);
    • Форма единственного числа дробной части (например, cent);
    • Форма множественного числа дробной части (например, cents);
    • Форма множественного числа дробной части (для английского совпадает: cents);
    • Род дробной части (m);
    • Разрядность дробной части (обычно 2).

Примеры формирования прописи для разных валют

Рассмотрим готовые строки параметров для наиболее распространенных валют:

  1. Доллары США: "dollar, dollars, dollars, m, cent, cents, cents, m, 2"
  2. Евро: "euro, euros, euros, m, cent, cents, cents, m, 2"
  3. Российские рубли: "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);
    КонецЕсли;
    
    Возврат Результат;
    
КонецФункции

Варианты интеграции в конфигурацию

Для постоянного использования англоязычной прописи в базе вы можете выбрать один из следующих подходов:

  1. Через расширение конфигурации: добавить в справочник Валюты реквизит ПараметрыПрописиНаАнглийском (тип Строка) и заполнить его для нужных валют.
  2. Через дополнительные реквизиты: использовать типовой механизм БСП «Дополнительные реквизиты и сведения» без изменения структуры конфигурации.
  3. Программное сопоставление в модуле печати: сопоставлять валюту документа с жестко заданными параметрами, как продемонстрировано в примере выше.
← На главную