Как вывести несколько разных сумм прописью в одном документе 1С

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

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

Анализ задачи и исходного кода

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

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


// Определение параметров суммы
СуммаАвторам = СуммаГонорара;
Макет.Параметры.Сумма = СуммаАвторам;

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

// Преобразование и вывод
ПрописьЧисла = ЧислоПрописью(СуммаГонорара, ФормСтрока, ПарПредмета);
Макет.Параметры.СуммаПрописью = ПрописьЧисла;

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

Причины возникновения ошибки «Поле объекта не обнаружено»

Если при выполнении кода система выдает ошибку о ненахождении поля, проанализируем следующие моменты:

  1. Опечатки в именах: Имя параметра в конфигураторе (в свойствах ячейки макета) должно символ в символ совпадать с тем, что написано в коде после Макет.Параметры.... Часто путают кириллическую «с» и латинскую «c».
  2. Свойство ячейки «Заполнение»: Это самая частая причина. По умолчанию ячейка макета имеет тип заполнения «Текст». Чтобы 1С воспринимала текст в квадратных скобках как переменную, в палитре свойств ячейки в поле Заполнение должно быть выбрано значение Параметр.
  3. Область макета: Убедимся, что мы обращаемся к параметрам именно той области макета, которая была получена в коде. Если параметр находится в области «Подвал», а мы пытаемся заполнить его через параметры области «Шапка», возникнет ошибка.

Работа с функцией ЧислоПрописью

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

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

Разберем ФорматнаяСтрока. В ней задаются общие правила вывода:

Разберем ПараметрыПредметаИсчисления. Это строка, состоящая из 9 полей, разделенных запятыми:

  1. Единица измерения (именительный падеж, единственное число) — «рубль».
  2. Единица измерения (родительный падеж, единственное число) — «рубля».
  3. Единица измерения (родительный падеж, множественное число) — «рублей».
  4. Род единицы измерения («м» — мужской, «ж» — женский, «с» — средний) — «м».
  5. Дробная часть (именительный падеж, ед. число) — «копейка».
  6. Дробная часть (родительный падеж, ед. число) — «копейки».
  7. Дробная часть (родительный падеж, мн. число) — «копеек».
  8. Род дробной части — «ж».
  9. Количество разрядов дробной части (обычно 2 для валюты) — «2».

Пример вывода разных единиц (Сумма и Срок)

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


// Вывод срока пользования
СрокИИП = 5; // Пример значения
Макет.Параметры.СрокПользования = СрокИИП;

ФормСтрокаСрок = "Л = ru_RU; ДП = Ложь"; // Дробная часть не нужна
ПарПредметаСрок = "год, года, лет, м, , , , , 0"; // Дробная часть пустая

ПрописьСрока = ЧислоПрописью(СрокИИП, ФормСтрокаСрок, ПарПредметаСрок);
Макет.Параметры.СрокИИП_Прописью = ПрописьСрока;

Оптимизация кода: создание универсальной функции

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

Рассмотрим, как это можно реализовать в модуле документа или обработки:


// Универсальная функция для получения суммы в рублях прописью
Функция СформироватьСуммуПрописью(Знач СуммаЗначение) Экспорт
    
    ФормСтрока = "Л = ru_RU; НП = Истина; ДП = Истина";
    ПарПредмета = "рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2";
    
    Возврат ЧислоПрописью(СуммаЗначение, ФормСтрока, ПарПредмета);
    
КонецФункции

// Пример использования в процедуре печати
Процедура ПечатьДоговора()
    
    // ... получение макета и области ...
    
    // Первая сумма
    Область.Параметры.СуммаВсего = СуммаИтого;
    Область.Параметры.СуммаВсегоПрописью = СформироватьСуммуПрописью(СуммаИтого);
    
    // Вторая сумма (доля автора)
    СуммаДоли = СуммаИтого * (Процент / 100);
    Область.Параметры.СуммаДоли = СуммаДоли;
    Область.Параметры.СуммаДолиПрописью = СформироватьСуммуПрописью(СуммаДоли);
    
    // ... вывод области ...
    
КонецПроцедуры

Использование БСП для вывода сумм

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

Вместо ручного формирования строки параметров, можно использовать функции модуля РаботаСКурсамиВалют (название может варьироваться в зависимости от версии БСП):


// Пример для БСП
СуммаПрописью = РаботаСКурсамиВалют.СформироватьСуммуПрописью(СуммаДоли, ВалютаДокумента);
Макет.Параметры.СуммаДолиПрописью = СуммаПрописью;

Этот способ предпочтительнее, так как он автоматически подставит нужные склонения для любой валюты (доллары, евро, тенге), указанной в справочнике «Валюты».

Советы по отладке макетов

Если вы уверены, что код верный, но данные все равно не выводятся или вылетает ошибка, воспользуйтесь методом Сообщить(), как советовали в сообщении №16. Это простейший способ убедиться, что переменная, которую вы передаете в ЧислоПрописью, не является пустой или неопределенной.

Проанализируем ситуацию: если СуммаПополам окажется равной 0 или Неопределено, функция вернет пустую строку или «Ноль рублей...», что поможет локализовать проблему в расчетах выше по коду.

Итоговый чек-лист для исправления проблемы:

  1. Проверьте наличие параметра в макете.
  2. Проверьте, что в свойствах ячейки тип заполнения — Параметр.
  3. Убедитесь в отсутствии опечаток в именах параметров.
  4. Используйте уникальные имена для каждой суммы (Сумма1, Сумма2...).
  5. Для удобства используйте вспомогательные функции или возможности БСП.

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

← На главную