Основная проблема реализации - то, что ДО активно использует обработку через регламентные задания, поэтому выполнить код нельзя прямо в скрипте схемы процесса. Все делаем в пользовательском режиме.
Поехали:
1. Реализовать можно и без расширения, и так нам нужна функция поиска элемента, именно ее мы и будем добавлять в расширение, добавляем в общий модуль DIS_ОбщиеФункцию
Функция НайтиСоздатьСкрипт_ЗарегистрироватьСобытиеПерезапуска() Экспорт
ИдентификаторСсылки = Новый УникальныйИдентификатор("a777b57b-1fd6-11e5-926b-07051c6a2d65");
Обработчик = Справочники.СкриптыСхемДляОбработокОбъектов.ПолучитьСсылку(ИдентификаторСсылки);
Если Не ОбщегоНазначения.СсылкаСуществует(Обработчик) Тогда
оСпр = Справочники.СкриптыСхемДляОбработокОбъектов.СоздатьЭлемент();
оСпр.УстановитьСсылкуНового(Обработчик);
оСпр.Наименование = НСтр("ru = 'Зарегистрировать событие перезапуска процесса'");
оСпр.Выражение =
"БизнесСобытияВызовСервера.ЗарегистрироватьСобытие(
| Параметры.ОбработкаОбъект.Владелец,
| DIS_ОбщиеФункции.НайтиСоздатьБизнесСобытие_ПроцессыТребуетсяПерезапуск())";
оСпр.Записать();
КонецЕсли;
Возврат Обработчик;
КонецФункции
2. В справочнике ВидыБизнесСобытий добавляем элемент "Процессы: требуется перезапуск", никаких специальных настроек не требуется.
3. В справочнике ПользовательскиеОбработчикиБизнесСобытий добавляем элемент "Перезапуск процесса" с кодом
ОбработкаОбъекта = Справочники.ОбработкиОбъектов.ОбработкаОбъекта(Событие.Источник);
Если ЗначениеЗаполнено(ОбработкаОбъекта) Тогда
ОбработкиОбъектов.ПрерватьОбработку(ОбработкаОбъекта, "");
КонецЕсли;
ПравилаОбработкиСервер.ЗаполнитьДействияПрограммно(
Событие.Источник,
Сотрудники.ОсновнойСотрудникПользователя(
?(ЗначениеЗаполнено(Событие.Источник.Ответственный),
Событие.Источник.Ответственный,
"ТекущийПользователь")));
ОбработкиОбъектовВызовСервера.НачатьОбработку(Событие.Источник);
4. В регистре СвязьПользовательскихОбработчиковБизнесСобытийИВидаСобытий создаем связь созданных ранее элементов
5. Для создания элемента в справочнике СкриптыСхемДляОбработокОбъектов элемента нужно выполнить ранее созданную функцию
DIS_ОбщиеФункции.НайтиСоздатьСкрипт_ЗарегистрироватьСобытиеПерезапуска();
Теперь в схему комплексного процесса можно добавить обработку со скриптом "Зарегистрировать событие перезапуска процесса" и обязательным завершением процесса.
После попадания на эту обработку БП завершится и произойдет запись в очередь бизнес событий, потом произойдут штатные обработчики и уже после выполнится наш код помещения в историю создания новой обработки и запуск ее.
Гарантированно работает на Документооборот КОРП, редакция 3.0 (3.0.16.33).