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

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

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

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

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

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


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

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

Помогите советом, пожалуйста.
Прикрепленные файлы:
Ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
3. Isa816 63 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 63 14.06.19 13:30 Сейчас в теме
(4) Опять не верно, я показывал на схеме как должно быть, после обработчика добавьте на схему нужный вам процесс.
ДействиеРассмотрения = ПараметрыДействийСхемы.Найти("Действие1", "Имя");
Вот тут вроде только имя процесса указывается, посмотрите в примере который я скинул.
Стартовать его не нужно. тем более в цикле. В цикле можно адресатов добавить в табличную часть.
6. blandinko 14.06.19 14:36 Сейчас в теме
(5) А почему именно после обработчика блок процесса нужно добавлять?
Вот здесь:
ПараметрыДействийСхемы = Справочники.СхемыКомплексныхПроцессов.ПараметрыДействийСхемы(Процесс.Схема);
ДействиеСогласования = ПараметрыДействийСхемы.Найти("СогласованиеСРуководителем");

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

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

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

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

Кстати, вот это имя действия "СогласованиеСРуководителем" - у вас в имени блока согласования указано, как у меня на скрине?
7. Isa816 63 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_ДополнительныеТабличныеРеквизиты КАК ТабличныеРеквизиты
|ГДЕ
|    ТабличныеРеквизиты.Ссылка = &Ссылка
|    И ТабличныеРеквизиты.Свойство = &Свойство
|    И ТабличныеРеквизиты.ИмяТаблицы = &ИмяТаблицы";
Запрос.Параметры.Вставить("Ссылка", Документ);
Запрос.Параметры.Вставить("ИмяТаблицы", "Позиции");
Запрос.Параметры.Вставить("Свойство", ДопСвойство);

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

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

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

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

Ведущий разработчик 1С / Team lead отдела разработки 1С
Москва
зарплата от 300 000 руб. до 300 000 руб.
Полный день

Программист 1С
Москва
зарплата от 130 000 руб. до 150 000 руб.
Полный день

Бизнес-аналитик
Москва
зарплата от 130 000 руб. до 150 000 руб.
Полный день

Аналитик 1C
Москва
зарплата от 110 000 руб.
Полный день