При настройке и редактировании выходных печатных форм документов и произвольных отчетов (файлы с расширением .gfd) в платформе 1С 6.0 можно столкнуться с ситуацией, когда исходные переменные содержат дробные числа с копейками, но любые арифметические операции над ними (сложение, умножение, деление) приводят к принудительному округлению результата до целого числа. Разберем механизм вычислений в генераторе форм документов 1С 6.0, выясним причину такого поведения и пошагово исправим формулы.
В генераторе форм платформы 1С 6.0 логика расчета и формат чисел определяются специальными директивами и контекстными операторами. Если отдельные показатели выводятся с копейками, а результат формулы обрезается, причина обычно кроется в глобальном переключении точности вычислений внутри самого бланка.
Рассмотрим основные факторы, влияющие на разрядность чисел:
!Е (или !е): задает количество знаков после запятой для всех последующих операций до тех пор, пока в тексте формул не встретится следующая аналогичная директива. Например, директива !е0 принудительно обрезает дробную часть до нуля знаков во всех дальнейших выражениях.ОКР: встроенная функция принимает разрядность округления через обратный слэш \. Если вторым параметром указан ноль, число округляется до целого.ЗН или промежуточных граф задается точность, влияющая на сохранение копеек при присваивании значений.Разберем типичный фрагмент формул из файла .gfd, где происходит потеря копеек:
!ПЗП1=окр(ПЗП*К80\0) !ПЗП2=ПЗП+ПЗП1 !ПСоцСтр=ОКР(ПЗП2*К81/100\0)
!Е1
!ПЛН=СП{|2}.2 !ПК=ЗН7
!е2
!ПЦТ=?((""+СП{|2}.6="Д") ИЛИ (""+СП{|2}.6="д")\К82\?((""+СП{|2}.6="Б") ИЛИ (""+СП{|2}.6="б")\К83\К84))
!е0
!ПЛ=ОКР(ПОБЩ/100*ПЛН*ПК\0) !ПСТ=ОКР(ПЦТ*ПЛ\0)
Проанализируем этот код. В строке перед расчетом показателей ПЛ и ПСТ установлена директива !е0, а сама функция ОКР явно вызывает округление до 0 знаков: ОКР(ПОБЩ/100*ПЛН*ПК\0). В такой связке вычисления неизбежно теряют копейки.
Для восстановления расчета с копейками выполним следующие действия:
!е0 на !е2 перед блоком вычислений. Это переключит контекст последующих математических операций на работу с двумя знаками после запятой.ОКР: заменим второй параметр в функции округления с \0 на \2 (например, ОКР(ПЗП2*К81/100\2) и ОКР(ПОБЩ/100*ПЛН*ПК\2)).######.##).Посмотрим на исправленный вариант формул, который сохраняет два знака после запятой во всех расчетах:
!ПЗП1=ОКР(ПЗП*К80\2) !ПЗП2=ПЗП+ПЗП1 !ПСоцСтр=ОКР(ПЗП2*К81/100\2)
!Е2
!ПЛН=СП{|2}.2 !ПК=ЗН7
!е2
!ПЦТ=?((""+СП{|2}.6="Д") ИЛИ (""+СП{|2}.6="д")\К82\?((""+СП{|2}.6="Б") ИЛИ (""+СП{|2}.6="б")\К83\К84))
!е2
!ПЛ=ОКР(ПОБЩ/100*ПЛН*ПК\2) !ПСТ=ОКР(ПЦТ*ПЛ\2)
После внесения этих правок и сохранения файла формы результаты арифметических операций будут корректно формироваться и выводиться на печать с копейками.