![]() |
#1 |
Участник
|
Ax2009 Проводки по кассе есть, а строк журнала нет
1. Тема поднималась в Есть проводка по модулю (касса), нет по ГК
но решение я не смогла найти. Не понимаю в какой момент он дает удалить после одобрения. 2 Может кто сталкивался. Захожу в журнал ордеров. 3 одобренных. Редактировать не дает. Делаю новую строчку, заполняю. Удаляю ее. И все 3 предыдущих одобренных ордера становятся доступными для редактирования. Не могу найти место, где в коде ошибка. Более того, если создать строку по кнопке вниз и ему будет что-то не нравиться в ней, он ее блокирует и при этом блокирует от изменений все другие неодобренные строки журнала. Надо выйти из журнала и зайти. Только после этого все ок. |
|
![]() |
#2 |
Участник
|
Цитата:
Сообщение от Arahnid
![]() 1. Тема поднималась в Есть проводка по модулю (касса), нет по ГК
но решение я не смогла найти. Не понимаю в какой момент он дает удалить после одобрения. 2 Может кто сталкивался. Захожу в журнал ордеров. 3 одобренных. Редактировать не дает. Делаю новую строчку, заполняю. Удаляю ее. И все 3 предыдущих одобренных ордера становятся доступными для редактирования. Не могу найти место, где в коде ошибка. Более того, если создать строку по кнопке вниз и ему будет что-то не нравиться в ней, он ее блокирует и при этом блокирует от изменений все другие неодобренные строки журнала. Надо выйти из журнала и зайти. Только после этого все ок. |
|
![]() |
#3 |
Участник
|
Цитата:
|
|
|
За это сообщение автора поблагодарили: Bega (1). |
![]() |
#4 |
Участник
|
Проблема в том, что после удаления строки LedgerJournalTrans почему-то перестает нормально работать датасорс LedgerJournalTrans_RCash (возвращает пустую запись, хотя в базе она есть). Почему это происходит, не могу понять. Насчет "фигакс!" gl00mie прав, там после всей логики разрешения/запрета редактирования просто перезаписывается allowEdit() исходя из статуса LedgerJournalTrans_RCash, поскольку этот буфер пустой, то allowEdit() становится в true.
Пока что нашел некрасивое решение: в конце метода executeQuery() датасорса LedgerJournalTrans_RCash вставить: X++: if (!LedgerJournalTrans_RCash) { LedgerJournalTrans_RCash = LedgerJournalTrans_RCash::find(LedgerJournalTrans.RecId, true); } |
|
![]() |
#5 |
Участник
|
Мое решение выглядело так - на методе validateField в таблице LedgerJournalTrans поставила запрет на редактирование
X++: if (LedgerJournalTrans_RCash::find(this.RecId).CashDocId) { throw error ('Нельзя редактировать одобренную строку!'); } |
|
|
За это сообщение автора поблагодарили: gl00mie (3). |
![]() |
#6 |
Участник
|
Спасибо за идею, правда, в моем случае такое "прямолинейное" решение не подошло, потому что 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; } Последний раз редактировалось gl00mie; 04.01.2012 в 17:12. Причина: указание версии |
|
|
|