Показать сообщение отдельно
Старый 24.10.2012, 21:38   #6  
db is offline
db
Роман Долгополов (RDOL)
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
 
393 / 692 (24) +++++++
Регистрация: 01.04.2004
Адрес: Москва
указанный вами метод вызывается из \Data Dictionary\Tables\RAssetTable\Methods\acquisitionPriceFromPurchLine, а тот в свою очередь из \Classes\PurchFormLetter_Invoice\createParmLine
то есть на каждую строку закупки происходит расчет итогов по всей закупке. На хороших серверах для 1000 строчной закупки это секунд 30 на строку или около 8 часов пустого числодробления. Самое очевидное решение - закешировать purchTotals. "родного" purchTotals из purchFormLetter в момент работы этого кода нет, да и разбираться с возможными побочными эффектами не хочется, поэтому добавляем

\Classes\PurchFormLetter_Invoice\classDeclaration
X++:
...
    PurchTotals  rAssetPurchTotals;
    PurchId      rAssetPurchId;
...
изменяем
\Data Dictionary\Tables\RAssetTable\Methods\acquisitionPriceFromPurchLine
X++:
public server static RAssetAmount acquisitionPriceFromPurchLine(PurchLine   _purchLine, PurchTotals _purchTotals = null)
{
    PurchTotals  purchTotals = _purchTotals;
    TaxPurch     taxPurch;
    RAssetAmount acquisitionPrice;
    ;
    if (! purchTotals)
    {
        purchTotals      = PurchTotals::newPurchTable(_purchLine.purchTable());
        purchTotals.calc();
    }

    taxPurch         = purchTotals.tax();
    acquisitionPrice = _purchLine.taxPcsPrice() +
                       purchTotals.purchMarkup() / (_purchLine.QtyOrdered ? _purchLine.QtyOrdered : 1) +
                       (taxPurch.taxInCostPrice(_purchLine.TableId,_purchLine.RecId) /
                       (_purchLine.QtyOrdered ? _purchLine.QtyOrdered : 1));

    acquisitionPrice = round(acquisitionPrice,
                             RAssetParameters::find().AssetRound);

    if (_purchLine.CurrencyCode != CompanyInfo::standardCurrency())
    {
        acquisitionPrice = Currency::curAmount2CurAmount(acquisitionPrice,
                                                         _purchLine.CurrencyCode,
                                                         CompanyInfo::standardCurrency());
    }

    return acquisitionPrice;
}
и изменяем его вызов
X++:
\Classes\PurchFormLetter_Invoice\createParmLine
....
            if (! rAssetPurchTotals || rAssetPurchId != _purchLine.PurchId)
            {
                rAssetPurchTotals = PurchTotals::newPurchTable(_purchLine.purchTable());
                rAssetPurchTotals.calc();
                rAssetPurchId = _purchLine.PurchId;
            }
            localAcquisitionPrice = RAssetTable::acquisitionPriceFromPurchLine(_purchLine, rAssetPurchTotals);
...
Весь код из 2009 SP1 RU8
За это сообщение автора поблагодарили: sukhanchik (4), S.Kuskov (1), vazerdim (1).