1. Katty_K 11.06.19 11:06 Сейчас в теме

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

Всем привет!

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

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

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

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


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

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

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

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

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

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


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


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

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

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

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

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

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

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

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


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


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

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

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


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

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

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

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

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


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

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


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

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

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


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

Единственное, что осталось - это все-таки запихнуть как-то создаваемый новый процесс в главный...
вот с этим пока глухо)))
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Программист 1С
Бобров
зарплата от 100 000 руб. до 150 000 руб.
Временный (на проект)

Студент (стажер) 1С
Нижний Новгород
зарплата от 25 000 руб.
Полный день

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

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

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