Программное создание ВЛОЖЕННОГО бизнес-процесса в 1С Документооборот
Всем привет!
Необходимо программно создать вложенный бизнес-процесс в комплексный БП, заданный схемой.
Для этого использую блок "Обработка", в котором пишу код запуска необходимого процесса (Обработка.png):
Код рабочий (без закомментированной строки), но процесс запускается отдельно (параллельно) с главным БП (Параллельные процессы.png).
Если посмотреть в Процессы, например, которые запускаются (не программно) подобным образом, то у них заполнен реквизит "Ведущая задача" (Ведущая задача.png) и они создаются вложенными в главный БП (Вложенные процессы.png)
Так что, ВОЗМОЖНО, необходимо определить ВедущуюЗадачу создаваемого процесса, но проблема в том, что у главного БП она создается, видимо, как-то неявно, и непонятно, как ее получить.
Помогите советом, пожалуйста.
Необходимо программно создать вложенный бизнес-процесс в комплексный БП, заданный схемой.
Для этого использую блок "Обработка", в котором пишу код запуска необходимого процесса (Обработка.png):
Документ = Процесс.Предметы[0].Предмет;
ШаблонПроцесса = Справочники.ШаблоныРассмотрения.НайтиПоНаименованию("Рассмотрение всеми адресатами");
Если ШаблонПроцесса <> Неопределено Тогда
НовыйПроцесс = БизнесПроцессы.Рассмотрение.СоздатьБизнесПроцесс();
НовыйПроцесс.Заполнить(Новый Структура("Предметы, Шаблон", Документ, ШаблонПроцесса));
НовыйПроцесс.Автор = Процесс.Автор;
// НовыйПроцесс.ВедущаяЗадача = ??? - Необходимо определить, что запускаемый процесс должен являться ВЛОЖЕННЫМ в главный БП
НовыйПроцесс.Записать();
НовыйПроцесс.Старт();
КонецЕсли;
ПоказатьКод рабочий (без закомментированной строки), но процесс запускается отдельно (параллельно) с главным БП (Параллельные процессы.png).
Если посмотреть в Процессы, например, которые запускаются (не программно) подобным образом, то у них заполнен реквизит "Ведущая задача" (Ведущая задача.png) и они создаются вложенными в главный БП (Вложенные процессы.png)
Так что, ВОЗМОЖНО, необходимо определить ВедущуюЗадачу создаваемого процесса, но проблема в том, что у главного БП она создается, видимо, как-то неявно, и непонятно, как ее получить.
Помогите советом, пожалуйста.
Прикрепленные файлы:
По теме из базы знаний
- Бесшовная интеграция 1С:Документооборот + 1С:Бухгалтерия 3.0 ПРОФ. Модуль интеграции 1С:БП и 1С:ДО (ПРОФ или КОРП)
- Многопоточный CI-контур для 1С c Packer, Vagrant и Jenkins. Часть 1. Описание системы и обзор инструментария
- История создания успешной системы чат-ботов на 1С
- Как успешно вести маркировку обуви в «1С: Управление торговлей 11.4» со «Складом 15»
- 1С:Корпорация
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Можно сделать намного проще.
После блока обработки добавьте нужный вам процесс, а в обработке работайте с ним уже. Там как раз можно поменять все реквизиты. Вот пример кода из обработки. На прикрепленном рисунке как это выглядит.
После блока обработки добавьте нужный вам процесс, а в обработке работайте с ним уже. Там как раз можно поменять все реквизиты. Вот пример кода из обработки. На прикрепленном рисунке как это выглядит.
Для Каждого Стр из Процесс.ДополнительныеРеквизиты Цикл
Если Найти(Стр.Свойство.Наименование,"Подразделение пользователя") > 0 Тогда
Если ЗначениеЗаполнено(Стр.Значение) Тогда
Руководитель = Стр.Значение.Руководитель;
КонецЕсли;
КонецЕсли;
КонецЦикла;
ПараметрыДействийСхемы = Справочники.СхемыКомплексныхПроцессов.ПараметрыДействийСхемы(Процесс.Схема);
ДействиеСогласования = ПараметрыДействийСхемы.Найти("СогласованиеСРуководителем");
ОбъектСогласования = ДействиеСогласования.ШаблонПроцесса.ПолучитьОбъект();
ОбъектСогласования.Исполнители[0].Исполнитель = Руководитель;
ОбъектСогласования.Записать();
ПоказатьПрикрепленные файлы:
(3) Пытаюсь сделать по Вашей схеме.
Нужно запустить процесс рассмотрения для основного адресата, а также доп адресатов.
Создан блок с процессом рассмотрения, у него имя "Действие1".
Создан блок обработки, в котором должен запускаться процесс из блока "Действие1":
Пыталась отладить в Условии, ругается:
Полноценный запуск компл. процесса "тест схема" выводит ошибку:
Нужно запустить процесс рассмотрения для основного адресата, а также доп адресатов.
Создан блок с процессом рассмотрения, у него имя "Действие1".
Создан блок обработки, в котором должен запускаться процесс из блока "Действие1":
Документ = Процесс.Предметы[0].Предмет;
ДопАдресаты = АвтоподстановкиПереопределяемый.ПолучитьДопАдресатовДокумента(Документ);
Если ДопАдресаты.Количество() > 0 Тогда
ПараметрыДействийСхемы = Справочники.СхемыКомплексныхПроцессов.ПараметрыДействийСхемы(Процесс.Схема);
ДействиеРассмотрения = ПараметрыДействийСхемы.Найти("Действие1", "Имя");
ОбъектРассмотрения = ДействиеРассмотрения.ШаблонПроцесса.ПолучитьОбъект();
Для Каждого ДопАдресат из ДопАдресаты Цикл
ОбъектРассмотрения.Исполнитель = ДопАдресат;
ОбъектРассмотрения.Записать();
ДействиеРассмотрения.Процесс.Старт();
КонецЦикла;
КонецЕсли;
ПоказатьПыталась отладить в Условии, ругается:
Ошибка.
Значение не является значением объектного типа (ШаблонПроцесса)
Значение не является значением объектного типа (ШаблонПроцесса)
Полноценный запуск компл. процесса "тест схема" выводит ошибку:
Во время старта этого процесса произошла ошибка:
{ОбщийМодуль.СтартПроцессовСервер.Модуль(179)}: Ошибка при вызове метода контекста (Старт)
БизнесПроцесс.Старт();
по причине:
Ошибка при выполнении обработчика - 'ВложенныйПроцессПередСозданиемВложенныхБизнесПроцессов'
по причине:
{(16)}: Значение не является значением объектного типа (Старт)
ДействиеРассмотрения.Процесс.Старт();
Попробуйте стартовать процесс еще раз.
{ОбщийМодуль.СтартПроцессовСервер.Модуль(179)}: Ошибка при вызове метода контекста (Старт)
БизнесПроцесс.Старт();
по причине:
Ошибка при выполнении обработчика - 'ВложенныйПроцессПередСозданиемВложенныхБизнесПроцессов'
по причине:
{(16)}: Значение не является значением объектного типа (Старт)
ДействиеРассмотрения.Процесс.Старт();
Попробуйте стартовать процесс еще раз.
Прикрепленные файлы:
(4) Опять не верно, я показывал на схеме как должно быть, после обработчика добавьте на схему нужный вам процесс.
ДействиеРассмотрения = ПараметрыДействийСхемы.Найти("Действие1", "Имя");
Вот тут вроде только имя процесса указывается, посмотрите в примере который я скинул.
Стартовать его не нужно. тем более в цикле. В цикле можно адресатов добавить в табличную часть.
ДействиеРассмотрения = ПараметрыДействийСхемы.Найти("Действие1", "Имя");
Вот тут вроде только имя процесса указывается, посмотрите в примере который я скинул.
Стартовать его не нужно. тем более в цикле. В цикле можно адресатов добавить в табличную часть.
(5) А почему именно после обработчика блок процесса нужно добавлять?
Вот здесь:
действие же ищется в действиях схемы ВСЕГО ПРОЦЕССА.
В методе "Найти" можно указать имя столбца, где искать, как у меня, но в первоначальном варианте пробовала без указания столбца искать, все равно та же ошибка.
В процессе рассмотрения нет табличной части исполнителей, в этом, собственно, и вся проблема.
Там есть только реквизит "Исполнитель", так как типовая конфа предполагает, что рассматривать должен только один пользователь за раз почему-то.
Поэтому у меня параллельно стартует основной блок рассмотрения для основного адресата, а в обработчике - с помощью цикла процессы рассмотрения по тому же основному блоку для доп. адресатов.
Кстати, вот это имя действия "СогласованиеСРуководителем" - у вас в имени блока согласования указано, как у меня на скрине?
Вот здесь:
ПараметрыДействийСхемы = Справочники.СхемыКомплексныхПроцессов.ПараметрыДействийСхемы(Процесс.Схема);
ДействиеСогласования = ПараметрыДействийСхемы.Найти("СогласованиеСРуководителем");
действие же ищется в действиях схемы ВСЕГО ПРОЦЕССА.
В методе "Найти" можно указать имя столбца, где искать, как у меня, но в первоначальном варианте пробовала без указания столбца искать, все равно та же ошибка.
В процессе рассмотрения нет табличной части исполнителей, в этом, собственно, и вся проблема.
Там есть только реквизит "Исполнитель", так как типовая конфа предполагает, что рассматривать должен только один пользователь за раз почему-то.
Поэтому у меня параллельно стартует основной блок рассмотрения для основного адресата, а в обработчике - с помощью цикла процессы рассмотрения по тому же основному блоку для доп. адресатов.
Кстати, вот это имя действия "СогласованиеСРуководителем" - у вас в имени блока согласования указано, как у меня на скрине?
(6) по тому что после обработчика должно запускаться какой то событие, а у вас его нет. Добавьте его и попробуй стартовать. Кстати на форме бизнес процесса можно отлаживать реквизиты.
Для этого добавьте (блок схему условие) внутри её укажите произвольное условие и туда перенесите код из вашего обработчика и выберите запущенный бизнес процесс, там через Сообщить() можно ловить значения реквизитов.
Для этого добавьте (блок схему условие) внутри её укажите произвольное условие и туда перенесите код из вашего обработчика и выберите запущенный бизнес процесс, там через Сообщить() можно ловить значения реквизитов.
Определила ведущую задачу простым запросом:
Реквизит ВедущаяЗадача у создаваемого процесса заполняется. Если остановить или прервать главный процесс, создаваемый внутри него тоже останавливается или прерывается.
НО в "Процессах и задачах" документа, по которому запускается процесс, создаваемый процесс все равно не вложен в главный, а висит параллельно.
Что-то все-таки неправильно, возможно, нужно копать в сторону механизма отображения этих процессов, чтобы понять, по какому принципу он строит дерево процессов.
Буду рада, если знающие люди подскажут, насколько правильно я действую.
Запрос = Новый Запрос();
Запрос.Текст = "ВЫБРАТЬ
| ЗадачаИсполнителя.Ссылка
|ИЗ
| Задача.ЗадачаИсполнителя КАК ЗадачаИсполнителя
|ГДЕ
| ЗадачаИсполнителя.БизнесПроцесс.Ссылка = &Процесс";
Запрос.УстановитьПараметр("Процесс", Процесс);
РезультатВыборки = Запрос.Выполнить().Выбрать();
Если РезультатВыборки.Следующий() Тогда
НовыйПроцесс.ВедущаяЗадача = РезультатВыборки.Ссылка;
КонецЕсли;
ПоказатьРеквизит ВедущаяЗадача у создаваемого процесса заполняется. Если остановить или прервать главный процесс, создаваемый внутри него тоже останавливается или прерывается.
НО в "Процессах и задачах" документа, по которому запускается процесс, создаваемый процесс все равно не вложен в главный, а висит параллельно.
Что-то все-таки неправильно, возможно, нужно копать в сторону механизма отображения этих процессов, чтобы понять, по какому принципу он строит дерево процессов.
Буду рада, если знающие люди подскажут, насколько правильно я действую.
(8) Путем ковыряния в типовой конфе понял, как запихнуть создаваемый процесс в главный. Нужно для каждого из подпроцессов создавать ведущую задачу. Вот как выглядит код обработки в схеме нашего комплексного процесса по обработке заявки на приобретение ТМЦ, когда ответственных несколько:
Документ = Процесс.Предметы[0].Предмет;
ДопСвойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "Ответственный");
ПараметрыДействийСхемы = Справочники.СхемыКомплексныхПроцессов.ПараметрыДействийСхемы(Процесс.Схема);
ДействиеСхемыЗакупить = ПараметрыДействийСхемы.Найти("ЗакупкаПоЗаявке");
ШаблонДействияЗакупить = ДействиеСхемыЗакупить.ШаблонПроцесса.ПолучитьОбъект();
//Получить исполнителей из списка позиций документа
Запрос = Новый Запрос();
Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
| ТабличныеРеквизиты.Значение КАК Ответственный
|ИЗ
| Справочник.ВнутренниеДокументы.ntzv_ДополнительныеТабличныеРеквизиты КАК ТабличныеРеквизиты
|ГДЕ
| ТабличныеРеквизиты.Ссылка = &Ссылка
| И ТабличныеРеквизиты.Свойство = &Свойство
| И ТабличныеРеквизиты.ИмяТаблицы = &ИмяТаблицы";
Запрос.Параметры.Вставить("Ссылка", Документ);
Запрос.Параметры.Вставить("ИмяТаблицы", "Позиции");
Запрос.Параметры.Вставить("Свойство", ДопСвойство);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
//Заполнить процесс для первого исполнителя
Если Выборка.Следующий() Тогда
Для каждого СтрокаИсполнителя из ШаблонДействияЗакупить.Исполнители Цикл
СтрокаИсполнителя.Исполнитель = Выборка.Ответственный;
КонецЦикла;
ШаблонДействияЗакупить.Записать();
КонецЕсли;
//Если исполнительей больше одного, создать параллельные процессы
Пока Выборка.Следующий() Цикл
ВедущаяЗадачаДействия = Задачи.ЗадачаИсполнителя.СоздатьЗадачу();
ВедущаяЗадачаДействия.Дата = ТекущаяДатаСеанса();
ВедущаяЗадачаДействия.БизнесПроцесс = Процесс.Ссылка;
ВедущаяЗадачаДействия.ТочкаМаршрута = БизнесПроцессы.КомплексныйПроцесс.ТочкиМаршрута.ВложенныйПроцесс;
ВедущаяЗадачаДействия.Записать();
НовыйПроцесс = БизнесПроцессы.Исполнение.СоздатьБизнесПроцесс();
НовыйПроцесс.Заполнить(Новый Структура("Предметы, Шаблон", Документ, ШаблонДействияЗакупить.Ссылка));
НовыйПроцесс.Автор = Процесс.Автор;
НовыйПроцесс.ВедущаяЗадача = ВедущаяЗадачаДействия.Ссылка;
Для каждого СтрокаИсполнителя из НовыйПроцесс.Исполнители Цикл
СтрокаИсполнителя.Исполнитель = Выборка.Ответственный;
КонецЦикла;
НовыйПроцесс.Записать();
НовыйПроцесс.Старт();
КонецЦикла
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот