В работе с кассовыми документами, такими как Приходный кассовый ордер (ПКО) или Расходный кассовый ордер (РКО), точность данных критически важна. Довольно часто пользователи сталкиваются с ситуацией, когда цифровая запись суммы верна (например, 251.95), а расшифровка суммы прописью выводится некорректно: копейки отбрасываются, а рубли округляются по математическим правилам (в нашем примере — «Двести пятьдесят два рубля»).
Такое расхождение недопустимо для бухгалтерского учета. В этой статье мы подробно разберем технические причины возникновения такой ошибки в платформе 1С:Предприятие и рассмотрим способы её устранения через Конфигуратор.
Прежде чем приступать к правкам кода, давайте поймем логику работы программы. Система не «ошибается» в привычном смысле, она выполняет заложенный алгоритм преобразования числа в строку.
Проблема кроется в использовании встроенной функции языка 1С ЧислоПрописью или её оберток в типовых конфигурациях. Если этой функции не передать правильные параметры форматирования, она может вести себя следующим образом:
Цел() перед преобразованием, что просто удаляет копейки, оставляя 251. Но в описанном случае происходит именно округление, что указывает на настройки форматирования.Для исправления ситуации нам потребуется доступ к Конфигуратору. Поскольку печатные формы формируются программно, нам необходимо найти место, где происходит подготовка данных для макета.
Обычно код формирования печатных форм ПКО и РКО находится в Модуле менеджера документа или в Модуле объекта (в старых конфигурациях). Также в современных конфигурациях (например, 1С:Бухгалтерия 3.0, ERP) логика печати может быть вынесена в общие модули, связанные с печатью.
Давайте выполним поиск по следующим ключевым словам в модуле документа:
ЧислоПрописью — стандартная функция платформы.СуммаПрописью — часто используемая функция общего модуля.РаботаСКартами.ПолучитьСуммуПрописью — встречается в механизмах эквайринга.Самый надежный способ исправить вывод — скорректировать параметры функции ЧислоПрописью. Разберем её синтаксис подробнее.
Синтаксис:
ЧислоПрописью(Число, ФорматнаяСтрока, ПараметрыПредметаИсчисления)
Где:
Число — сумма, которую нужно преобразовать (например, ссылка на СуммаДокумента).ФорматнаяСтрока — строка, задающая язык и правила вывода дробной части.ПараметрыПредметаИсчисления — строка, определяющая склонения валюты (рубли, копейки).Если у вас выводится «Двести пятьдесят два рубля» для суммы 251.95, скорее всего, в параметре ФорматнаяСтрока отсутствует указание на вывод дробной части, либо параметр НП (Надо ли печатать дробную часть) установлен в Ложь.
Чтобы сумма выводилась как «Двести пятьдесят один рубль 95 копеек», нам необходимо изменить вызов функции. Рассмотрим правильный вариант кода.
Мы должны явно указать в форматной строке параметр ДП=Истина (или DP=True), что означает «Дробную часть Показываем».
Пример правильного кода:
// Переменная СуммаДокумента содержит значение 251.95
СтрокаСуммы = ЧислоПрописью(СуммаДокумента,
"L=ru_RU; DP=True",
"рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2");
Давайте разберем параметры третьей части (ПараметрыПредметаИсчисления) в этом примере:
"рубль, рубля, рублей, м" — описывает целую часть (мужской род)."копейка, копейки, копеек, ж" — описывает дробную часть (женский род)."2" — указывает, что дробная часть состоит из двух знаков.Если в вашем коде используется вызов функции из Общего Модуля, например:
ОбластьМакета.Параметры.СуммаПрописью = РаботаСКурсамиВалют.СформироватьСуммуПрописью(СуммаДокумента, ВалютаДокумента);
Тогда вам, возможно, не стоит менять код общего модуля (так как это затронет все документы). Вместо этого лучше заменить этот вызов на прямой вызов ЧислоПрописью непосредственно в модуле печати кассового ордера, используя шаблон, приведенный выше.
Иногда, особенно в старых или сильно кастомизированных конфигурациях, форматирование задается не в коде, а непосредственно в свойствах ячейки макета (файл с расширением .mxl, хранящийся внутри объекта конфигурации в ветке «Макеты»).
Если вы не нашли формирования строки в коде, давайте проверим макет:
ПФ_MXL_КО2, КО1 или просто Макет).Однако, стоит отметить, что для вывода суммы прописью свойства ячейки используются редко, так как формат 1С в свойствах ячейки обычно управляет числовым представлением (например, «1 234,56»), а не текстовым. Поэтому вариант с правкой программного кода (Модуль менеджера) является основным.
Подводя итог, чтобы исправить ошибку «252 рубля» вместо «251 рубль 95 копеек», выполним следующие действия:
ЧислоПрописью.DP=True (вывод дробной части), а параметры предмета исчисления корректно описывали рубли и копейки.После этих действий система перестанет округлять сумму до целых рублей и будет корректно отображать копейки в печатных формах.