Вроде разобрался. В методе TaxPurch::calc() где идет расчет суммы налога, происходит следующее:
1. Рассчитываются суммы налога.
2. Если это валютная накладная, вызывается adjustAmount, где сумма в рублях рассчитывается по фиксированному курсу.
3. Выясняется, сходится ли формула Сумма без НДС + Сумма НДС = Сумма с НДС.
В моем случае накладная включает НДС и получается разница в 1 копейку в валюте.
Система запускает коррекцию сумм в валюте и при этом пересчитывает сумму в рублях не по фиксированному курсу, а по текущему (метод adjustPennyDiff).
X++:
if (amountsInclTaxExist)
{
while select sum(SourceTaxAmountCur)
from taxWorkTrans
group by SourceRecId
where taxWorkTrans.SourceTableId == purchLineTableId &&
taxWorkTrans.TaxDirection != TaxDirection::UseTax &&
taxWorkTrans.TaxOrigin != TaxOrigin::TaxReversed
{
amountInclTax.insert(taxWorkTrans.SourceRecId, sourceCurrency.amount_Instance(amountInclTax.lookup(taxWorkTrans.SourceRecId)));
if (amountInclTax.lookup(taxWorkTrans.SourceRecId) &&
amountExclTax.lookup(taxWorkTrans.SourceRecId) + taxWorkTrans.SourceTaxAmountCur != amountInclTax.lookup(taxWorkTrans.SourceRecId))
{
counterMax++;
adjustRecId[counterMax] = taxWorkTrans.SourceRecId;
pennyDiff[counterMax] = amountExclTax.lookup(taxWorkTrans.SourceRecId) +
taxWorkTrans.SourceTaxAmountCur -
amountInclTax.lookup(taxWorkTrans.SourceRecId);
}
}
if (counterMax)
{
for (counter = 1; counter <= counterMax; counter++)
this.adjustPennyDiff(pennyDiff[counter], adjustRecId[counter]);
}
}
4. Если бы налог считался целиком для накладной, а не размазывался на строки, то система запустила бы еще раз коррекцию сумм в рублях:
X++:
if (taxCalculateTotal)
{
if (purchFormLetter.exchRate(taxDate) != Currency::exchRate(sourceCurrencyCode, taxDate) ||
purchFormLetter.exchRateSecondary(taxDate) != Currency::exchRateSecond(sourceCurrencyCode, taxDate) ||
purchFormLetter.triangulation(taxDate) != Currency::triangulation(sourceCurrencyCode, taxDate))
{
this.adjustAmount(purchFormLetter.exchRate(taxDate),purchFormLetter.exchRateSecondary(taxDate));
}
this.adjustTaxInCostPrice(0);
}
Однако в моем случае, она просто идет дальше и сумма в рублях оказывается некорректной. Понятно, что такой случай каждый день не возникает.
РЕШЕНИЕ мое такое:
нужно в вышеприведенном коде закоментировать строку if (taxCalculateTotal):
X++:
//TODO
//if (taxCalculateTotal)
{
if (purchFormLetter.exchRate(taxDate) != Currency::exchRate(sourceCurrencyCode, taxDate) ||
purchFormLetter.exchRateSecondary(taxDate) != Currency::exchRateSecond(sourceCurrencyCode, taxDate) ||
purchFormLetter.triangulation(taxDate) != Currency::triangulation(sourceCurrencyCode, taxDate))
{
this.adjustAmount(purchFormLetter.exchRate(taxDate),purchFormLetter.exchRateSecondary(taxDate));
}
this.adjustTaxInCostPrice(0);
}