Проблема как мне кажется выявлена.
Суть в том, что без этой модификации при наличии разницы округления добавляется запись в LedgerTrans с суммой погрешности установленной только в основной валюте! Т.е. валюта операции в проводке по округлению (LedgerTrans.AmounrCur) нулевая (как видно из начала поста). При этом основные проводки в ГК (т.е. тот набор, что делается обычно без проводок по 99.99 счету округления) идут в двух суммах AmountCur и AmountMST.
На практике это выливается в то, что метод класса LedgerBondServer_RU addCheckBalance()
X++:
protected void addCheckBalance(LedgerTrans _ledgerTrans, Sign _sign = 1)
{
void addKey(TransDate _transDate, CurrencyCode _currencyCode, Amount _amount)
{
str key = strfmt("@SYS76785", _transDate, _currencyCode);
if (balanceMap.exists(key))
{
balanceMap.insert(key, balanceMap.lookup(key) + _amount);
}
else
{
balanceMap.insert(key, _amount);
}
}
if (! balanceMap)
{
balanceMap = new Map(Types::String, Types::Real);
}
addKey(_ledgerTrans.TransDate, _ledgerTrans.CurrencyCode, _ledgerTrans.AmountCur * _sign);
addKey(_ledgerTrans.TransDate, mstCode, _ledgerTrans.AmountMST * _sign);
addKey(_ledgerTrans.TransDate, mstSecondCode, _ledgerTrans.AmountMSTSecond * _sign);
}
неправильно считает "балансы". И неправильно он это делает просто потому, что, как видно при совпадении основной валюты и валюты операции карта balanceMap по одному и тому же ключу суммирует значения этих сумм (т.е. с одной стороны погрешность сначала удваивается, а с другой стороны вычитание суммы погрешности округления происходит только 1 раз, т.к. она указана только в одной валюте). В общем это выливается в дальнейшую ошибку "не балансирует", т.к. при таком алгоритме в balanceMap остается как раз сумма погрешности.
Решение - либо менять алгоритм наполнения и проверки balanceMap (ключ делать разный для валюты операции и основной валюты), либо заносить (при совпадении этих валют) в проводку по округлению значение суммы в валюте операции. Что и было сделано в первом сообщении поста. Остается только нюанс.
Может еще нужна проверка на совпадение валют? Просто не помню и неохота разбираться, в описанном случае может быть ситуация, когда основная валюта и валюта операции не совпадут и тогда суммы по округлению могут быть разные...