1. Katty_K 12.06.19 09:27 Сейчас в теме

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

Всем привет!

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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


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


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

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

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

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

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

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

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

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

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


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

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

Буду рада, если знающие люди подскажут, насколько правильно я действую.
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Руководитель проекта, аналитик, консультант
Санкт-Петербург
По совместительству

Автор новостных обзоров на тему 1С и бухучета
Санкт-Петербург
По совместительству

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

Программист 1С
Москва
Полный день

Консультант-аналитик 1С
Москва
Полный день