Программное создание бизнес-процесса и задач в нем. Создание вложенного БП
Всем привет!
Необходимо программно запустить БП Рассмотрения в схеме комплексного процесса в 1С Документооборот.
В блоке "Обработка" в схеме процесса пишу:
Вот так все работает прекрасно, процесс запускается.
Но мне необходимо запустить внутри него еще несколько задач рассмотрения другому адресату, например, "ответственному" из карточки документа.
Пытаюсь создать а записать внутри создаваемого БП задачу:
При старте выскакивает ошибка:
Помогите, пожалуйста, разобраться, что я делаю не так.
И еще вопрос, можно ли как-то создаваемый БП Рассмотрения (НовыйПроцесс) запустить внутри главного комплексного БП?
Сейчас он создается параллельно, рядом с ним.
Пы.Сы Просьба тапками сильно не кидаться :)
Необходимо программно запустить БП Рассмотрения в схеме комплексного процесса в 1С Документооборот.
В блоке "Обработка" в схеме процесса пишу:
Документ = Процесс.Предметы[0].Предмет;
ШаблонПроцесса = Справочники.ШаблоныРассмотрения.НайтиПоНаименованию("Рассмотрение всеми адресатами");
Если ШаблонПроцесса <> Неопределено Тогда
НовыйПроцесс = БизнесПроцессы.Рассмотрение.СоздатьБизнесПроцесс();
НовыйПроцесс.Заполнить(Новый Структура("Предметы, Шаблон", Документ, ШаблонПроцесса));
НовыйПроцесс.Автор = Процесс.Автор;
НовыйПроцесс.Записать();
НовыйПроцесс.Старт();
КонецЕсли;
ПоказатьВот так все работает прекрасно, процесс запускается.
Но мне необходимо запустить внутри него еще несколько задач рассмотрения другому адресату, например, "ответственному" из карточки документа.
Пытаюсь создать а записать внутри создаваемого БП задачу:
Документ = Процесс.Предметы[0].Предмет;
ШаблонПроцесса = Справочники.ШаблоныРассмотрения.НайтиПоНаименованию("Рассмотрение всеми адресатами");
Если ШаблонПроцесса <> Неопределено Тогда
НовыйПроцесс = БизнесПроцессы.Рассмотрение.СоздатьБизнесПроцесс();
НовыйПроцесс.Заполнить(Новый Структура("Предметы, Шаблон", Документ, ШаблонПроцесса));
НовыйПроцесс.Автор = Процесс.Автор;
НовыйПроцесс.Записать();
Задача = Задачи.ЗадачаИсполнителя.СоздатьЗадачу();
Задача.БизнесПроцесс = НовыйПроцесс;
Задача.Дата = ТекущаяДата();
Задача.Исполнитель = Документ.Ответственный;
Задача.Наименование = "123";
Задача.Автор = Процесс.Автор;
Задача.Записать();
НовыйПроцесс.Старт();
КонецЕсли;
ПоказатьПри старте выскакивает ошибка:
Во время старта этого процесса произошла ошибка:
{ОбщийМодуль.СтартПроцессовСервер.Модуль(179)}: Ошибка при вызове метода контекста (Старт)
БизнесПроцесс.Старт();
по причине:
Ошибка при выполнении обработчика - 'ВыполнитьПроцессБезДействийОбработка'
по причине:
{(26)}: Ошибка при вызове метода контекста (Записать)
Задача.Записать();
по причине:
Ошибка при выполнении обработчика - 'ПриЗаписи'
по причине:
{ОбщийМодуль.ОбщегоНазначения.Модуль(86)}: Значение не является значением объектного типа (Метаданные)
Запрос.Текст =
Попробуйте стартовать процесс еще раз.
Показать{ОбщийМодуль.СтартПроцессовСервер.Модуль(179)}: Ошибка при вызове метода контекста (Старт)
БизнесПроцесс.Старт();
по причине:
Ошибка при выполнении обработчика - 'ВыполнитьПроцессБезДействийОбработка'
по причине:
{(26)}: Ошибка при вызове метода контекста (Записать)
Задача.Записать();
по причине:
Ошибка при выполнении обработчика - 'ПриЗаписи'
по причине:
{ОбщийМодуль.ОбщегоНазначения.Модуль(86)}: Значение не является значением объектного типа (Метаданные)
Запрос.Текст =
Попробуйте стартовать процесс еще раз.
Помогите, пожалуйста, разобраться, что я делаю не так.
И еще вопрос, можно ли как-то создаваемый БП Рассмотрения (НовыйПроцесс) запустить внутри главного комплексного БП?
Сейчас он создается параллельно, рядом с ним.
Пы.Сы Просьба тапками сильно не кидаться :)
По теме из базы знаний
- Сравнение 1С8 и Navision
- Правила и приемы доработки типовых конфигураций 1С для облегчения их дальнейшей поддержки и обновления
- Конфигурация Flowcon: Набор инструментов для управления задачами, проектами и бизнесом в 1С
- Бесплатный сыр в мышеловке, или Как бизнес-аналитику прокачать себя самостоятельно
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Добрый день, в документообороте есть классная штука отладки, только она работает на условиях, а не на обработке. Перенесите ваш код отдельное (Произвольное условие) и выберите существующий процесс, в условии отлично работает оператор Сообщить(); Обычно через него всё отлаживаю.
Что бы запустить процесс рассмотрение внутри комплексного процесса, создайте его после вашего обработчик и обращайтесь к нему напрямую в процессе вот так примерно (картинку прикрепил)
Что бы запустить процесс рассмотрение внутри комплексного процесса, создайте его после вашего обработчик и обращайтесь к нему напрямую в процессе вот так примерно (картинку прикрепил)
Прикрепленные файлы:
(2) Спасибо Вам большое, получилось создать дополнительную задачу внутри нужного бизнес-процесса, вся проблема оказалась в том, что присваивать реквизиту НоваяЗадача.БизнесПроцесс нужно было ССЫЛКУ на созданный НовыйПроцесс )))
Удалось отладить с помощью Вашего способа, действительно удобно, так что спасибо еще раз )
Получилось так (здесь шаблон процесса не использую, но это не суть):
Задача создается, только при попытке открыть задачу появляется ошибка :(
Возможно, в коде не хватает заполнения какого-то реквизита в задаче?
Удалось отладить с помощью Вашего способа, действительно удобно, так что спасибо еще раз )
Получилось так (здесь шаблон процесса не использую, но это не суть):
Документ = Процесс.Предметы[0].Предмет;
НовыйПроцесс = БизнесПроцессы.Рассмотрение.СоздатьБизнесПроцесс();
НовыйПроцесс.Автор = Процесс.Автор;
НовыйПроцесс.Дата = ТекущаяДатаСеанса();
НовыйПроцесс.Исполнитель = Документ.Адресат;
Мультипредметность.ПередатьПредметыПроцессу(НовыйПроцесс, Документ, Ложь, Истина);
МультипредметностьКлиентСервер.ЗаполнитьНаименованиеПроцесса(НовыйПроцесс, НСтр("ru = 'Рассмотреть'"));
НовыйПроцесс.Записать();
НовыйПроцесс.Старт();
НоваяЗадача = Задачи.ЗадачаИсполнителя.СоздатьЗадачу();
НоваяЗадача.БизнесПроцесс = НовыйПроцесс.Ссылка;
НоваяЗадача.Дата = ТекущаяДатаСеанса();
НоваяЗадача.Исполнитель = Документ.Ответственный;
НоваяЗадача.Наименование = "123";
НоваяЗадача.Автор = Процесс.Автор;
НоваяЗадача.Записать();
ПоказатьЗадача создается, только при попытке открыть задачу появляется ошибка :(
Несоответствие типов (параметр номер '1')
Возможно, в коде не хватает заполнения какого-то реквизита в задаче?
(3)
Это был самый первый испробованный вариант, выдает ту же самую ошибку, что в тексте поста...
Задача = Задачи.ЗадачаИсполнителя.СоздатьЗадачу();
Задача.БизнесПроцесс = НовыйПроцесс;
Задача.Дата = ТекущаяДата();
Задача.Исполнитель = Документ.Ответственный;
Задача.Наименование = "123";
Задача.Автор = Процесс.Автор;
Задача.Записать();
НовыйПроцесс.Записать();
НовыйПроцесс.Старт();
ПоказатьЭто был самый первый испробованный вариант, выдает ту же самую ошибку, что в тексте поста...
(4) что-то вы опять не то пишите, пробуйте так:
НовыйПроцесс = БизнесПроцессы.Рассмотрение.СоздатьБизнесПроцесс();
НовыйПроцесс.Заполнить(Новый Структура("Предметы, Шаблон", Документ, ШаблонПроцесса));
НовыйПроцесс.Автор = Процесс.Автор;
НовыйПроцесс.Записать();
НовыйПроцесс.Старт();
Задача = Задачи.ЗадачаИсполнителя.СоздатьЗадачу();
Задача.БизнесПроцесс = НовыйПроцесс;
Задача.Дата = ТекущаяДата();
Задача.Исполнитель = Документ.Ответственный;
Задача.Наименование = "123";
Задача.Автор = Процесс.Автор;
Задача.Записать();
НовыйПроцесс = БизнесПроцессы.Рассмотрение.СоздатьБизнесПроцесс();
НовыйПроцесс.Заполнить(Новый Структура("Предметы, Шаблон", Документ, ШаблонПроцесса));
НовыйПроцесс.Автор = Процесс.Автор;
НовыйПроцесс.Записать();
НовыйПроцесс.Старт();
Задача = Задачи.ЗадачаИсполнителя.СоздатьЗадачу();
Задача.БизнесПроцесс = НовыйПроцесс;
Задача.Дата = ТекущаяДата();
Задача.Исполнитель = Документ.Ответственный;
Задача.Наименование = "123";
Задача.Автор = Процесс.Автор;
Задача.Записать();
(5) я так и пишу, просто решила первые сроки с определением БП опустить, ибо они те же)
Вот полностью:
Ошибка та же самая...
Вот полностью:
Документ = Процесс.Предметы[0].Предмет;
ШаблонПроцесса = Справочники.ШаблоныРассмотрения.НайтиПоНаименованию("Рассмотрение всеми адресатами");
Если ШаблонПроцесса <> Неопределено Тогда
НовыйПроцесс = БизнесПроцессы.Рассмотрение.СоздатьБизнесПроцесс();
НовыйПроцесс.Заполнить(Новый Структура("Предметы, Шаблон", Документ, ШаблонПроцесса));
НовыйПроцесс.Автор = Процесс.Автор;
НовыйПроцесс.Записать();
НовыйПроцесс.Старт();
Задача = Задачи.ЗадачаИсполнителя.СоздатьЗадачу();
Задача.БизнесПроцесс = НовыйПроцесс;
Задача.Дата = ТекущаяДата();
Задача.Исполнитель = Документ.Ответственный;
Задача.Наименование = "123";
Задача.Автор = Процесс.Автор;
Задача.Записать();
КонецЕсли;
ПоказатьОшибка та же самая...
(10) все получилось, проблема была в ТочкеМаршрута.
Пока все выглядит так:
Все работает! Спасибо за помощь.
Единственное, что осталось - это все-таки запихнуть как-то создаваемый новый процесс в главный...
вот с этим пока глухо)))
Пока все выглядит так:
Документ = Процесс.Предметы[0].Предмет;
ШаблонПроцесса = Справочники.ШаблоныРассмотрения.НайтиПоНаименованию("Рассмотрение всеми адресатами");
Если ШаблонПроцесса <> Неопределено Тогда
НовыйПроцесс = БизнесПроцессы.Рассмотрение.СоздатьБизнесПроцесс();
НовыйПроцесс.Заполнить(Новый Структура("Предметы, Шаблон", Документ, ШаблонПроцесса));
НовыйПроцесс.Автор = Процесс.Автор;
НовыйПроцесс.Записать();
НовыйПроцесс.Старт();
ДопАдресаты = АвтоподстановкиПереопределяемый.ПолучитьДопАдресатовДокумента(Документ);
Если ДопАдресаты.Количество() > 0 Тогда
Для Каждого ДопАдресат Из ДопАдресаты Цикл
НоваяЗадача = Задачи.ЗадачаИсполнителя.СоздатьЗадачу();
НоваяЗадача.БизнесПроцесс = НовыйПроцесс.Ссылка;
НоваяЗадача.Дата = ТекущаяДатаСеанса();
НоваяЗадача.Исполнитель = ДопАдресат;
НоваяЗадача.Наименование = НовыйПроцесс.Наименование;
НоваяЗадача.Автор = Процесс.Автор;
НоваяЗадача.ТочкаМаршрута = НовыйПроцесс.ПредметыЗадач[0].ТочкаМаршрута;
СтрокаПредмет = НоваяЗадача.Предметы.Добавить();
СтрокаПредмет.РольПредмета = Процесс.Предметы[0].РольПредмета;
СтрокаПредмет.ИмяПредмета = Процесс.Предметы[0].ИмяПредмета;
СтрокаПредмет.Предмет = Процесс.Предметы[0].Предмет;
НоваяЗадача.Записать();
// предоставление доп адресатам прав на процесс рассмотрения
Набор = РегистрыСведений.УчастникиПроцессов.СоздатьНаборЗаписей();
Набор.Отбор.Процесс.Установить(НовыйПроцесс.Ссылка);
Набор.Отбор.Участник.Установить(ДопАдресат);
Набор.Прочитать();
Если Набор.Количество() = 0 Тогда
ТаблицаИсточник = Новый ТаблицаЗначений;
ТаблицаИсточник.Колонки.Добавить("Участник");
НоваяСтрокаТИ = ТаблицаИсточник.Добавить();
НоваяСтрокаТИ.Участник = ДопАдресат;
РегистрыСведений.УчастникиПроцессов.ЗаписатьНаборПоПроцессу(НовыйПроцесс.Ссылка, ТаблицаИсточник, Ложь);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
ПоказатьВсе работает! Спасибо за помощь.
Единственное, что осталось - это все-таки запихнуть как-то создаваемый новый процесс в главный...
вот с этим пока глухо)))
(11) Путем ковыряния в типовой конфе понял, как запихнуть создаваемый процесс в главный. Нужно для каждого из подпроцессов создавать ведущую задачу. Вот как выглядит код обработки в схеме нашего комплексного процесса по обработке заявки на приобретение ТМЦ, когда ответственных несколько:
Документ = Процесс.Предметы[0].Предмет;
ДопСвойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "Ответственный");
ПараметрыДействийСхемы = Справочники.СхемыКомплексныхПроцессов.ПараметрыДействийСхемы(Процесс.Схема);
ДействиеСхемыЗакупить = ПараметрыДействийСхемы.Найти("ЗакупкаПоЗаявке");
ШаблонДействияЗакупить = ДействиеСхемыЗакупить.ШаблонПроцесса.ПолучитьОбъект();
//Получить исполнителей из списка позиций документа
Запрос = Новый Запрос();
Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
| ТабличныеРеквизиты.Значение КАК Ответственный
|ИЗ
| Справочник.ВнутренниеДокументы.ntzv_ДополнительныеТабличныеРеквизиты КАК ТабличныеРеквизиты
|ГДЕ
| ТабличныеРеквизиты.Ссылка = &Ссылка
| И ТабличныеРеквизиты.Свойство = &Свойство
| И ТабличныеРеквизиты.ИмяТаблицы = &ИмяТаблицы";
Запрос.Параметры.Вставить("Ссылка", Документ);
Запрос.Параметры.Вставить("ИмяТаблицы", "Позиции");
Запрос.Параметры.Вставить("Свойство", ДопСвойство);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
//Заполнить процесс для первого исполнителя
Если Выборка.Следующий() Тогда
Для каждого СтрокаИсполнителя из ШаблонДействияЗакупить.Исполнители Цикл
СтрокаИсполнителя.Исполнитель = Выборка.Ответственный;
КонецЦикла;
ШаблонДействияЗакупить.Записать();
КонецЕсли;
//Если исполнительей больше одного, создать параллельные процессы
Пока Выборка.Следующий() Цикл
ВедущаяЗадачаДействия = Задачи.ЗадачаИсполнителя.СоздатьЗадачу();
ВедущаяЗадачаДействия.Дата = ТекущаяДатаСеанса();
ВедущаяЗадачаДействия.БизнесПроцесс = Процесс.Ссылка;
ВедущаяЗадачаДействия.ТочкаМаршрута = БизнесПроцессы.КомплексныйПроцесс.ТочкиМаршрута.ВложенныйПроцесс;
ВедущаяЗадачаДействия.Записать();
НовыйПроцесс = БизнесПроцессы.Исполнение.СоздатьБизнесПроцесс();
НовыйПроцесс.Заполнить(Новый Структура("Предметы, Шаблон", Документ, ШаблонДействияЗакупить.Ссылка));
НовыйПроцесс.Автор = Процесс.Автор;
НовыйПроцесс.ВедущаяЗадача = ВедущаяЗадачаДействия.Ссылка;
Для каждого СтрокаИсполнителя из НовыйПроцесс.Исполнители Цикл
СтрокаИсполнителя.Исполнитель = Выборка.Ответственный;
КонецЦикла;
НовыйПроцесс.Записать();
НовыйПроцесс.Старт();
КонецЦикла
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот