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

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 Ответить
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

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

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

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)