Решил поделиться проблемами и решениями, которые возникли при закрытии склада. Большая часть проблем связана с расширенным расчетом производственной себестоимости, который был добавлен RU5.
ПРОБЛЕМА 1: Неверная себестоимость расходов при расширенном расчете себестоимости.
Основная логика по закрытию склада находится в классе InventCostItemDim. В методе updateItem вызывается updateLevelAdjustment() в котором коррекции, которые «прилетели» на данную номенклатуру с предыдущих шагов, распределяются на приходные проводки этой номенклатуры.
X++:
while select sum(Adjustment) from inventCostListTrans
index hint ItemIdx
group by InventTransId,InventTransIdReturn,VoucherPhysical
where inventCostListTrans.Voucher == inventClosing.Voucher &&
inventCostListTrans.NumOfIteration == inventCostList.NumOfIteration &&
inventCostListTrans.ItemId == inventCostList.ItemId
{
// <GEEU>
if (calculationProdWIP_RU
&& inventCostListTrans.InventTransId && this.calcWIPProdHistoricalCost_RU(inventCostListTrans.InventTransId,
inventCostListTrans.VoucherPhysical))
{
continue;
}
// </GEEU>
this.updateTransIdReceipt(inventCostListTrans.InventTransId,
inventCostListTrans.Adjustment,
inventCostListTrans.InventTransIdReturn,
inventCostListTrans.VoucherPhysical);
}
Без включенного расчета расширенной себестоимости (calculationProdWIP_RU = НЕТ) всегда выполняется метод updateTransIdReceipt(), который распределяет коррекцию inventCostListTrans.Adjustment на приходные проводки. В этом методе, после того как коррекция была добавлена к приходной проводке, эта проводка добавляется в мап mapInventTrans.insert(receipt.RecId,receipt). Дальше этот мап используется в методе updateReceiptAdjustment(), чтобы «распространить» коррекции, сделанные по приходным проводкам на сопоставленные с ними расходные проводки.
Если включен расширенный расчет себестоимости и приходная проводка имеет тип «Производство», то вызывается метод calcWIPProdHistoricalCost (), в нем вызывается написанная в RU5 логика, рассчитывается фактическая себестоимость расходов по производственному заказу, себестоимость выходов (побочной и основной продукции), делается коррекция приходов.
Так вот, первая проблема связана с тем, что наши локализаторы забыли для основного выхода сделать вставку в вышеупомянутый mapInventTrans и все коррекции, которые были добавлены к приходам, не распространялись на расходы.
РЕШЕНИЕ
Нужно в конце метода ProdCalculatingWIPEngine_RU:: createAdjustSettlement() вызвать inventCostItemDim.updateInventTrans(_inventTrans):
X++:
//+ DPL InventClosingFix_OK 11.02.2011 OK
if (inventCostItemDim != null)
{
inventCostItemDim.updateInventTrans(_inventTrans);
}
else
//- DPL InventClosingFix_OK 11.02.2011 OK
_inventTrans.update();
}
Метод updateInventTrans() защищенный (protected), измените его на public:
X++:
//+ DPL InventClosingFix_OK 11.02.2011 OK
//protected void updateInventTrans(InventTrans _inventTrans)
public void updateInventTrans(InventTrans _inventTrans)
//- DPL InventClosingFix_OK 11.02.2011 OK
...