Как вывести сумму прописью в печатной форме документа в 1С?

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

При работе с печатными формами документов в 1С часто возникает необходимость вывести числовую сумму не только цифрами, но и текстом, то есть "прописью" — для этого есть редактор печатных форм с поддержкой вывода суммы прописью. Это особенно актуально для договоров, кассовых ордеров и других финансовых документов, где такой формат является обязательным. В этом материале мы подробно рассмотрим, как решить эту задачу в системе 1С, используя встроенные механизмы платформы.

Основа решения: функция ЧислоПрописью()

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

Давайте разберем синтаксис этой функции и ее параметры, чтобы использовать ее максимально эффективно.

Синтаксис и параметры функции ЧислоПрописью()

Функция ЧислоПрописью() имеет следующий синтаксис:

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

Рассмотрим каждый параметр более детально:

  1. <Число>

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

  2. <ФорматнаяСтрока>

    Необязательный строковый параметр, который содержит различные параметры форматирования, разделенные точкой с запятой (;). Именно здесь мы определяем язык вывода и другие важные опции. Рассмотрим наиболее важные из них:

    • Л (или L): Код локализации. Этот параметр указывает язык, на котором будет формироваться пропись. Например, для русского языка используем ru_RU, для английского – en_US (поможет инструмент для автоматического перевода печатных форм 1С), для белорусского – be_BY и так далее. Если этот параметр не указан, по умолчанию используется код локализации, установленный в операционной системе.
    • ДП (или FS): Определяет, как форматировать дробную часть. Если установлено значение Истина, дробная часть будет выведена прописью. Если Ложь – числом. По умолчанию этот параметр равен Ложь. Например, для вывода "пятьдесят тысяч рублей 00 копеек" или "пятьдесят тысяч рублей ноль копеек".
    • НП (или SN): Определяет, включать ли название предмета исчисления (например, "рублей"). Это булево значение, по умолчанию Истина. Если установить в Ложь, получим "одна тысяча пятьсот" вместо "одна тысяча пятьсот рублей".
    • НД (или FN): Определяет, включать ли название десятичных частей предмета исчисления (например, "копеек"). Это булево значение, по умолчанию Истина.
  3. <ПараметрыПредметаИсчисления>

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

    Для русского и белорусского языков (ru_RU, be_BY) строка выглядит следующим образом:

    "рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2"

    Разберем каждую часть этой строки:

    • рубль, рубля, рублей: Это склонения для целой части предмета исчисления (валюты). Они указываются в следующем порядке:
      1. единственное число именительный падеж (один рубль)
      2. единственное число родительный падеж (нет одного рубля)
      3. множественное число родительный падеж (пять рублей)
    • м: Род предмета исчисления. Здесь м означает мужской род, ж – женский, с – средний. Для рубля это мужской род.
    • копейка, копейки, копеек: Аналогично склонениям для целой части, это склонения для дробной части предмета исчисления (копеек). Порядок тот же: именительный падеж ед.ч., родительный падеж ед.ч., родительный падеж мн.ч.
    • ж: Род дробной части. Для копейки это женский род.
    • 2: Количество разрядов дробной части. По умолчанию это 2, что соответствует копейкам. Мы можем изменить это значение, например, на 0, если не хотим выводить копейки прописью вовсе.

Примеры использования функции ЧислоПрописью()

Давайте рассмотрим несколько практических примеров, чтобы лучше понять, как применять эту функцию.

Пример 1: Вывод простой суммы прописью

Предположим, у нас есть сумма 1500, и мы хотим вывести ее прописью на русском языке.

ЧислоПрописью(1500, "Л=ru_RU;ДП=Истина;")

Этот код вернет строку "одна тысяча пятьсот". Обратите внимание, что без указания параметров предмета исчисления, название валюты не будет добавлено.

Пример 2: Вывод суммы с валютой и копейками

Наиболее частый сценарий — это вывод денежной суммы с указанием валюты и ее дробной части (копеек).

В нашем случае, когда автор темы запрашивал "...составляет 50 000 рублей (Пятьдесят тысяч рублей)...", нам нужно вывести и целую, и дробную часть, а также название валюты.

Рассмотрим, как это сделать для суммы, например, 50000:


СуммаДоговора = 50000;
ФормСтрока = "Л = ru_RU; ДП = Истина"; // Язык русский, дробная часть прописью
ПарПредмета = "рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2"; // Параметры для рублей и копеек
ПрописьЧисла = ЧислоПрописью(СуммаДоговора, ФормСтрока, ПарПредмета);
// ПрописьЧисла будет содержать "Пятьдесят тысяч рублей ноль копеек"

Если мы хотим, чтобы копейки не выводились прописью, а были просто числом (например, "Пятьдесят тысяч рублей 00 копеек"), или если нам нужно убрать копейки совсем, мы можем изменить параметр ДП или количество разрядов.

Чтобы копейки не выводились прописью, а выводились числом (поведение по умолчанию для ДП=Ложь, но лучше указать явно):


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

Чтобы копейки не выводились вовсе:


СуммаДоговора = 50000;
ФормСтрока = "Л = ru_RU; ДП = Истина"; // Язык русский, дробная часть прописью (но ее не будет)
ПарПредмета = "рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 0"; // Указываем 0 разрядов для дробной части
ПрописьЧисла = ЧислоПрописью(СуммаДоговора, ФормСтрока, ПарПредмета);
// ПрописьЧисла будет содержать "Пятьдесят тысяч рублей"

Пример 3: Вывод нескольких сумм прописью в одном документе

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

Рассмотрим пример из обсуждаемой темы, где нужно вывести сумму гонорара и половину этой суммы прописью:


// Предположим, мы находимся в процедуре формирования печатной формы
// и у нас уже есть объект Макет.

// *** Первое число прописью (СуммаГонорара) ***
СуммаГонорара = 12345.67; // Пример исходной суммы

// Получаем числовое значение для первой суммы
СуммаАвторам = СуммаГонорара;

// Устанавливаем параметры форматирования
ФормСтрока = "Л = ru_RU; ДП = Истина"; // Русский язык, дробная часть прописью
ПарПредмета = "рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2"; // Рубли и копейки

// Вызываем функцию ЧислоПрописью() для первой суммы
ПрописьЧислаГонорара = ЧислоПрописью(СуммаГонорара, ФормСтрока, ПарПредмета);

// Присваиваем полученную строку параметру макета
Макет.Параметры.СуммаПрописьюГонорара = ПрописьЧислаГонорара; 
// Например, "Двенадцать тысяч триста сорок пять рублей шестьдесят семь копеек"

// *** Второе число прописью (СуммаПополам) ***
// Вычисляем вторую сумму (половина гонорара, округленная до 2 знаков)
СуммаПополам = СуммаГонорара / 2;
СуммаПополам = Окр(СуммаПополам, 2); // Округляем до копеек

// Устанавливаем параметры форматирования (могут быть те же или другие)
// ФормСтрока = "Л = ru_RU; ДП = Истина"; // Можно переиспользовать или определить заново
// ПарПредмета = "рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2"; // Можно переиспользовать или определить заново

// Вызываем функцию ЧислоПрописью() для второй суммы
ПрописьЧислаПополам = ЧислоПрописью(СуммаПополам, ФормСтрока, ПарПредмета);

// Присваиваем полученную строку другому параметру макета
Макет.Параметры.СуммаДолиПрописью = ПрописьЧислаПополам; 
// Например, "Шесть тысяч сто семьдесят два рубля тридцать четыре копейки"

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

Размещение кода и работа с макетами

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

  1. Где размещать код:

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

  2. Работа с макетами печатных форм:

    Для того чтобы сумма прописью появилась в печатной форме, необходимо выполнить следующие шаги — пригодится конструктор для создания печатных форм без программирования.

    1. Определите область в макете: Откройте макет вашей печатной формы (например, в конфигураторе или через меню "Файл" -> "Открыть" для внешних форм). В нужной области макета (например, в области "ШапкаДоговора" или "ДеталиДоговора") определите ячейку, где должна выводиться сумма прописью.
    2. Создайте параметр макета: В этой ячейке или в свойствах области создайте параметр. Для этого выберите ячейку, откройте ее свойства (обычно Ctrl+Shift+S) и укажите "Параметр" в поле "Тип". Дайте параметру понятное имя, например, СуммаПрописью.
    3. Получите числовое значение суммы: В вашем коде (в модуле объекта или внешней обработке) получите числовое значение суммы из реквизитов документа или рассчитайте его. Например, СуммаДокумента = Объект.СуммаДоговора;.
    4. Преобразуйте число в строку прописью: Используйте функцию ЧислоПрописью(), как мы рассмотрели выше, чтобы преобразовать число в текстовую строку. Например:
      
      Пропись = ЧислоПрописью(СуммаДокумента, "Л=ru_RU;ДП=Истина", "рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2");
      
    5. Присвойте полученную строку параметру макета: После получения строки прописью, присвойте ее соответствующему параметру макета: Макет.Параметры.СуммаПрописью = Пропись;

      Если вы используете области макета, то это будет выглядеть так:

      ОбластьМакета.Параметры.СуммаПрописью = Пропись;
    6. Выведите область: В конце процедуры формирования печатной формы не забудьте вывести область, в которой содержится ваш параметр: ТабличныйДокумент.Вывести(ОбластьМакета);

Важные моменты и советы

При работе с функцией ЧислоПрописью() и формированием печатных форм, обратите внимание на следующие рекомендации:

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

← На главную