Как вариант - отмена закрытия не сторнирует полностью закрытие по ГК из-за того что после закрытия удалили проводки InventTrans в закрытом периоде (штатно такое невозможно, но вероятно у вас джобом документ грохали).
Рекомендую проверить что InventSettlement по закрытию балансирует с ГК по закрытию.
Например в одной транзакции пометить его как неразнесенный (InventSettlement.posted = 0) разнести, вывести куда нить полученные проводки по ГК или сравнить с уже сделанными и откатить транзакцию.
Если не балансирует, то скорее всего все так и было.
Для защиты от удаления проводок поучаствовавших в закрытии / пересчете, можно сделать такую модифу (пример приводу для 2009-й аксапты) :
\Data Dictionary\Tables\InventTrans\Methods\delete
X++:
...
if (this.isUpdatedFinancial())
{
// pkoz 19.03.2009 -->
this.GRD_checkDeleteSettlement(); // перед удалением проверяем есть ли неотмененные сопоставления
// - если есть то удалять нельзя нужно сперва отменить соответсвующее сопоставление, или коррекцию
// если разрешить удаление без отмены как здесь, то тогда разъедется LedgerTrans и InventTrans
// Дальнейшая отмена сопоставлений, коррекций, как я понимаю ситуацию уже не вылечит, так как
// записи в inventSettlement по которым при отмене будут делать проводки по ГК уже будут удалены
// т.е. нужно либо запретить удапение, либо при удалении делать сторнирующую проводку по ГК на
// суммы удаляемых InventSettlement. Ну и просто - даже если проводок по ГК не было - InventSettlement
// друг с дружкой связаны ссылками - поэтому просто удалять нельзя.
// см. джоб GRD_6029_CancelSettlementPerInventTrans
// pkoz 19.03.2009 <--
delete_from inventSettlement
index hint RecIdTypeIdx
where inventSettlement.transRecId == this.recId &&
inventSettlement.itemId == this.itemId;
}
...
\Data Dictionary\Tables\InventTrans\Methods\GRD_checkDeleteSettlement
X++:
// pkoz 19.03.2009
boolean GRD_checkDeleteSettlement(boolean _doThrow
= true
// = false
)
{
InventSettlement inventSettlement;
boolean ret = true;
InventClosing InventClosing;
str locGetErrorText()
{
return
strFMT("По проводке Лот %1, recID %2, TransRefID %3, TransType %4 - есть неотмененные сопоставления/коррекции. Дата сопоставления/коррекции - %5",
this.InventTransId,
this.RecId,
this.TransRefId,
this.TransType,
inventSettlement.TransDate //pkoz 31.07.2014
);
}
;
if (this.isTmp())
return true;
ttsBegin;
while
select forupdate inventSettlement
order by transDate //pkoz 31.07.2014
where
inventSettlement.transRecId == this.recId &&
// inventSettlement.itemId == this.itemId
inventSettlement.Cancelled == NoYes::No
//pkoz 09.07.2012 -->
/*
// добавили такое условие потому что реально надо запрещать удаление InventTrans только если есть неотмененные сопоставления по
// ваучеру отличному от ваучера из InventTrans
// а именно этому случаю соответсвуют сопоставления от пересчетов, закрытий и коррекций
// если же сопоставление возникло из-за накладных расходов при разноске закупки (markupTrans)
// то там ...
join InventClosing
where
InventClosing.Voucher == inventSettlement.Voucher
&& InventClosing.TransDate == inventSettlement.TransDate
*/
//pkoz 09.07.2012 <--
{
//pkoz 09.07.2012 -->
if ( this.DateFinancial == inventSettlement.TransDate
&& this.Voucher == inventSettlement.Voucher
&& !inventSettlement.inventClosing_GRD()
)
{
// добавили такое условие потому что реально надо запрещать удаление InventTrans только если есть неотмененные сопоставления по
// ваучеру отличному от ваучера из InventTrans
// а именно этому случаю соответсвуют сопоставления от пересчетов, закрытий и коррекций
// если же сопоставление возникло из-за накладных расходов при разноске закупки (markupTrans)
// то там ...
continue;
}
//pkoz 09.07.2012 <--
if (_doThrow)
throw error(locGetErrorText());
ret = checkFailed(locGetErrorText());
break;
}
ttsCommit;
return ret;
}