Спасибо за идею, правда, в моем случае такое "прямолинейное" решение не подошло, потому что 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-ю