Показать сообщение отдельно
Старый 14.02.2011, 12:47   #2  
Bega is offline
Bega
Участник
Аватар для Bega
 
382 / 444 (15) +++++++
Регистрация: 18.08.2005
Адрес: Москва
ПРОБЛЕМА 2. Неверная себестоимость расходов по побочной продукции.
Эта проблема очень похожа на предыдущую, но причина немного в другом. Рассмотрим на примере. Вся логика выполняется на 0-й итерации.

Есть продукция «какао-масло» и побочная «жмых», в расход идет «какао-тертое». На предыдущих шагах закрытия склада были сделаны коррекции «какао-тертого», то есть изменилась себестоимость расхода. Эта коррекция попала в таблицу inventCostListTrans, чтобы система переоценила стоимость связанных выходов «какао-масла» и «какао-тертого».

Далее система доходит до расчета «какао-масла», запускает расчет RU5, рассчитывается стоимость выхода основной и побочной продукции. Для побочной продукции локализаторы , в отличие от проблемы №1 сделали правильно – вызвали из своей логики метод updateTransIdReceipt(), который отразил коррекцию на приходе побочной продукции и добавил проводку в mapInventTrans, чтобы «распространить» коррекцию на сопоставленные расходные проводки.

Все бы было хорошо, если бы это не было 0-й итерации и самым первым расчетом для «какао-масла». На нулевой итерации в методе InventCostItemDim:: updateItem() запускается сопоставление по модели:
X++:
se = setInventDim.getEnumerator();
while (se.moveNext())
{
     inventDim = se.current();

     this.initMapInventTrans();
     this.load(inventDim);
     this.updateReceiptAdjustment();
     this.updateModel(inventDim);
}
При вызове this.initMapInventTrans() все сохраненные в mapInventTrans данные ОЧИЩАЮТСЯ, так что стоимость расходов по побочной продукции никогда не будет приведена в соответствие с приходами.

РЕШЕНИЕ

В методе InventCostItemDim:: updateItem() перед циклом сопоставления нужно вызвать updateReceiptAdjustment():
X++:
        else
        {
            // if this is not a closing, or if this is the first time, then match ..

            // first match issues and receipts that are marked
            this.updateSettleRefItem(inventCostList.ItemId);

            //+ DPL InventClosingFix_OK 12.02.2011 OK
            //если здесь не вызвать этот метод-не идут дальше коррекции по побочной продукции
            if (calculationProdWIP_RU)
                this.updateReceiptAdjustment();
            //- DPL InventClosingFix_OK 12.02.2011 OK

            // then match remaining issues and receipts according to inventory model
            if (! isServiceItem)
            {
                setInventDim = new Set(Types::Record);

                // find all financial dimension combinations
                queryRun = inventCostHelp.initQueryRunTrans(this.inventTable(inventCostList.ItemId),
 this.inventModelGroup(inventCostList.ItemId));
                while (queryRun.next())
                {
                    inventDim = queryRun.get(tablenum(InventDim));

                    setInventDim.add(inventDim);
                }

                // match issues and receipts per financial dimension combination
                se = setInventDim.getEnumerator();
                while (se.moveNext())
                {
                    inventDim = se.current();

                    this.initMapInventTrans();
                    this.load(inventDim);
                    this.updateReceiptAdjustment();
                    this.updateModel(inventDim);
                }

                setInventDim = null;
            }
        }