Доброго времени суток!
Axapta 3.0 sp 5
Наткнулся на баг в закрытии склада в случае заполнения номера возвращенного лота (InventTransIdReturn) в приходной проводке НЕ по заказу. В этом случае себестоимость приходной проводки не корректируется.
В классе InventCostItemDim есть 2 основных метода, которые отвечают за коррекцию приходной возвратной проводки:
Этот метод корректируе все приходные проводки по заказам с заполненным лотом возврата перед выполнением закрытия по номенклатуре
X++:
void updateItemReturnAdjustments(ItemId _itemId = inventCostList.ItemId)
{
InventTrans inventTrans;
InventTrans issue;
Price costPrice;
CostAmount adjustment;
;
while select sum(Qty), sum(CostAmountAdjustment), sum(CostAmountPosted) from inventTrans
index hint StatusItemIdx
group by inventTransId, inventTransIdReturn
where inventTrans.ItemId == _itemId &&
inventTrans.ValueOpen == inventTransOpen::Yes &&
inventTrans.StatusReceipt == StatusReceipt::Purchased &&
inventTrans.StatusIssue == StatusIssue::None &&
inventTrans.TransType == InventTransType::Sales && inventTrans.DateStatus <= inventClosing.TransDate &&
inventTrans.PackingSlipReturned == 0 &&
inventTrans.InventTransIdReturn != ''
{
select sum(Qty), sum(CostAmountAdjustment), sum(CostAmountPosted) from issue
index hint TransIdIdx
where issue.InventTransId == inventTrans.inventTransIdReturn &&
issue.StatusReceipt == StatusReceipt::None &&
issue.StatusIssue == StatusIssue::Sold &&
issue.PackingSlipReturned == 0 &&
issue.InventTransIdReturn == inventTrans.inventTransId;
if (issue.Qty)
{
costPrice = (issue.costAmountPosted + issue.costAmountAdjustment) / issue.Qty;
adjustment = Currency::amount(inventTrans.Qty * costPrice - inventTrans.costAmountPosted - inventTrans.costAmountAdjustment);
if (abs(adjustment) >= inventClosing.minTransferValue && !InventAdj::isOnhandAdjusted(inventTrans.InventTransId, inventTrans.InventTransIdReturn, ''))
this.updateTransIdReturnReceipt(inventTrans.InventTransId, inventTrans.InventTransIdReturn, costPrice);
}
}
}
Второй метод "протаскивает" возвратную проводку на следующий уровень расчета, но опять-таки только проводку по заказу:
X++:
protected void updateTrans(
InventTrans inventTrans,
CostAmount adjustment
)
{
if (adjustment)
{
switch (inventTrans.transType)
{
case InventTransType::QuarantineOrder:
this.addkeyAdjustment(true,inventTrans.inventTransId,adjustment,'',inventTrans.voucher);
break;
case InventTransType::InventTransfer:
case InventTransType::WMSTransport:
this.addkeyAdjustment(true,inventTrans.inventTransId,adjustment,'','');
break;
case InventTransType::ProdLine :
this.addkeyAdjustment(false,inventTrans.inventTransIdFather,adjustment,'','');
break;
case InventTransType::BOMLine :
this.addkeyAdjustment(false,inventTrans.inventTransIdFather,adjustment,'','');
break;
default:
if (inventTrans.inventTransIdReturn && inventTrans.qty < 0 && inventTrans.transType == InventTransType::Sales)
this.addkeyAdjustment(true,inventTrans.inventTransIdReturn,adjustment,inventTrans.inventTransId,'');
}
inventAdj::updateModule(inventTrans,adjustment,inventClosing);
}
}
Наткнулся на эту ситуацию при попытке сторнировать расходный журнал Проводка.
Если из методов убрать условие
inventTrans.transType == InventTransType::Sales
то закрытие корректирует себестоимость возврата как мне и нужно.
У кого есть опыт подобной модификации, просьба откликнуться...