Программное создание ВЛОЖЕННОГО бизнес-процесса в 1С Документооборот

1. blandinko 12.06.19 09:27 Сейчас в теме
Всем привет!

Необходимо программно создать вложенный бизнес-процесс в комплексный БП, заданный схемой.
Для этого использую блок "Обработка", в котором пишу код запуска необходимого процесса (Обработка.png):
Документ = Процесс.Предметы[0].Предмет;

ШаблонПроцесса = Справочники.ШаблоныРассмотрения.НайтиПоНаименованию("Рассмотрение всеми адресатами"); 
Если ШаблонПроцесса <> Неопределено Тогда

       НовыйПроцесс = БизнесПроцессы.Рассмотрение.СоздатьБизнесПроцесс();
       НовыйПроцесс.Заполнить(Новый Структура("Предметы, Шаблон", Документ, ШаблонПроцесса));
       НовыйПроцесс.Автор = Процесс.Автор;

       // НовыйПроцесс.ВедущаяЗадача = ??? - Необходимо определить, что запускаемый процесс должен являться ВЛОЖЕННЫМ в главный БП
       
      НовыйПроцесс.Записать();
       
    НовыйПроцесс.Старт();
    
КонецЕсли;
Показать


Код рабочий (без закомментированной строки), но процесс запускается отдельно (параллельно) с главным БП (Параллельные процессы.png).

Если посмотреть в Процессы, например, которые запускаются (не программно) подобным образом, то у них заполнен реквизит "Ведущая задача" (Ведущая задача.png) и они создаются вложенными в главный БП (Вложенные процессы.png)
Так что, ВОЗМОЖНО, необходимо определить ВедущуюЗадачу создаваемого процесса, но проблема в том, что у главного БП она создается, видимо, как-то неявно, и непонятно, как ее получить.

Помогите советом, пожалуйста.
Прикрепленные файлы:
По теме из базы знаний
Ответы
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
3. Isa816 64 13.06.19 11:59 Сейчас в теме
(1) Можно сделать намного проще.
После блока обработки добавьте нужный вам процесс, а в обработке работайте с ним уже. Там как раз можно поменять все реквизиты. Вот пример кода из обработки. На прикрепленном рисунке как это выглядит.

Для Каждого Стр из Процесс.ДополнительныеРеквизиты Цикл
	Если Найти(Стр.Свойство.Наименование,"Подразделение пользователя") > 0 Тогда
	    Если ЗначениеЗаполнено(Стр.Значение) Тогда
			Руководитель = Стр.Значение.Руководитель;
		КонецЕсли;
    КонецЕсли;
КонецЦикла;

ПараметрыДействийСхемы = Справочники.СхемыКомплексныхПроцессов.ПараметрыДействийСхемы(Процесс.Схема);

ДействиеСогласования = ПараметрыДействийСхемы.Найти("СогласованиеСРуководителем");

ОбъектСогласования = ДействиеСогласования.ШаблонПроцесса.ПолучитьОбъект(); 
ОбъектСогласования.Исполнители[0].Исполнитель = Руководитель;
ОбъектСогласования.Записать(); 
Показать
Прикрепленные файлы:
user1150141; user1097013; blandinko; +3 Ответить
4. blandinko 14.06.19 13:02 Сейчас в теме
(3) Пытаюсь сделать по Вашей схеме.
Нужно запустить процесс рассмотрения для основного адресата, а также доп адресатов.

Создан блок с процессом рассмотрения, у него имя "Действие1".
Создан блок обработки, в котором должен запускаться процесс из блока "Действие1":

Документ = Процесс.Предметы[0].Предмет;

ДопАдресаты = АвтоподстановкиПереопределяемый.ПолучитьДопАдресатовДокумента(Документ);

Если ДопАдресаты.Количество() > 0 Тогда

	ПараметрыДействийСхемы = Справочники.СхемыКомплексныхПроцессов.ПараметрыДействийСхемы(Процесс.Схема);
	ДействиеРассмотрения = ПараметрыДействийСхемы.Найти("Действие1", "Имя");
	
	ОбъектРассмотрения = ДействиеРассмотрения.ШаблонПроцесса.ПолучитьОбъект();
	
	Для Каждого ДопАдресат из ДопАдресаты Цикл
		
		ОбъектРассмотрения.Исполнитель = ДопАдресат;
		ОбъектРассмотрения.Записать();
		ДействиеРассмотрения.Процесс.Старт();	
	КонецЦикла;

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


Пыталась отладить в Условии, ругается:
Ошибка.
Значение не является значением объектного типа (ШаблонПроцесса)


Полноценный запуск компл. процесса "тест схема" выводит ошибку:
Во время старта этого процесса произошла ошибка:
{ОбщийМодуль.СтартПроцессовСервер.Модуль(179)}: Ошибка при вызове метода контекста (Старт)
БизнесПроцесс.Старт();
по причине:
Ошибка при выполнении обработчика - 'ВложенныйПроцессПередСозданиемВложенныхБизнесПроцессов'
по причине:
{(16)}: Значение не является значением объектного типа (Старт)
ДействиеРассмотрения.Процесс.Старт();
Попробуйте стартовать процесс еще раз.
Прикрепленные файлы:
5. Isa816 64 14.06.19 13:30 Сейчас в теме
(4) Опять не верно, я показывал на схеме как должно быть, после обработчика добавьте на схему нужный вам процесс.
ДействиеРассмотрения = ПараметрыДействийСхемы.Найти("Действие1", "Имя");
Вот тут вроде только имя процесса указывается, посмотрите в примере который я скинул.
Стартовать его не нужно. тем более в цикле. В цикле можно адресатов добавить в табличную часть.
6. blandinko 14.06.19 14:36 Сейчас в теме
(5) А почему именно после обработчика блок процесса нужно добавлять?
Вот здесь:
ПараметрыДействийСхемы = Справочники.СхемыКомплексныхПроцессов.ПараметрыДействийСхемы(Процесс.Схема);
ДействиеСогласования = ПараметрыДействийСхемы.Найти("СогласованиеСРуководителем");

действие же ищется в действиях схемы ВСЕГО ПРОЦЕССА.

В методе "Найти" можно указать имя столбца, где искать, как у меня, но в первоначальном варианте пробовала без указания столбца искать, все равно та же ошибка.

В процессе рассмотрения нет табличной части исполнителей, в этом, собственно, и вся проблема.
Там есть только реквизит "Исполнитель", так как типовая конфа предполагает, что рассматривать должен только один пользователь за раз почему-то.

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

Кстати, вот это имя действия "СогласованиеСРуководителем" - у вас в имени блока согласования указано, как у меня на скрине?
7. Isa816 64 14.06.19 14:56 Сейчас в теме
(6) по тому что после обработчика должно запускаться какой то событие, а у вас его нет. Добавьте его и попробуй стартовать. Кстати на форме бизнес процесса можно отлаживать реквизиты.
Для этого добавьте (блок схему условие) внутри её укажите произвольное условие и туда перенесите код из вашего обработчика и выберите запущенный бизнес процесс, там через Сообщить() можно ловить значения реквизитов.
blandinko; +1 Ответить
2. blandinko 12.06.19 15:39 Сейчас в теме
Определила ведущую задачу простым запросом:
	Запрос = Новый Запрос();
	Запрос.Текст = "ВЫБРАТЬ
	|  ЗадачаИсполнителя.Ссылка
	|ИЗ 
	|  Задача.ЗадачаИсполнителя КАК ЗадачаИсполнителя
	|ГДЕ
	|  ЗадачаИсполнителя.БизнесПроцесс.Ссылка = &Процесс"; 

	Запрос.УстановитьПараметр("Процесс", Процесс);

	РезультатВыборки = Запрос.Выполнить().Выбрать();

	Если РезультатВыборки.Следующий() Тогда
		НовыйПроцесс.ВедущаяЗадача = РезультатВыборки.Ссылка;
	КонецЕсли;
Показать


Реквизит ВедущаяЗадача у создаваемого процесса заполняется. Если остановить или прервать главный процесс, создаваемый внутри него тоже останавливается или прерывается.
НО в "Процессах и задачах" документа, по которому запускается процесс, создаваемый процесс все равно не вложен в главный, а висит параллельно.

Что-то все-таки неправильно, возможно, нужно копать в сторону механизма отображения этих процессов, чтобы понять, по какому принципу он строит дерево процессов.

Буду рада, если знающие люди подскажут, насколько правильно я действую.
8. AlexKalina 22.09.20 11:53 Сейчас в теме
Привет! Я конечно понимаю что прошло больше года, но удалось как то решить задачу ?
9. djd 12.10.21 08:49 Сейчас в теме
(8) Путем ковыряния в типовой конфе понял, как запихнуть создаваемый процесс в главный. Нужно для каждого из подпроцессов создавать ведущую задачу. Вот как выглядит код обработки в схеме нашего комплексного процесса по обработке заявки на приобретение ТМЦ, когда ответственных несколько:
Документ = Процесс.Предметы[0].Предмет;
ДопСвойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "Ответственный");
ПараметрыДействийСхемы = Справочники.СхемыКомплексныхПроцессов.ПараметрыДействийСхемы(Процесс.Схема);
ДействиеСхемыЗакупить = ПараметрыДействийСхемы.Найти("ЗакупкаПоЗаявке");
ШаблонДействияЗакупить = ДействиеСхемыЗакупить.ШаблонПроцесса.ПолучитьОбъект();

//Получить исполнителей из списка позиций документа
Запрос = Новый Запрос();
Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
|    ТабличныеРеквизиты.Значение КАК Ответственный
|ИЗ
|    Справочник.ВнутренниеДокументы.ntzv_ДополнительныеТабличныеРеквизиты КАК ТабличныеРеквизиты
|ГДЕ
|    ТабличныеРеквизиты.Ссылка = &Ссылка
|    И ТабличныеРеквизиты.Свойство = &Свойство
|    И ТабличныеРеквизиты.ИмяТаблицы = &ИмяТаблицы";
Запрос.Параметры.Вставить("Ссылка", Документ);
Запрос.Параметры.Вставить("ИмяТаблицы", "Позиции");
Запрос.Параметры.Вставить("Свойство", ДопСвойство);

Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();

//Заполнить процесс для первого исполнителя
Если Выборка.Следующий() Тогда
    Для каждого СтрокаИсполнителя из ШаблонДействияЗакупить.Исполнители Цикл
        СтрокаИсполнителя.Исполнитель = Выборка.Ответственный;
    КонецЦикла;
    ШаблонДействияЗакупить.Записать();
КонецЕсли;

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

    НовыйПроцесс = БизнесПроцессы.Исполнение.СоздатьБизнесПроцесс();
    НовыйПроцесс.Заполнить(Новый Структура("Предметы, Шаблон", Документ, ШаблонДействияЗакупить.Ссылка));
    НовыйПроцесс.Автор = Процесс.Автор;
    НовыйПроцесс.ВедущаяЗадача = ВедущаяЗадачаДействия.Ссылка;
    Для каждого СтрокаИсполнителя из НовыйПроцесс.Исполнители Цикл
        СтрокаИсполнителя.Исполнитель = Выборка.Ответственный;
    КонецЦикла;
    НовыйПроцесс.Записать();
    НовыйПроцесс.Старт();
КонецЦикла
Показать
user592655_alexbravo123; Ларисочка; user591389_aska_rabota; +3 Ответить
10. user591389_aska_rabota 18.03.23 19:55 Сейчас в теме
(9)
Спасибо тебе ОГРОМЕННОЕ!!!
Сколько я мучался с этим, были мысли что надо определить ведущую задачу,
а как это делается я не знал
Оставьте свое сообщение

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