Показать сообщение отдельно
Старый 01.03.2013, 09:01   #13  
Romb is offline
Romb
Участник
Аватар для Romb
 
79 / 22 (1) +++
Регистрация: 06.01.2004
Добрый день, спасибо за советы.
С профилями, округлениями и др. все нормально. Вторичную валюту не используем. Перенос в основной валюте. Внутри одной компании.

В данных проблемных строк в журнале переноса и в InventTrans ничего подозрительного не увидел.
Разве, что журнал сторно.

Дошел до следующего.
Дошел до ошибки в коде в методе LedgerBondClient_RU.bondVRef2VRef()
Для всех "нормальных" строк он отрабатывает по одной ветке, для "ненормальных" (на которых ошибка возникает) по другой.

Вот код.

X++:
public void bondVRef2VRef(LedgerBondVrefId_RU     _vRefId1,
                          LedgerBondVrefId_RU     _vRefId2,
                          Amount                  _amount        = 0.0,
                          LedgerBondAmountType_RU _amountType    = LedgerBondAmountType_RU::Currency,
                          LedgerBondOrder_RU      _bondOrder     = LedgerBondOrder_RU::Auto,
                          boolean                 _roundToCredit = false)
{
    LedgerBondVrefId_RU         vRefIdDebit;
    LedgerBondVrefId_RU         vRefIdCredit;
    LedgerBondTransObject_RU    bondTransObject2, bondTransObject1 = this.bondTransObject(_vRefId1);
    Amount                      amount1 = _amount, amount2;
    LedgerBondAmountType_RU     amountType = _amountType;
    ;

    if (ledgerBondServer.fatalErrorState())
        return;
    if (! amount1)
    {
// здесь все отрабатывает для "нормальных" строк
// без ошибок, т.е. amount2 и amount1 получают
// ненулевые значения 

        amount1 = bondTransObject1.remainAmountCur();
        bondTransObject2 = this.bondTransObject(_vRefId2);
        if (ledgerBondServer.fatalErrorState())
            return;

// для нормальных строк в  bondTransObject2.remainAmountCur() есть значение
// для "ненормальных" возращается 0
        amount2 = bondTransObject2.remainAmountCur();

        if (! amount1 || ! amount2)
        {
            amount1 = bondTransObject1.remainAmountMST();
            amount2 = bondTransObject2.remainAmountMST(); 
            amountType = LedgerBondAmountType_RU::MST;  
        }

        if (! amount1 || ! amount2)
        {
//  в случае, когда amount2 == 0  алгоритм приземляется здесь 
            amount1 = bondTransObject1.remainAmountMSTSecond(); 
            amount2 = bondTransObject2.remainAmountMSTSecond(); 
            amountType = LedgerBondAmountType_RU::MSTSecondary;
        }

        amount1 = min(abs(amount1), abs(amount2));
    }

.........
.........
// ну и далее при  amount1  == 0, возникает ошибка в во второй ветке LedgerBondAmountType_RU::MSTSecondary
// ledgerBondServer.addBondProrateAmountMSTSecond()
// т.к. как там внутри соответствующая проверка

// в нормальном же случае все идет по последней ветке 
// amount1 ненулевой, ошибки внутрях не возникает
    switch (amountType)
    {
        case LedgerBondAmountType_RU::MST : 
            ledgerBondServer.addBondProrateAmountMST(vRefIdDebit,
                                                     vRefIdCredit,
                                                     amount1,
                                                     _roundToCredit);
            break;

        case LedgerBondAmountType_RU::MSTSecondary :
            ledgerBondServer.addBondProrateAmountMSTSecond(vRefIdDebit,
                                                           vRefIdCredit,
                                                           amount1,
                                                           _roundToCredit);
            break;

        case LedgerBondAmountType_RU::Currency :
            ledgerBondServer.addBondProrateAmountCur(vRefIdDebit,
                                                     vRefIdCredit,
                                                     amount1,
                                                     _roundToCredit);
            break;
    }
Получается, что для "ненормальных" строк bondTransObject2 возвращается с нулевыми remainAmount... в то время как bondTransObject1 с ненулевыми. Получается, на данном "уровне копания" надо понять, почему так происходит.

Последний раз редактировалось Romb; 01.03.2013 в 09:17.