Показать сообщение отдельно
Старый 12.04.2011, 11:09   #22  
Bega is offline
Bega
Участник
Аватар для Bega
 
382 / 444 (15) +++++++
Регистрация: 18.08.2005
Адрес: Москва
ПРОБЛЕМА 6. При расчете по средневзвешенной проводки не всегда сопоставляются, стоимость расхода из-за этого неверная.

У нас в течение периода ГП часто движется без стоимости, потому что калькуляция производственных заказов происходит позже, чем выпуск.

В феврале при создании виртуального переноса для средневзвешенной цены , поскольку на момент создания этого переноса у сопоставляемых проводок была нулевая стоимость, создались складские проводки «Средневзвешенное закрытие запасов» (InventTransType = SummedUp) с нулевой финансовой суммой (CostAmountPosted = 0). Далее на следующих шагах закрытия февраля, средневзвешенная была скорректирована (сумма CostAmountAdjustment), значение CostAmountPosted так и осталось нулевым, это все вполне корректно. На конец февраля мы имеем остаток по номенклатуре и единственную складскую открытую проводку «Куплено» с типом «Средневзвешенное закрытие запасов».

В марте в методе InventCostItemDim::updateModelAverage происходит сопоставление приходов и расходов в соответствии со средневзвешенной моделью себестоимости.
В этом куске кода происходит поиск подходящих приходов для сопоставления:
X++:
while (tmpreceiptScan.RecId&&tmpreceiptScan.TransDate<=endDate)
{
receiptScan = this.tmpReceipt2Trans(tmpreceiptScan);
            // <GEEU>
            if (receiptScan.TransType != InventTransType::SummedUp || this.currencyTransfer_RU(receiptScan))
            { 
            // </GEEU>
вызывается метод this.currencyTransfer_RU(), в котором проверяется только CostAmountPosted, а она у нас равна нулю.
X++:
protected boolean currencyTransfer_RU(InventTrans _inventTrans)
{
    return _inventTrans.CostAmountPosted != 0;
}
таким образом, наша открытая проводка «Средневзвешенное закрытие запасов» будет исключена из сопоставления и мартовская расходная проводка не будет сопоставлена и ее стоимость будет неверной.

РЕШЕНИЕ

Я закрыл слад вот с такой модификацией и проблема была решена:
X++:
//+ DPL InventClosingFix_OK 11.04.2011 OK
            //if (receiptScan.TransType != InventTransType::SummedUp || this.currencyTransfer_RU(receiptScan))
            if (   receiptScan.TransType != InventTransType::SummedUp || receiptScan.costValue() != 0)
            //- DPL InventClosingFix_OK 11.04.2011 OK
Можно бы было доделать currencyTransfer_RU(), чтобы он анализировал и CostAmountAdjustment но он используется ниже в других местах и такая модификация потребует еще тестирования, проверю отдельно и напишу.
За это сообщение автора поблагодарили: EVGL (20), zelibobis (1).