ограничение на закрытие задачи

Добрый день
есть необходимость запрещать ставить у задач статус выполнена, если по процессу не закрыл задачу другой пользователь
пытался сделать следующим образом - в скрипте задач, при закрытии задачи, дергался запрос, который выбирал задачу у другого пользователя связанного с данным процессом, брал статус этих задач, и если он не равен завершению у первого пользователя выдавалось окно и задача не закрывалась
беда в том, что по процессу это повторяется дважды, и во второй раз задача первого пользователя все равно закрывается, даже если вторая задача у второго пользователя (извиняюсь за тавтологию) не закрыта
хотя проверял запрос, он выдает код не закрытой задачи
теряюсь в догадках, как такое может получится
может кто-то что-то подсказать, как быть в данной ситуации?

Нравится

9 комментариев

А как Вам вариант установки флажка в параметр диаграммы? Например, на OnBeforeExecute задачи (или перед этим элементом "Скрипт") для второго пользователя устанавливать некий параметр в 1. Затем после самой задачи в элементе "Скрипт" устанавливать параметр в 0. При этом задача уже точно будет выполнена, иначе процесс не пойдет дальше по ветке "Выполнена". Соответственно для первого пользователя проверять значение созданного параметра и если он 1, то не разрешать закрывать задачу.
В Вашем случае могу посоветовать проверять значение IsFinish (если в TaskAction.OnExecute) или IsComplete (в обработчиках OnAfterExecute задачи). Возможен вызов дважды, один из которых и дает некорректный результат.
При корректно отработанном запросе нужно искать проблему в самом запрете на перевод задачи в "разрешен".

насколько понял, IsComplete меняет значение на true, достаточно поздно, поэтому не могу понять когда, а главное где, прописать блокировку закрытия задачи.
а если прописывать в ActionItem, то он будет всегда обращаться к параметру диаграммы, который будет только у одного процесса. Хотя у меня сейчас проверка дергается из обработчика нажатия кнопки ок окна задачи.
можно попробовать прописать в OnAfterExecute проверку параметра диаграммы, после чего скрывать кнопку ок и выдавать окно с сообщением. сейчас попробую, может подойдет, но может есть еще идеи?

Пока это наиболее очевидные и реализуемые варианты.
Как вариант - создание задачи первому, только после завершения задачи у второго, т.е. в самом процессе разместить задачи по очередности. Но это может быть недопустимо с точки зрения общей логики, заложенной в процесс.

касательно последовательного запуска - таки противоречит общей логики
а касательно реализации, можно перенести из скрипта окна в TaskAction, но вот касательно логики связанной с IsComplete не понятен путь возможной реализации
но даже существующая реализация, описанная в первом посте, не всегда отрабатывает корректно, будем тестировать дальше

а такой вопрос - подскажите, как из элемента диаграммы прописать невозможность закрыть задачу

По поводу IsComplete - я предлагал на OnAfterExecute задачи устанавливать значение параметра. Но обработчик вызывается дважды, с разными значениями IsComplete. Второй вызов происходит по фактическому завершению задачи, вот там задача уже и выполнена.

Из элемента диаграммы, точнее из его скрипта происходит формирование значений по умолчанию, которые передаются в карточку редактирования. Уже по ее закрытию вновь выполняется OnExecute для элемента, где уже заполненные значения считываются и сохраняются в параметры диаграммы.
Таким образом "блокировать" карточку задачи можно из скрипта scr_TaskEdit. В скрипте элемента нет еще сформированной карточки. Есть вариант на OnExecute элемента передавать через атрибуты признак блокировки задачи и зависимо от него делать неактивной кнопку "ОК". Как вновь активировать ОК - есть несколько путей. Возможно не совсем красивый - сохранить в атрибутах коннектора карточку задачи и уже по завершению второй задачи обратиться к первой и активировать кнопку.

хорошо, допустим остаемся на варианте блокировки в scr_TaskEdit, при нажатии кнопки ok, при выполнении ряда условий (проверка пользователя, проверка в бп ли мы, проверка в том ли бп) выполняются следующие строчки (код тестовый, посему не серчайте)

var Finance = '{...}';
var SelectQuery2 = GetSingleItemByCode('sq_CheckTaskFinance');
 
ApplySelectQueryFilter(SelectQuery2, 'Workflow', CurrentWFID, true);
ApplySelectQueryFilter(SelectQuery2, 'Finance', Finance, true);
 
var Dataset124 = SelectQuery2.Open();
if (!Dataset124.IsEmpty) {
  MessageBox(Dataset124.RecordsCount);
  var FinStat = Dataset124.Values('StatusID');
...

таким образом, он проверяет, есть ли у другого пользователя задачи связанные с данным экземпляром бп (а у этого пользователя могут быть задачи только одного типа), и потом проверяет их статус
так вот, при проверке запроса sq_CheckTaskFinance записи о текущих задачах отображаются корректно, в данном скрипте отключил фильтр на выполненные задачи, так как их всего возникнет 2 и строчка

MessageBox(Dataset124.RecordsCount);

вполне однозначно покажет, сколько записей найдено, когда их должно быть две
так вот - из администратора при проверке скрипта (в ручную указываю значения фильтра) - находит 2 задачи, а из бп (из скрипта задачи при проходе по бп) - только 1 (это когда их уже должно быть две)
вопрос - выборка по запросам хранится где-то в кэше? потому что другой причины я не вижу, и как бы этот кэш отключить?

Перепишите получение запроса на

var SelectQuery2 = Services.GetNewItemByUSI('sq_CheckTaskFinance');

Кроме того посмотрите профайлером, какой именно запрос идет в базу при выполнении из скрипта - так установите, в чем подвох - неправильный запрос или что-то другое.

Показать все комментарии