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

Программист 1С v8.3 (Обычные формы) Сфера услуг, туризм и социальный сектор
← На главную

При разработке печатных форм в среде 1С:Предприятие 8 (в частности, в конфигурации БГУ 1.0 на обычных формах) программисты часто сталкиваются с необходимостью вывода итоговой суммы документа прописью. Казалось бы, задача тривиальная: есть стандартная функция ЧислоПрописью(), которую нужно вызвать перед выводом области макета. Однако на практике часто возникает системная ошибка: "Ошибка при вызове метода контекста ЧислоПрописью: несоответствие типов (параметр №1)". Проанализируем, почему это происходит и как правильно организовать вывод данных в макет.

Разбор причины ошибки: Строка против Числа

Проанализируем ситуацию, описанную в теме. Разработчик использует переменную ИтогВсего, которая формируется с помощью вспомогательной функции ФорматСумм(). Основная проблема заключается в том, что функция ЧислоПрописью(Сумма, Параметры, Валюта) ожидает в качестве первого аргумента значение типа Число. Если же в нее передать строку (даже если в этой строке написаны цифры), платформа выдаст ошибку несоответствия типов.

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

  1. Неразрывные пробелы (символ с кодом 160) в качестве разделителей групп разрядов (например, "2 260.00").
  2. Запятые вместо точек для отделения дробной части.
  3. Наименования валют или другие текстовые символы.

Стандартная функция Число() не умеет автоматически "очищать" такие строки и выдает ошибку при попытке преобразования. Рассмотрим правильные подходы к решению этой задачи.

Решение №1: Использование исходного числового значения (Лучшая практика)

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

Допустим, у нас есть табличная часть Услуги. Вместо того чтобы брать готовую строку ИтогВсего, мы можем получить сумму напрямую из коллекции строк или объекта документа.


// В процедуре Печать(Элемент)
Подвал = Макет.ПолучитьОбласть("Подвал");

// 1. Получаем чистое число напрямую из табличной части документа
СуммаДляПрописи = Услуги.Итог("Сумма"); 

// 2. Формируем сумму прописью, используя системную функцию
// Параметры прописи можно оставить пустыми для использования настроек по умолчанию (рубли)
ТекстПрописью = ЧислоПрописью(СуммаДляПрописи, "L=ru_RU", "рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2");

// 3. Передаем значение в параметр макета
Подвал.Параметры.ИтогВсегоПрописью = ТекстПрописью;

// Выводим область в табличный документ
ТабДок.Вывести(Подвал);

Решение №2: Корректное преобразование строки в число

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

Основная проблема строк в 1С — неразрывный пробел (НПП). Рассмотрим функцию, которая безопасно преобразует строку в число:


// Пример очистки строки от мусора и пробелов
СтрокаСуммы = "2 260.00"; // Здесь пробел может быть неразрывным
// Удаляем неразрывные пробелы
ЧистаяСтрока = СтрЗаменить(СтрокаСуммы, Символы.НПП, "");
// Удаляем обычные пробелы на всякий случай
ЧистаяСтрока = СтрЗаменить(ЧистаяСтрока, " ", "");

Попытка
    ЧисловоеЗначение = Число(ЧистаяСтрока);
    Результат = ЧислоПрописью(ЧисловоеЗначение);
Исключение
    Сообщить("Не удалось преобразовать строку '" + СтрокаСуммы + "' в число!");
КонецПопытки;

Важный момент: если ваша функция форматирования уже добавила к строке валюту (например, "2260.00 руб."), то функция Число() гарантированно выдаст ошибку. В таком случае использование строковых функций для "выкусывания" цифр не рекомендуется — это делает код хрупким. Лучше вернуться к Решению №1.

Решение №3: Работа с валютами в БГУ 1.0

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

Рассмотрим пример кода, который использует параметры валюты для формирования корректного текста:


// Допустим, ВалютаДокумента — это ссылка на справочник Валюты
ВалютаДокумента = ЭтотОбъект.ВалютаДокумента; 
СуммаЧислом = ЭтотОбъект.Услуги.Итог("Сумма");

// Получаем параметры прописи из карточки валюты
ПараметрыПрописи = ВалютаДокумента.ПараметрыПрописиНаРусском;

Если ПустаяСтрока(ПараметрыПрописи) Тогда
    // Если параметры не заданы в справочнике, используем стандарт для рубля
    ТекстПрописью = ЧислоПрописью(СуммаЧислом, "L=ru_RU", "рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2");
Иначе
    // Используем настройки из валюты
    ТекстПрописью = ЧислоПрописью(СуммаЧислом, "L=ru_RU", ПараметрыПрописи);
КонецЕсли;

Подвал.Параметры.СуммаПрописью = ТекстПрописью;

Как настроить макет для вывода суммы прописью

Разберем по шагам, как подготовить сам макет в конфигураторе, чтобы параметры заполнялись корректно:

  1. Откройте макет печатной формы.
  2. Найдите ячейку, где должна быть сумма прописью.
  3. В свойствах ячейки установите значение Заполнение в положение Параметр.
  4. В поле Параметр впишите имя, например, СуммаПрописью.
  5. В коде формирования печатной формы (как мы рассматривали выше) обращайтесь именно к этому имени: Область.Параметры.СуммаПрописью = ....

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

Итоги и рекомендации

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

Соблюдение этих простых правил сделает ваш код надежным, а печатные формы будут работать без ошибок при любых значениях сумм.

← На главную