Как вывести копейки и валюту прописью без целой части числа в 1С

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

При разработке печатных форм договоров, актов и других первичных документов программисты 1С часто сталкиваются с жесткими требованиями к оформлению сумм. Одно из классических требований звучит так: «на общую сумму 14 700 (Четырнадцать тысяч семьсот) рублей 00 копеек».

С выводом целой части прописью в скобках проблем обычно не возникает — для этого используется стандартная системная функция ЧислоПрописью. Однако за скобками нам необходимо вывести только параметры предмета исчисления и копейки (в нашем примере: «рублей 00 копеек»), полностью исключив из этой части повторный вывод числа «14 700» прописью.

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

Способ 1. Строковая обработка результата системной функции (Быстрый метод)

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

Давайте проанализируем этот подход. Мы можем сформировать полную пропись числа с валютой, а затем найти вхождение подстроки «рубл» (чтобы гарантированно поймать «рубль», «рубля» или «рублей» в зависимости от окончания) и вырезать всё, что идет после нее, включая саму валюту.

Рассмотрим пример реализации:


// Исходная сумма для вывода
СуммаДокумента = 14700.00;

// Формируем полную пропись числа с копейками
ФорматнаяСтрока = "Л=ru_RU; ДП=Ложь";
ПараметрыВалюты = "рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2";
ПолнаяПропись = ЧислоПрописью(СуммаДокумента, ФорматнаяСтрока, ПараметрыВалюты);
// Результат: "Четырнадцать тысяч семьсот рублей 00 копеек"

// Находим позицию начала названия валюты
ПозицияВалюты = Найти(НРег(ПолнаяПропись), "рубл");

Если ПозицияВалюты > 0 Тогда
    // Вырезаем подстроку начиная с найденной позиции
    ТолькоВалютаИКопейки = Сред(ПолнаяПропись, ПозицияВалюты);
Иначе
    // Резервный вариант на случай непредвиденного формата
    ТолькоВалютаИКопейки = "рублей 00 копеек";
КонецЕсли;

// Теперь мы можем легко собрать итоговую строку для печати:
СтрокаДляПечати = "на общую сумму " + Формат(СуммаДокумента, "ЧДЦ=2; ЧГ=3,0") 
                + " (" + СокрЛП(ЧислоПрописью(СуммаДокумента, ФорматнаяСтрока, ",,,,,,,,0")) + ") " 
                + ТолькоВалютаИКопейки;

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

Недостатки метода: Зависимость от локализации. Если язык печатной формы изменится (например, на украинский, казахский или английский), строковый поиск слова «рубл» перестанет работать. Метод ориентирован исключительно на русскоязычную локаль.

Способ 2. Математическое разделение и функция склонения (Классический метод)

Более надежный и архитектурно правильный подход заключается в том, чтобы разделить число на целую и дробную части математически, а затем самостоятельно склонять существительные «рубль» и «копейка» в зависимости от полученных значений.

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

Для реализации этого метода нам понадобится вспомогательная функция склонения существительных по числительным (так называемая функция множественного числа). Разберем по шагам ее алгоритм:


// Функция возвращает правильную форму существительного в зависимости от числа
Функция ФормаМножественногоЧисла(Слово1, Слово2, Слово3, Знач ЦелоеЧисло) Экспорт
    
    // Приводим к абсолютному целому значению
    ЦелоеЧисло = Цел(Макс(ЦелоеЧисло, -ЦелоеЧисло));
    
    Остаток100 = ЦелоеЧисло % 100;
    Если Остаток100 > 10 И Остаток100 < 20 Тогда
        Возврат Слово3; // Например: 11, 12, 15 рублей/копеек
    КонецЕсли;
    
    Остаток10 = ЦелоеЧисло % 10;
    Если Остаток10 = 1 Тогда
        Возврат Слово1; // Например: 1, 21, 101 рубль/копейка
    ИначеЕсли Остаток10 > 1 И Остаток10 < 5 Тогда
        Возврат Слово2; // Например: 2, 3, 4, 32 рубля/копейки
    Иначе
        Возврат Слово3; // Например: 5, 10, 20, 100 рублей/копеек
    КонецЕсли;
    
КонецФункции

Теперь применим эту функцию для формирования нашей печатной строки:


СуммаДокумента = 14700.00;

// Выделяем целую часть и копейки
ЦелаяЧасть = Цел(СуммаДокумента);
ДробнаяЧасть = Окр((СуммаДокумента - ЦелаяЧасть) * 100);

// Получаем правильные склонения валют
ВалютаПрописью = ФормаМножественногоЧисла("рубль", "рубля", "рублей", ЦелаяЧасть);
КопейкиПрописью = ФормаМножественногоЧисла("копейка", "копейки", "копеек", ДробнаяЧасть);

// Форматируем вывод копеек (всегда две цифры)
СтрокаКопеек = Формат(ДробнаяЧасть, "ЧЦ=2; ЧДЦ=0; ЧН=00; ЧГ=0");

// Собираем итоговое представление дробной части и валюты
ДробнаяЧастьИВалюта = ВалютаПрописью + " " + СтрокаКопеек + " " + КопейкиПрописью;

// Получаем целую часть прописью в скобках без валюты
ЦелаяЧастьПрописью = ЧислоПрописью(ЦелаяЧасть, "Л=ru_RU; ДП=Ложь", ",,,,,,,,0");

// Итоговый вывод
РезультатСтрокой = СтрШаблон("на общую сумму %1 (%2) %3", 
    Формат(СуммаДокумента, "ЧДЦ=2; ЧГ=3,0"), 
    СокрЛП(ЦелаяЧастьПрописью), 
    ДробнаяЧастьИВалюта
);

Данный вариант гарантирует 100% стабильность работы алгоритма и корректность окончаний при любых суммах.

Способ 3. Использование встроенных механизмов БСП

Если вы ведете разработку в современной конфигурации, созданной на базе БСП (например, 1С:ERP, 1С:Комплексная автоматизация, 1С:Управление торговлей или 1С:Бухгалтерия), то вам не нужно изобретать велосипед и писать собственные функции склонения существительных.

В составе БСП есть готовый функционал для работы с числительными и склонениями. Рассмотрим два наиболее эффективных инструмента.

Вариант А. Метод СтрокаСЧисломДляЛюбогоЯзыка

В общем модуле СтроковыеФункцииКлиентСервер существует мощная замена устаревшей функции множественного числа. Мы можем использовать шаблон локализации для получения нужного склонения:


ЦелаяЧасть = Цел(СуммаДокумента);
ДробнаяЧасть = Окр((СуммаДокумента - ЦелаяЧасть) * 100);

// Извлекаем только слово "рублей/рубля/рубль" без вывода самого числа
ШаблонРубли = "L=ru; рублей; рубль; рубля; рублей";
ВалютаСклонение = СтроковыеФункцииКлиентСервер.СтрокаСЧисломДляЛюбогоЯзыка(ШаблонРубли, ЦелаяЧасть);

// Извлекаем только слово "копеек/копейки/копейка"
ШаблонКопейки = "L=ru; копеек; копейка; копейки; копеек";
КопейкиСклонение = СтроковыеФункцииКлиентСервер.СтрокаСЧисломДляЛюбогоЯзыка(ШаблонКопейки, ДробнаяЧасть);

// Формируем строковое представление копеек
СтрокаКопеек = Формат(ДробнаяЧасть, "ЧЦ=2; ЧДЦ=0; ЧН=00; ЧГ=0");

ДробнаяЧастьИВалюта = ВалютаСклонение + " " + СтрокаКопеек + " " + КопейкиСклонение;

Вариант Б. Метод СформироватьСуммуПрописью из модуля работы с валютами

Если в вашей конфигурации подключена подсистема валют, вы можете обратиться к специализированному общему модулю РаботаСКурсамиВалют. Метод автоматически берет параметры прописи валюты прямо из настроек справочника «Валюты»:


ВалютаРегламентированногоУчета = Константы.ВалютаРегламентированногоУчета.Получить(); // Или любая другая ссылка на справочник Валюты

// Функция возвращает полную сумму прописью с учетом настроек валюты
ПолнаяСуммаПрописью = РаботаСКурсамиВалют.СформироватьСуммуПрописью(СуммаДокумента, ВалютаРегламентированногоУчета);

Способ 4. Нестандартные трюки с платформенной функцией ЧислоПрописью

Мало кто знает, но возможности встроенного метода ЧислоПрописью позволяют решить задачу вывода только копеек прописью без использования стороннего кода.

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


// Выделяем копейки как целое число
КопейкиЧислом = Окр((СуммаДокумента - Цел(СуммаДокумента)) * 100);

// Передаем копейки в качестве основного предмета исчисления
КопейкиПрописью = ЧислоПрописью(КопейкиЧислом, "Л=ru_RU; НП=Истина", "копейка, копейки, копеек, ж, , , , , 0");
// При КопейкиЧислом = 0 вернет: "ноль копеек"
// При КопейкиЧислом = 15 вернет: "пятнадцать копеек"

Также стоит помнить о девятом параметре настроек предмета исчисления в ЧислоПрописью. Если передать туда значение 0, то вывод дробной части (копеек) будет полностью подавлен:


СуммаБезКопеекПрописью = ЧислоПрописью(СуммаДокумента, "Л=ru_RU; ДП=Ложь", "рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 0");
// Результат: "Четырнадцать тысяч семьсот рублей" (копейки полностью игнорируются)

Резюме и рекомендации

Выбор оптимального способа зависит от структуры и масштаба вашего проекта:

  1. Если вы работаете в современной типовой конфигурации 1С (ERP, БП 3.0, ЗУП 3), всегда используйте механизмы БСП (СтроковыеФункцииКлиентСервер.СтрокаСЧисломДляЛюбогоЯзыка) — это гарантирует соответствие стандартам разработки фирмы «1С» и избавит от лишнего дублирующего кода.
  2. Если разработка ведется в самописной конфигурации с нуля, то наилучшим выбором станет классический математический расчет с использованием собственной функции множественного числа (Способ 2) — это обеспечит надежность работы алгоритма независимо от настроек платформы и языковых пакетов операционной системы.
  3. Для простых отчетов или внешних обработок «одноразового» использования отлично подойдет быстрый строковый парсинг (Способ 1).
← На главную