Если делать как в топике, то ошибка исчезает, но расчет estimateGross и estimateNet - неправильный. Выход - оставляем как было (не меняем местами doInsert и calcCreditEstimate), но после calcCreditEstimate делаем doUpdate:
PHP код:
public void insert(boolean dropInvent = false,
boolean findMarkup = true,
Common childBuffer = NULL )
{
InventUpd_Estimated estimated;
NumberSeq numberSeq;
SalesTable salesTable;
container salesEstimated;
AmountCur estimate;
;
if (salesLine.inventTable().interCompanyBlockedSales() && salesLine.salesTable().isInterCompanyOrder())
throw checkFailed(strFmt("@SYS74812", salesLine.itemId));
ttsbegin;
if (salesLine.creditNoteLine())
salesLine.transactionCode = IntraStatParameters::find().defaultCreditNote;
numberSeq = NumberSeq::newGetNum(InventParameters::numRefInventTransId());
salesLine.inventTransId = numberSeq.num();
if (!salesLine.custAccount || !salesLine.custGroup)
{
salesLine.custAccount = salesLine.salesTable().custAccount;
salesLine.custGroup = salesLine.salesTable().custGroup;
}
salesLine.taxAutogenerated = NoYes::Yes;
salesLine.setSalesStatus();
if (!salesLine.interCompanySkipUpdate && salesLine.salesTable().isInterCompanyOrder())
this.interCompanyMirror(salesLine.salesTable());
this.updateSalesTable();
if (salesLine.salesStatus != salesLine.salesTable().salesStatus)
{
salesTable = salesLine.salesTable(true);
salesTable.salesStatus = salesLine.salesStatus;
salesTable.update();
}
if (!dropInvent)
{
estimated = new InventUpd_Estimated(InventMovement::construct(salesLine, false, childBuffer));
estimated.updateNow();
}
salesLine.doInsert();
salesLine.calcCreditEstimate();
//-> Теперь зафиксируем измененные значения
salesLine.doUpdate();
//<-
if (estimated)
estimated.updateReservation();
if (findMarkup)
salesLine.createMarkupTrans(salesLine.salesTable());
ttscommit;
}
Вроде теперь все правильно считает и ошибки нет.