При разработке печатных форм, таких как договоры, соглашения или акты, часто возникает необходимость вывести не одну, а несколько различных сумм прописью. Например, общую сумму контракта и доли вознаграждения для нескольких соавторов. В процессе реализации этой задачи начинающие разработчики часто сталкиваются с ошибками доступа к параметрам макета или путаницей в коде. Разберем пошагово, как правильно организовать вывод нескольких сумм прописью и избежать типичных ошибок.
Рассмотрим стандартную ситуацию: в макете договора есть несколько полей, куда должны попасть суммы в числовом виде и их расшифровка словами. Проблема, с которой столкнулся автор темы, заключалась в ошибке Поле объекта не обнаружено (СуммаДолиПрописью) при попытке присвоить значение параметру макета. Это происходит, когда программный код обращается к объекту Макет.Параметры, но не находит там переменной с указанным именем.
Проанализируем базовый алгоритм вывода суммы прописью, который использовался в примере:
// Определение параметров суммы
СуммаАвторам = СуммаГонорара;
Макет.Параметры.Сумма = СуммаАвторам;
// Настройка формата прописи
ФормСтрока = "Л = ru_RU; ДП = Истина";
ПарПредмета = "рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2";
// Преобразование и вывод
ПрописьЧисла = ЧислоПрописью(СуммаГонорара, ФормСтрока, ПарПредмета);
Макет.Параметры.СуммаПрописью = ПрописьЧисла;
Для вывода второй и последующих сумм необходимо повторить этот процесс, используя уникальные имена параметров в макете. Если вы хотите вывести вторую сумму, в макете (в ячейках) должны быть созданы соответствующие параметры, например, СуммаДоли и СуммаДолиПрописью.
Если при выполнении кода система выдает ошибку о ненахождении поля, проанализируем следующие моменты:
Макет.Параметры.... Часто путают кириллическую «с» и латинскую «c».Функция ЧислоПрописью() является универсальным инструментом. Рассмотрим подробнее ее синтаксис, чтобы понимать, как адаптировать ее под разные нужды (суммы, сроки, количество).
Синтаксис: ЧислоПрописью(Число, ФорматнаяСтрока, ПараметрыПредметаИсчисления)
Разберем ФорматнаяСтрока. В ней задаются общие правила вывода:
Л (Language) — идентификатор языка (например, ru_RU).ДП (Decimal Part) — признак вывода дробной части. Истина выводит копейки цифрами, Ложь — словами.НП (Noun Pronunciation) — если нужно, чтобы фраза начиналась с заглавной буквы, добавьте НП = Истина. Это критично для начала предложения в договоре.Разберем ПараметрыПредметаИсчисления. Это строка, состоящая из 9 полей, разделенных запятыми:
Проанализируем ситуацию из сообщения №6, где помимо денег нужно вывести срок (количество лет) прописью. Здесь важно изменить род предмета исчисления на мужской («м» для слова «год») и указать правильные склонения.
// Вывод срока пользования
СрокИИП = 5; // Пример значения
Макет.Параметры.СрокПользования = СрокИИП;
ФормСтрокаСрок = "Л = ru_RU; ДП = Ложь"; // Дробная часть не нужна
ПарПредметаСрок = "год, года, лет, м, , , , , 0"; // Дробная часть пустая
ПрописьСрока = ЧислоПрописью(СрокИИП, ФормСтрокаСрок, ПарПредметаСрок);
Макет.Параметры.СрокИИП_Прописью = ПрописьСрока;
Чтобы не дублировать длинные строки настроек для каждой суммы, рекомендуется вынести логику в отдельную функцию. Это сделает основной код читаемым и снизит вероятность ошибок при копировании.
Рассмотрим, как это можно реализовать в модуле документа или обработки:
// Универсальная функция для получения суммы в рублях прописью
Функция СформироватьСуммуПрописью(Знач СуммаЗначение) Экспорт
ФормСтрока = "Л = ru_RU; НП = Истина; ДП = Истина";
ПарПредмета = "рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2";
Возврат ЧислоПрописью(СуммаЗначение, ФормСтрока, ПарПредмета);
КонецФункции
// Пример использования в процедуре печати
Процедура ПечатьДоговора()
// ... получение макета и области ...
// Первая сумма
Область.Параметры.СуммаВсего = СуммаИтого;
Область.Параметры.СуммаВсегоПрописью = СформироватьСуммуПрописью(СуммаИтого);
// Вторая сумма (доля автора)
СуммаДоли = СуммаИтого * (Процент / 100);
Область.Параметры.СуммаДоли = СуммаДоли;
Область.Параметры.СуммаДолиПрописью = СформироватьСуммуПрописью(СуммаДоли);
// ... вывод области ...
КонецПроцедуры
Если ваша конфигурация разработана на базе Библиотеки стандартных подсистем (БСП), выясним, как упростить задачу еще сильнее. В БСП существуют общие модули, которые уже содержат все необходимые настройки для популярных валют.
Вместо ручного формирования строки параметров, можно использовать функции модуля РаботаСКурсамиВалют (название может варьироваться в зависимости от версии БСП):
// Пример для БСП
СуммаПрописью = РаботаСКурсамиВалют.СформироватьСуммуПрописью(СуммаДоли, ВалютаДокумента);
Макет.Параметры.СуммаДолиПрописью = СуммаПрописью;
Этот способ предпочтительнее, так как он автоматически подставит нужные склонения для любой валюты (доллары, евро, тенге), указанной в справочнике «Валюты».
Если вы уверены, что код верный, но данные все равно не выводятся или вылетает ошибка, воспользуйтесь методом Сообщить(), как советовали в сообщении №16. Это простейший способ убедиться, что переменная, которую вы передаете в ЧислоПрописью, не является пустой или неопределенной.
Проанализируем ситуацию: если СуммаПополам окажется равной 0 или Неопределено, функция вернет пустую строку или «Ноль рублей...», что поможет локализовать проблему в расчетах выше по коду.
Итоговый чек-лист для исправления проблемы:
Сумма1, Сумма2...).Следуя этим правилам, вы сможете выводить неограниченное количество сумм и текстовых описаний в любые документы 1С, обеспечивая корректное склонение и профессиональный вид печатных форм.