13.11.2014, 21:05 | #1 |
Дмитрий Ерин
|
Баг: Циклическое делегирование в WorkFlow
AX2009
Стандартный функционал в некоторых случаях некорректно обрабатывает длинные цепочки делегирования. Например, если у пользователя Boss в параметрах настроено активное делегирование по всем конфигурациям (Результат = Все) на пользователя Zam, а у пользователя Zam - делегирование по конкретной конфигурации "Конф0001" на пользователя Buh, то при запуске документооборота по какой-либо другой конфигурации будет выдана ошибка "Обнаружено циклическое делегирование: Zam->Boss->Zam". Хотя на самом деле должно было сработать делегирование Boss->Zam. Если документооборот выполняется по конфигурации "Конф0001", цепочка будет определена верно (Boss->Zam->Buh). Проблема кроется в методе \Classes\SysWorkflowHelper\getDelegate: X++: public server static WorkflowUser getDelegate( WorkflowUser _user, WorkflowConfigurationTable _configTable) { WorkflowTrackingMessage trackingMessage; userId delegateUser; Set delegatedUsers = new Set(Types::String); utcdatetime delegateDate = DateTimeUtil::utcNow(); SetEnumerator userEnumerator; str users; //inline method void findDelegate(WorkflowUser _userId) { WorkflowWorkItemDelegationParameters delegationParameters; while select delegationParameters where delegationParameters.User == _userId && delegationParameters.Enabled == NoYes::Yes && delegationParameters.FromDate < delegateDate && delegationParameters.ToDate > delegateDate { switch (delegationParameters.Type) { case WorkflowWorkItemDelegationType::All: delegateUser = delegationParameters.Delegate; break; case WorkflowWorkItemDelegationType::Category: if (delegationParameters.CategoryName == _configTable.CategoryName) { delegateUser = delegationParameters.Delegate; } break; case WorkflowWorkItemDelegationType::Configuration: if (delegationParameters.ConfigurationSequenceNumber == _configTable.SequenceNumber) { delegateUser = delegationParameters.Delegate; } break; default: throw error(strfmt("@SYS122124", enum2str(delegationParameters.Type))); } if (delegateUser) //////// <== Вот это проверка срабатывает некорректно! { if (delegatedUsers.in(delegateUser)) { userEnumerator = delegatedUsers.getEnumerator(); while(userEnumerator.moveNext()) { if (!users) { users = userEnumerator.current(); } else { users = users + '->' + userEnumerator.current(); } } users = users + '->' + delegateUser; trackingMessage = strfmt("@SYS122125", users); throw error(trackingMessage); } else { delegatedUsers.add(delegateUser); findDelegate(delegateUser); } break; } } } ; delegatedUsers.add(_user); findDelegate(_user); return strlen(delegateUser) > 0 ? delegateUser : _user; } Лечить можно по-разному:
__________________
|
|
|
За это сообщение автора поблагодарили: Logger (3), S.Kuskov (2). |
27.07.2015, 09:49 | #2 |
Участник
|
Подскажите, где настраивается делегирование?
То есть где создаются записи в WorkflowWorkItemDelegationParameters? |
|
27.07.2015, 09:58 | #3 |
Дмитрий Ерин
|
Параметры пользователя - вкладка "Делегирование"
|
|
27.07.2015, 10:07 | #4 |
Участник
|
На этой вкладке отображается пустая таблица и нет возможности добавить запись
|
|
27.07.2015, 10:16 | #5 |
Участник
|
Че это нет возможности? А если встать на grid и нажать Ctrl-N?..
|
|
27.07.2015, 10:23 | #6 |
Участник
|
Через CTRL-N работает. То есть тут только через горячие клавиши?)
|
|
27.07.2015, 10:36 | #7 |
Участник
|
Тут как везде: если grid находится в фокусе ввода, то также работает кнопка создания новой записи на панели инструментов:
|
|
27.07.2015, 11:37 | #8 |
Участник
|
Разобралась. На форме SysUserSetup стояло свойство HideToolbar = Yes
|
|
Теги |
ax2009, workflow, баг, делегирование, ошибка |
|
|