Добрый день, спасибо за советы.
С профилями, округлениями и др. все нормально. Вторичную валюту не используем. Перенос в основной валюте. Внутри одной компании.
В данных проблемных строк в журнале переноса и в 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 с ненулевыми. Получается, на данном "уровне копания" надо понять, почему так происходит.