Часто при ведении бухгалтерского учета в программе 1С:Предприятие 7.7 (в частности, в редакции 4.5) возникает ситуация, когда при формировании Оборотно-сальдовой ведомости (ОСВ) или Карточки счета курс валюты отображается с обрезанной точностью. Например, вместо шести знаков после запятой выводится только четыре (курс 0.043698 превращается в 0.0436). Проанализируем эту ситуацию и разберем по шагам все возможные пути решения проблемы.
Если вам необходимо, чтобы система могла хранить и обрабатывать курс с расширенным количеством знаков после запятой, одного изменения формата вывода в отчетах будет недостаточно. Сначала выясним причину на уровне хранения данных и посмотрим, как это исправить.
Валюты.Курс.Теперь сама база данных позволяет записывать в справочник значения с нужным количеством знаков. Однако после этого вы можете заметить, что в отчетах все равно выводится лишь 4 знака. Рассмотрим подробнее, как настроить вывод.
В 1С 7.7 за визуальное представление данных в печатных формах отвечают макеты таблиц (MXL-файлы) и функции форматирования в программном коде. Если курс в справочнике исправлен, а в отчетах (ОСВ, Карточка счета) знаки всё равно обрезаются, значит, происходит программная обрезка формата.
Разберем по шагам, как скорректировать формат вывода в макете:
Ч15.4 (что означает число из 15 символов с 4 знаками после запятой), исправьте его на Ч15.6.Также обратите внимание на глобальные процедуры форматирования. Во многих типовых конфигурациях вызывается процедура УстановитьФорматСумм() или используется встроенная функция Формат(). Если в модуле отчета строка собирается с помощью конкатенации, система приводит число к строке по своим внутренним правилам:
// Пример того, как строка может формироваться в коде
ТекстВалюты = "В валюте : " + Опер.Валюта + ", курс " + Опер.Курс;
Для сохранения всех знаков после запятой принудительно оберните переменную курса в функцию формата:
ТекстВалюты = "В валюте : " + Опер.Валюта + ", курс " + Формат(Опер.Курс, "Ч15.6");
Если реальный курс по операции не берется напрямую из реквизита, а вычисляется на лету, его также можно рассчитать и отформатировать:
ТекКурс = Опер.Сумма / Опер.ВалСумма;
ТекстВалюты = "В валюте : " + Опер.Валюта + ", курс " + Формат(ТекКурс, "Ч15.6");
Прежде чем приступать к доработкам кода и структур данных, обязательно взвесьте все риски. Ручное увеличение точности курса в конфигураторе может привести к следующим последствиям:
Чтобы избежать вмешательства в код и макеты 1С, рассмотрим типовой механизм, который специально придуман для работы с мелкими курсами валют. Этот механизм позволяет обойти ограничение в 4 знака после запятой без изменения конфигурации.
В справочнике валют существует реквизит Кратность. Посмотрим на пример:
Допустим, вам нужно ввести курс 0,043698 руб. за 1 единицу валюты. Поскольку в типовой программе в поле курса помещается только 0,0436, вы теряете точность. Вместо этого установите кратность валюты равной 100 или 10000.
Валюты в режиме Предприятия.Кратность установите значение 10000.Курс запишите значение 436,9800.Что произойдет дальше? При проведении любых документов программа автоматически разделит ваш курс (436,98) на кратность (10000), получая для математических расчетов идеальное значение 0,043698. Это полностью устранит потерю точности на микро-долях копеек, и вам не придется переписывать код печатных форм или снимать базу с поддержки!