Добавление и удаление исполнителей в запущенном процессе с помощью доп. обработчика

1. blandinko 24.04.18 13:09 Сейчас в теме
Добрый день, возник вопрос:

можно ли программно с помощью доп. обработчика откорректировать список исполнителей в уже запущенном процессе?

Например, запускается процесс согласования, и в нем необходимо удалить определенного пользователя и добавить другого.
Создан доп. обработчик с подпиской на "Старт процесса" с проверкой типа процесса.
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. sergathome 4 24.04.18 13:29 Сейчас в теме
Описание проблемы - взрыв мозга.
Ну так "в уже запущенном процессе?" или "запускается процесс согласования," ?
Ж))
Программно можно сделать всё, вопрос надо ли...
3. blandinko 24.04.18 13:53 Сейчас в теме
(2)
Есть документ вида "Протокол совещания".
В документ добавлены несколько доп. реквизитов "Участник совещания" (1, 2, 3...).
Необходимо, чтобы в согласование автоматически попадали эти участники совещания из доп. реквизитов.
Добавила мнимого пользователя "Все участники совещания". Создала шаблон процесса согласования "Согласование с участниками совещания", где в качестве исполнителя фигурирует этот мнимый пользователь "Все участники совещания".
Хочу при старте процесса согласования с помощью доп. обработчика заменять мнимого пользователя "Все участники совещания" на сотрудников из доп. реквизитов "Участник совещания".
14. Skromnyi 13 24.04.18 15:29 Сейчас в теме
(3) Какой тип данных у доп.реквизита: "Участник совещания"?
16. blandinko 24.04.18 16:01 Сейчас в теме
(14)
тип значения Пользователь
4. sergathome 4 24.04.18 13:59 Сейчас в теме
Вешаетесь на событие, абсолютно правильно, в обработчике получаете предмет процесса, читаете из него допреквизиты и заполняете ТЧ Исполнители.
В чём проблема ?
5. blandinko 24.04.18 14:14 Сейчас в теме
(4)
Проверяю возможность добавить исполнителя:

БизнесПроцесс = Событие.Источник;

Если ТипЗнч(БизнесПроцесс) = Тип("БизнесПроцессСсылка.Согласование") Тогда

  ТипыДокументов = Новый Массив;
  ТипыДокументов.Добавить(Тип("СправочникСсылка.ВнутренниеДокументы"));

  ВидыДокументов = Новый Массив;
  ВидыДокументов.Добавить(Справочники.ВидыВнутреннихДокументов.НайтиПоНаименованию("_Протокол совещания"));
    
  ОсновныеПредметы = МультипредметностьКлиентСервер.ПолучитьМассивПредметовОбъекта(БизнесПроцесс, ТипыДокументов, Истина);
  
  Для Каждого Предмет ИЗ ОсновныеПредметы Цикл
    
    Если ВидыДокументов.Найти(Предмет.ВидДокумента) <> Неопределено Тогда

      Строка = БизнесПроцесс.Исполнители.Добавить();
      Строка.Исполнитель = Справочники.Пользователи.НайтиПоНаименованию("Администратор");

    КонецЕсли;    
  КонецЦикла;

КонецЕсли;    
Показать


Бизнес-событие не удается обработать. Ошибок в ЖР не падает.
Возможно, нужно добавлять исполнителей в ТЧ как-то по-другому?
17. Skromnyi 13 24.04.18 16:17 Сейчас в теме
(5) тут надо получить вначале объект:
    Если ВидыДокументов.Найти(Предмет.ВидДокумента) <> Неопределено Тогда
      БизнесПроцесОбъект = БизнесПроцесс.ПолучитьОбъект();
      Строка = БизнесПроцесОбъект.Исполнители.Добавить();
      Строка.Исполнитель = Справочники.Пользователи.НайтиПоНаименованию("Администратор");
      БизнесПроцесОбъект.Записать();
    КонецЕсли;  

НО! это не поможет, так как не создана задача для "Администратора".
18. Skromnyi 13 24.04.18 22:34 Сейчас в теме
(17)Я бы попробывал вот так:
         Если ВидыДокументов.Найти(Предмет.ВидДокумента) <> Неопределено Тогда
                
                СтарыеУчастникиПроцесса = БизнесПроцессыИЗадачиВызовСервера.ТекущиеУчастникиПроцесса(БизнесПроцесс.Ссылка);
                БизнесПроцесОбъект = БизнесПроцесс.ПолучитьОбъект();
                Строка = БизнесПроцесОбъект.Исполнители.Добавить();
                Строка.Исполнитель = Справочники.Пользователи.НайтиПоНаименованию("Администратор");
                БизнесПроцесОбъект.Записать();
                БизнесПроцесОбъект.ИзменитьРеквизитыНевыполненныхЗадач(СтарыеУчастникиПроцесса, Новый Структура);
                
            КонецЕсли;
  
Показать
6. sergathome 4 24.04.18 14:18 Сейчас в теме
"БизнесПроцессСсылка.Согласование" или "БизнесПроцессОбъект.Согласование" ? ;))
7. blandinko 24.04.18 14:28 Сейчас в теме
(6)
Вы правы.
БС обрабатывается, но исполнитель не добавляется.
8. sergathome 4 24.04.18 14:32 Сейчас в теме
Какое бизнес-событие ? При чём здесь бизнес-событие ? ГДЕ Я ???

Вешаетесь на событие БП ПередЗаписью. Там пишете:
    Реквизиты = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Источник.Ссылка, "Стартован");
    
    Если Источник.Стартован И Не Реквизиты.Стартован Тогда // старт бизнес-процесса
        
    |||||||||||||||||||||||||||||||||||||||||||  ЗАПОЛНЯЕМ     
        
    КонецЕсли;    

Показать


У ТЧ Исполнители есть другие колонки, кроме, собственноЮ, Исполнитель. Их тоже надо заполнять...
9. blandinko 24.04.18 14:41 Сейчас в теме
(8)
Бизнес-событие "Старт процесса" в регистре сведений "Произошедшие бизнес-события" обрабатывается успешно.
10. sergathome 4 24.04.18 14:51 Сейчас в теме
Всё, я тормоз. Вы пытаетесь ловить бизнес-событие и подпиской его обрабатывать. Спорное решение, ну ладно, допустим. Тогда вам нужно самой ВРУЧНУЮ добавить и исполнителей, и сгенерить для них задачи и тд, и тп - ПОЕЗД УЖЕ УШЁЛ, да догнать можно, но очень сложно.

Я предлагаю вам создать подписку на событие ПередЗаписью вашего бизнес-процесса. Да, это доработка, но она проще в разы.
11. blandinko 24.04.18 14:59 Сейчас в теме
(10)
Я поняла Вас.
Конфигурация на полной поддержке, снимать с нее нельзя.
15. Skromnyi 13 24.04.18 15:37 Сейчас в теме
(11) Вообще можно снять с поддержки всего один общий модуль "ШаблоныБизнесПроцессовПереопределяемый", где и прописать свою автоподстановку (он кстати для этого и предназначен). Или если позволяет версия конфигурации, то использовать Расширение.
Но насколько я понял в вашем случае это не сработает, так как там возвращается конкретное значение - роль или исполнитель, а у вас их несколько может быть.
12. sergathome 4 24.04.18 15:03 Сейчас в теме
Есть ещё вариант - взять запущенный процесс, сгенерировать на основании его данных новый, стартовать его, а старый уничтожить. так проще будет.
13. blandinko 24.04.18 15:14 Сейчас в теме
(12)
Гениально! Сейчас буду пробовать.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот