Показать сообщение отдельно
Старый 14.06.2011, 16:38   #4  
Bega is offline
Bega
Участник
Аватар для Bega
 
382 / 444 (15) +++++++
Регистрация: 18.08.2005
Адрес: Москва
Вроде разобрался. В методе 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);
    }

Последний раз редактировалось Bega; 14.06.2011 в 16:41.