указанный вами метод вызывается из \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