Показать сообщение отдельно
Старый 04.01.2012, 17:11   #6  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5803 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Спасибо за идею, правда, в моем случае такое "прямолинейное" решение не подошло, потому что validateField() вызывается в т.ч. из validateWrite() и еще из кучи мест, включая класс разноски журналов ГК. Во вложении - реализация аналогичной проверки, сделанная за счет дополнения к иерархии классов LedgerJournalTransType. Заодно и сам этот класс подправлен: он в паре мест вызывает свои методы через SysDictClass.callObject(), но при этом не запрашивает ExecutePermission, из-за чего при выполнении на сервере код валится с ошибкой (правда, это проявляется лишь при программном создании строк журналов ГК на сервере). Проверка срабатывает только в "интерактивном контексте" в терминологии данного семейства классов, т.е. в общем случае при работе через форму или AIF, и только если запись была изменена с момента последнего сохранения в БД:
X++:
protected boolean checkApprovedRCashNotModified()
{
    LedgerJournalTrans_RCash    ledgerJourTrans_RCash;
    LedgerJournalTrans          ledgerJourTransOrig;
    LedgerJournalTrans          ledgerJourTrans;
    SysInfologStr               txt;
    boolean                     ret = true;
    ;
    if (    isInteractiveContext                // NB! проверка должна выполняться строго в интерактивном контексте!
        &&  operation == LedgerJournalOperation::Update
       )
    {
        ledgerJourTrans = axLedgerJournalTrans.ledgerJournalTrans();
        ledgerJourTransOrig = ledgerJourTrans.orig();
        if (!ledgerJourTrans.equal(ledgerJourTransOrig))
        {
            ledgerJourTrans_RCash = LedgerJournalTrans_RCash::find(ledgerJourTrans.RecId);
            if (ledgerJourTrans_RCash.CashDocId != '')
            {
                setprefix(strfmt("@SYS67148", ledgerJourTrans.LineNum));
                txt = strfmt(@"По строке журнала уже создана кассовая проводка с '%1' '%2', поэтому ее нельзя редактировать",
                            fieldpname(LedgerJournalTrans_RCash, CashDocId),
                            ledgerJourTrans_RCash.CashDocId
                            );
                ret = AifFault::checkFailedLogFault(txt, #LedgerJournalTransCanNotBeChangedWhenRCashTransCreated);
            }
        }
    }
    return ret;
}
PS. Модифа сделана под 2009-ю
Вложения
Тип файла: rar DEV_RCashWithoutLgrTransFix.rar (2.9 Кб, 57 просмотров)

Последний раз редактировалось gl00mie; 04.01.2012 в 17:12. Причина: указание версии