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

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

Всем привет!

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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


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

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

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

Вакансии

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

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

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

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

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