Программное создание бизнес-процесса и задач в нем. Создание вложенного БП

1. blandinko 11.06.19 11:06 Сейчас в теме
Всем привет!

Необходимо программно запустить БП Рассмотрения в схеме комплексного процесса в 1С Документооборот.
В блоке "Обработка" в схеме процесса пишу:

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

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

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


Вот так все работает прекрасно, процесс запускается.

Но мне необходимо запустить внутри него еще несколько задач рассмотрения другому адресату, например, "ответственному" из карточки документа.
Пытаюсь создать а записать внутри создаваемого БП задачу:

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

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

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

	Задача = Задачи.ЗадачаИсполнителя.СоздатьЗадачу();
        Задача.БизнесПроцесс = НовыйПроцесс;
        Задача.Дата = ТекущаяДата();
        Задача.Исполнитель = Документ.Ответственный;
        Задача.Наименование = "123";
        Задача.Автор = Процесс.Автор;
        Задача.Записать();
 
   	НовыйПроцесс.Старт();
    
КонецЕсли;
Показать


При старте выскакивает ошибка:
Во время старта этого процесса произошла ошибка:
{ОбщийМодуль.СтартПроцессовСервер.Модуль(179)}: Ошибка при вызове метода контекста (Старт)
БизнесПроцесс.Старт();
по причине:
Ошибка при выполнении обработчика - 'ВыполнитьПроцессБезДействийОбработка'
по причине:
{(26)}: Ошибка при вызове метода контекста (Записать)
Задача.Записать();
по причине:
Ошибка при выполнении обработчика - 'ПриЗаписи'
по причине:
{ОбщийМодуль.ОбщегоНазначения.Модуль(86)}: Значение не является значением объектного типа (Метаданные)
Запрос.Текст =
Попробуйте стартовать процесс еще раз.
Показать


Помогите, пожалуйста, разобраться, что я делаю не так.

И еще вопрос, можно ли как-то создаваемый БП Рассмотрения (НовыйПроцесс) запустить внутри главного комплексного БП?
Сейчас он создается параллельно, рядом с ним.

Пы.Сы Просьба тапками сильно не кидаться :)
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Isa816 64 11.06.19 11:24 Сейчас в теме
Добрый день, в документообороте есть классная штука отладки, только она работает на условиях, а не на обработке. Перенесите ваш код отдельное (Произвольное условие) и выберите существующий процесс, в условии отлично работает оператор Сообщить(); Обычно через него всё отлаживаю.
Что бы запустить процесс рассмотрение внутри комплексного процесса, создайте его после вашего обработчик и обращайтесь к нему напрямую в процессе вот так примерно (картинку прикрепил)
Прикрепленные файлы:
blandinko; +1 Ответить
6. blandinko 11.06.19 11:52 Сейчас в теме
(2) добрый день, Вы имеете в виду условия исполнения задач?

не очень поняла про создание БП рассмотрения после обработчика и обращение к нему напрямую, так он же еще не будет ни создан, ни запущен в момент выполнения кода обработки, как к нему обратиться?
8. blandinko 11.06.19 13:07 Сейчас в теме
(6) первый вопрос снимается, вы про условия маршрутизации говорите, я поняла))
9. blandinko 11.06.19 13:41 Сейчас в теме
(2) Спасибо Вам большое, получилось создать дополнительную задачу внутри нужного бизнес-процесса, вся проблема оказалась в том, что присваивать реквизиту НоваяЗадача.БизнесПроцесс нужно было ССЫЛКУ на созданный НовыйПроцесс )))

Удалось отладить с помощью Вашего способа, действительно удобно, так что спасибо еще раз )

Получилось так (здесь шаблон процесса не использую, но это не суть):

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

НовыйПроцесс = БизнесПроцессы.Рассмотрение.СоздатьБизнесПроцесс();
НовыйПроцесс.Автор = Процесс.Автор;
НовыйПроцесс.Дата = ТекущаяДатаСеанса();
НовыйПроцесс.Исполнитель = Документ.Адресат;
Мультипредметность.ПередатьПредметыПроцессу(НовыйПроцесс, Документ, Ложь, Истина);
МультипредметностьКлиентСервер.ЗаполнитьНаименованиеПроцесса(НовыйПроцесс, НСтр("ru = 'Рассмотреть'"));
   	
НовыйПроцесс.Записать();
НовыйПроцесс.Старт();
   		
НоваяЗадача = Задачи.ЗадачаИсполнителя.СоздатьЗадачу();
НоваяЗадача.БизнесПроцесс = НовыйПроцесс.Ссылка;
НоваяЗадача.Дата = ТекущаяДатаСеанса();
НоваяЗадача.Исполнитель = Документ.Ответственный;
НоваяЗадача.Наименование = "123";
НоваяЗадача.Автор = Процесс.Автор;
НоваяЗадача.Записать();
Показать


Задача создается, только при попытке открыть задачу появляется ошибка :(
Несоответствие типов (параметр номер '1')


Возможно, в коде не хватает заполнения какого-то реквизита в задаче?
3. aka Любитель XML 11.06.19 11:38 Сейчас в теме
Может дело в том, что сначала надо запустить БП, а потом задачу к нему создавать?
blandinko; +1 Ответить
4. blandinko 11.06.19 11:46 Сейчас в теме
(3)

        Задача = Задачи.ЗадачаИсполнителя.СоздатьЗадачу();
        Задача.БизнесПроцесс = НовыйПроцесс;
        Задача.Дата = ТекущаяДата();
        Задача.Исполнитель = Документ.Ответственный;
        Задача.Наименование = "123";
        Задача.Автор = Процесс.Автор;
        Задача.Записать();

       НовыйПроцесс.Записать();
       НовыйПроцесс.Старт();
Показать


Это был самый первый испробованный вариант, выдает ту же самую ошибку, что в тексте поста...
5. aka Любитель XML 11.06.19 11:48 Сейчас в теме
(4) что-то вы опять не то пишите, пробуйте так:
НовыйПроцесс = БизнесПроцессы.Рассмотрение.СоздатьБизнесПроцесс();
НовыйПроцесс.Заполнить(Новый Структура("Предметы, Шаблон", Документ, ШаблонПроцесса));
НовыйПроцесс.Автор = Процесс.Автор;

НовыйПроцесс.Записать();
НовыйПроцесс.Старт();

Задача = Задачи.ЗадачаИсполнителя.СоздатьЗадачу();
Задача.БизнесПроцесс = НовыйПроцесс;
Задача.Дата = ТекущаяДата();
Задача.Исполнитель = Документ.Ответственный;
Задача.Наименование = "123";
Задача.Автор = Процесс.Автор;
Задача.Записать();
7. blandinko 11.06.19 11:55 Сейчас в теме
(5) я так и пишу, просто решила первые сроки с определением БП опустить, ибо они те же)
Вот полностью:

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

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


Ошибка та же самая...
10. Isa816 64 11.06.19 15:20 Сейчас в теме
(7) Ну сделайте уже проще, если не выходит это сделать в процессе. Создайте обработку и посмотрите там какие ошибки. Скорее всего что то не заполняете.
11. blandinko 11.06.19 15:32 Сейчас в теме
(10) все получилось, проблема была в ТочкеМаршрута.

Пока все выглядит так:


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

ШаблонПроцесса = Справочники.ШаблоныРассмотрения.НайтиПоНаименованию("Рассмотрение всеми адресатами"); 
Если ШаблонПроцесса <> Неопределено Тогда
   	НовыйПроцесс = БизнесПроцессы.Рассмотрение.СоздатьБизнесПроцесс();
 	НовыйПроцесс.Заполнить(Новый Структура("Предметы, Шаблон", Документ, ШаблонПроцесса));
   	НовыйПроцесс.Автор = Процесс.Автор;
   	
   	НовыйПроцесс.Записать();
	НовыйПроцесс.Старт();
	          
	ДопАдресаты = АвтоподстановкиПереопределяемый.ПолучитьДопАдресатовДокумента(Документ);
	Если ДопАдресаты.Количество() > 0 Тогда
	
		Для Каждого ДопАдресат Из ДопАдресаты Цикл
   		
			НоваяЗадача = Задачи.ЗадачаИсполнителя.СоздатьЗадачу();
		    НоваяЗадача.БизнесПроцесс = НовыйПроцесс.Ссылка;
		    НоваяЗадача.Дата = ТекущаяДатаСеанса();
		    НоваяЗадача.Исполнитель = ДопАдресат;
		    НоваяЗадача.Наименование = НовыйПроцесс.Наименование;
		    НоваяЗадача.Автор = Процесс.Автор; 		    
		    НоваяЗадача.ТочкаМаршрута = НовыйПроцесс.ПредметыЗадач[0].ТочкаМаршрута;
		    
		    СтрокаПредмет = НоваяЗадача.Предметы.Добавить();
		    СтрокаПредмет.РольПредмета = Процесс.Предметы[0].РольПредмета;
		    СтрокаПредмет.ИмяПредмета = Процесс.Предметы[0].ИмяПредмета;
		    СтрокаПредмет.Предмет = Процесс.Предметы[0].Предмет;
		    
		    НоваяЗадача.Записать();
		    
		    // предоставление доп адресатам прав на процесс рассмотрения
		    Набор = РегистрыСведений.УчастникиПроцессов.СоздатьНаборЗаписей();
			Набор.Отбор.Процесс.Установить(НовыйПроцесс.Ссылка);
			Набор.Отбор.Участник.Установить(ДопАдресат);
			
			Набор.Прочитать();
			Если Набор.Количество() = 0 Тогда
				
				ТаблицаИсточник = Новый ТаблицаЗначений;
				ТаблицаИсточник.Колонки.Добавить("Участник");
				НоваяСтрокаТИ = ТаблицаИсточник.Добавить();
				НоваяСтрокаТИ.Участник = ДопАдресат;
				
				РегистрыСведений.УчастникиПроцессов.ЗаписатьНаборПоПроцессу(НовыйПроцесс.Ссылка, ТаблицаИсточник, Ложь);
				
			КонецЕсли;
		
		КонецЦикла;

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


Все работает! Спасибо за помощь.

Единственное, что осталось - это все-таки запихнуть как-то создаваемый новый процесс в главный...
вот с этим пока глухо)))
kabantus; +1 Ответить
12. djd 12.10.21 08:46 Сейчас в теме
(11) Путем ковыряния в типовой конфе понял, как запихнуть создаваемый процесс в главный. Нужно для каждого из подпроцессов создавать ведущую задачу. Вот как выглядит код обработки в схеме нашего комплексного процесса по обработке заявки на приобретение ТМЦ, когда ответственных несколько:
Документ = Процесс.Предметы[0].Предмет;
ДопСвойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "Ответственный");
ПараметрыДействийСхемы = Справочники.СхемыКомплексныхПроцессов.ПараметрыДействийСхемы(Процесс.Схема);
ДействиеСхемыЗакупить = ПараметрыДействийСхемы.Найти("ЗакупкаПоЗаявке");
ШаблонДействияЗакупить = ДействиеСхемыЗакупить.ШаблонПроцесса.ПолучитьОбъект();

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

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

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

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

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

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