Показать сообщение отдельно
Старый 21.12.2014, 20:45   #1  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,971 / 3267 (116) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Как вариант - отмена закрытия не сторнирует полностью закрытие по ГК из-за того что после закрытия удалили проводки 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;
}

Последний раз редактировалось Logger; 21.12.2014 в 20:50.
За это сообщение автора поблагодарили: Товарищ ♂uatr (1).