При разработке печатных форм в среде 1С:Предприятие 8 (в частности, в конфигурации БГУ 1.0 на обычных формах) программисты часто сталкиваются с необходимостью вывода итоговой суммы документа прописью. Казалось бы, задача тривиальная: есть стандартная функция ЧислоПрописью(), которую нужно вызвать перед выводом области макета. Однако на практике часто возникает системная ошибка: "Ошибка при вызове метода контекста ЧислоПрописью: несоответствие типов (параметр №1)". Проанализируем, почему это происходит и как правильно организовать вывод данных в макет.
Проанализируем ситуацию, описанную в теме. Разработчик использует переменную ИтогВсего, которая формируется с помощью вспомогательной функции ФорматСумм(). Основная проблема заключается в том, что функция ЧислоПрописью(Сумма, Параметры, Валюта) ожидает в качестве первого аргумента значение типа Число. Если же в нее передать строку (даже если в этой строке написаны цифры), платформа выдаст ошибку несоответствия типов.
Почему обычное приведение типов через Число(ИтогВсего) часто не срабатывает? Выясним причину. Когда число проходит через функцию форматирования (например, Формат()), оно превращается в строку, где могут присутствовать:
Стандартная функция Число() не умеет автоматически "очищать" такие строки и выдает ошибку при попытке преобразования. Рассмотрим правильные подходы к решению этой задачи.
Самый надежный способ избежать ошибок преобразования — не пытаться конвертировать отформатированную строку обратно в число. Вместо этого следует использовать исходное числовое значение, которое еще не подвергалось форматированию. Рассмотрим, как изменить код вывода печатной формы, чтобы данные выводились корректно.
Допустим, у нас есть табличная часть Услуги. Вместо того чтобы брать готовую строку ИтогВсего, мы можем получить сумму напрямую из коллекции строк или объекта документа.
// В процедуре Печать(Элемент)
Подвал = Макет.ПолучитьОбласть("Подвал");
// 1. Получаем чистое число напрямую из табличной части документа
СуммаДляПрописи = Услуги.Итог("Сумма");
// 2. Формируем сумму прописью, используя системную функцию
// Параметры прописи можно оставить пустыми для использования настроек по умолчанию (рубли)
ТекстПрописью = ЧислоПрописью(СуммаДляПрописи, "L=ru_RU", "рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2");
// 3. Передаем значение в параметр макета
Подвал.Параметры.ИтогВсегоПрописью = ТекстПрописью;
// Выводим область в табличный документ
ТабДок.Вывести(Подвал);
Если по каким-то причинам у вас на руках есть только строка (например, она пришла из внешнего источника или сложного алгоритма), ее необходимо очистить перед использованием в ЧислоПрописью(). Проанализируем, какие манипуляции со строкой нам понадобятся.
Основная проблема строк в 1С — неразрывный пробел (НПП). Рассмотрим функцию, которая безопасно преобразует строку в число:
// Пример очистки строки от мусора и пробелов
СтрокаСуммы = "2 260.00"; // Здесь пробел может быть неразрывным
// Удаляем неразрывные пробелы
ЧистаяСтрока = СтрЗаменить(СтрокаСуммы, Символы.НПП, "");
// Удаляем обычные пробелы на всякий случай
ЧистаяСтрока = СтрЗаменить(ЧистаяСтрока, " ", "");
Попытка
ЧисловоеЗначение = Число(ЧистаяСтрока);
Результат = ЧислоПрописью(ЧисловоеЗначение);
Исключение
Сообщить("Не удалось преобразовать строку '" + СтрокаСуммы + "' в число!");
КонецПопытки;
Важный момент: если ваша функция форматирования уже добавила к строке валюту (например, "2260.00 руб."), то функция Число() гарантированно выдаст ошибку. В таком случае использование строковых функций для "выкусывания" цифр не рекомендуется — это делает код хрупким. Лучше вернуться к Решению №1.
В конфигурации "Бухгалтерия государственного учреждения" (БГУ) часто существуют встроенные общие модули для работы с валютами. Проанализируем ситуацию, когда нам нужно вывести сумму с учетом конкретной валюты документа. В БГУ обычно используется справочник Валюты, в котором хранятся параметры прописи.
Рассмотрим пример кода, который использует параметры валюты для формирования корректного текста:
// Допустим, ВалютаДокумента — это ссылка на справочник Валюты
ВалютаДокумента = ЭтотОбъект.ВалютаДокумента;
СуммаЧислом = ЭтотОбъект.Услуги.Итог("Сумма");
// Получаем параметры прописи из карточки валюты
ПараметрыПрописи = ВалютаДокумента.ПараметрыПрописиНаРусском;
Если ПустаяСтрока(ПараметрыПрописи) Тогда
// Если параметры не заданы в справочнике, используем стандарт для рубля
ТекстПрописью = ЧислоПрописью(СуммаЧислом, "L=ru_RU", "рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2");
Иначе
// Используем настройки из валюты
ТекстПрописью = ЧислоПрописью(СуммаЧислом, "L=ru_RU", ПараметрыПрописи);
КонецЕсли;
Подвал.Параметры.СуммаПрописью = ТекстПрописью;
Разберем по шагам, как подготовить сам макет в конфигураторе, чтобы параметры заполнялись корректно:
СуммаПрописью.Область.Параметры.СуммаПрописью = ....Совет: Если вы используете конструктор печатных форм, помните, что при повторном его использовании все ваши ручные правки в коде модуля будут удалены. Чтобы этого избежать, переносите логику в отдельные процедуры или делайте копию кода перед использованием конструктора.
Подведем итог нашего анализа. Чтобы успешно вывести число прописью и избежать ошибок:
ЧислоПрописью() должна получать на вход только тип Число.Итог("ИмяКолонки") табличной части — он всегда возвращает число.Валюты.ЧислоПрописью() результата работы функций Формат() или пользовательских функций типа ФорматСумм().Соблюдение этих простых правил сделает ваш код надежным, а печатные формы будут работать без ошибок при любых значениях сумм.