Точный расчет пропорционально зависимых значений в спецификации.
(Пример на сумме накладной и НДС)
Проблема возникает при округлении значений в расчетных колонках спецификации.
Накопление этих округлений приводит иногда к ощутимой погрешности расчетного итогового значения:
Итог по расчетной колонке <> Расчетное значение по итогу "колонки-основания" для расчета (1)
(проще говоря)
Итог("НДС") <> СтавкаНДС * Итог("Сумма")
Погрешность в 1-2 копейки возникает очень часто, если количество строк в документе большое,
может достигать 10-20 копеек.
На первый взгляд проблема надуманна или несущественна.
Она имеет организационное решение: выверять сумму построчно в накладных;
расставаться с поставщиками, которые присылают такие документы;
в силу несущественности оставить как есть.
Исключения всегда есть:
- Валютная накладная с курсом, - пересчет спецификации на момент ввода в "рублевую" учетную систему,
- Необходимость распространения общей скидки / надбавки от суммы документа на его спецификацию (скидка, бонус, доп. расходы).
- Документы перепродажи между собственными юрлицами с небольшой наценкой (десятые доли процента), -
разница между "исходящим" и "входящим" НДС может сильно отличаться от нормативной по ставке от наценки.
Идея точного расчета состоит в том, чтобы условие (1) выполнялось на любой момент пересчета спецификации.
Таким образом, на примере НДС для позиции i спецификации (единая ставка для всей спецификации):
НДС_i = Окр(СтавкаНДС * Сумма_i,2); // по старому
НДС_i = Окр(СтавкаНДС * ПромИтог("Сумма",1,i),2) -
ПромИтог("НДС",1,i-1); // по новому
ПромИтог(<Колонка>,<ГраницаОтВкл>,<ГраницаДоВкл>) - промежуточный итог по указанной колонке
по диапазону строк с указанными границами.
Или, словами: НДС для позиции это разница между ставкой НДС от накопленной суммы на данную позицию
минус накопленный НДС на предыдущую позицию.
Пример для НДС условный, таким же образом могут сводиться в ноль любые процентные расчеты.
Реализация метода - в прилагающейся внешней обработке.