В общем, оказалось как всегда. Пока писал текст под чертой, параллельно проблему и решил.
Суть в том, что у нас был пересчет склада, в InventTrans записалась себестоимость.
Уж что, да как , да почему копейка в ней возникает - расследовать поздно.
Но оперативное решение - поправить InventTrans.CostAmountAdjustment у промаркированных проводок в InventTrans на одну копейку. (которые в синем квадрате)
Тогда все ошибки уходят.
Большое спасибо за участие. Надо было сразу лезть в InventTrans конечно
Снизу, что сначала хотел написать, но уже неактуально.
----------------------------------------------------------------------------------------------------
Вторичная валюта у нас отключена.
Проблема частично "решилась", но не до конца.
После безумной трассировки, решили выделить проблемные номенклатуры в другой журнал.
Включил дебаг (#if.never) отловил номенклатуры, строки с ними вынесли в отдельный журнал переноса.
В итоге исходный журнал без проблемных строк разнесся уже без ошибок.
А второй журнал с проблемными строками разнесся, но только с ошибкой "Критическая ошибка в функции LedgerBondServer_RU.addBondProrateAmountMSTSecond.".
Эту ошибку изучал, есть подозрение, что при корреспонденции "наш" метод InventTran. findBondInventTrans() отрабатывает некорректно (в случае, когда количество по складским проводкам "сопоставляется" по InventTrans.InventRefTransId не один в один, а разбивается. В нашем случае в журнале переноса в строке количество -24 , в InventTrans по InventTransId -16 и -8 (выделено на скрине снизу), а по InventRefTransId 3, 16 и 5. (выделено на скрине сверху). Вот тут то он с ума и сходит.
На очередном журнале, при повторении такого разбиения, ошибка "Не балансирует" осталась. И в логе видна эта копейка. Но теперь уже легче
X++:
public InventTrans findBondInventTrans(InventTransId _inventTransId = this.InventTransId)
{
InventTrans bondInventTrans;
InventDim bondInventDim;
InventDim thisInventDim = this.inventDim();
container dimFields = InventDimSearch::activeFields(this.inventTable().DimGroupId);
int len, i;
fieldId fieldId;
boolean pastFieldId(fieldId _fieldId)
{
return (_fieldId == fieldnum(InventDim, InventLocationId) ||
_fieldId == fieldnum(InventDim, wMSLocationId) ||
_fieldId == fieldnum(InventDim, InventProfileId_RU) ||
_fieldId == fieldnum(InventDim, InventRespPers) ||
_fieldId == fieldnum(InventDim, InventSiteId));
}
void findInventTrans(StatusReceipt _StatusReceipt,
StatusIssue _StatusIssue)
{
select firstonly bondInventTrans
index hint TransIdIdx
order by RecId desc
where bondInventTrans.InventTransId == _inventTransId &&
bondInventTrans.TransType == this.TransType &&
bondInventTrans.StatusReceipt == _StatusReceipt &&
bondInventTrans.StatusIssue == _StatusIssue
join bondInventDim
where bondInventDim.inventDimId == bondInventTrans.inventDimId &&
#InventDimMacros(thisInventDim, bondInventDim);
}
;
len = conlen(dimFields);
for (i = 1; i <= len; i++)
{
fieldId = conpeek(dimFields, i);
if(pastFieldId(fieldId))
{
thisInventDim.(fieldId) = null;
}
}
switch (this.Direction)
{
case InventDirection::Issue:
findInventTrans(StatusReceipt::Purchased,
StatusIssue::None);
break;
case InventDirection::Receipt:
findInventTrans(StatusReceipt::None,
StatusIssue::Sold);
break;
}
return bondInventTrans;
}