Создание подчиненной активности

Добрый день!

Нужно создать действие: создание одной активности на основании другой. При этом переносить контрагента из родительской активности в подчиненную.
Как можно это сделать?

Заранее спасибо.

Нравится

35 комментариев

В 5.4 есть возможность при создании новой записи запускать БП. В этом БП можно получить значения колонок из созданной записи и создать другую запись. Смотрите на элементы Чтение, Добавление данных.
Можно реализовать это действием в разделе.

Здравствуйте!

А если нужно не просто создать запись новой задачи, а открыть ее карточку? И чтобы в карточке стояла ссылка на активность, по которой было совершено действие.

Думаю можно использовать стандартный скрипт открытия карточки. Только есть вопросы по нему. Вот код:

string recordId = Guid.Empty.ToString();
EntitySchemaUId = Page.DataSource.SchemaUId;
var pageSchemaManager = Page.DataSource.Schema.SchemaManagerProvider.GetManager("PageSchemaManager");
Guid EditPageUId = new Guid("f2bf397b-8fa3-48ba-b691-57360871967a");
var editPageSchema = pageSchemaManager.GetInstanceByUId(EditPageUId) as PageSchema;
OpenEditWindow.OpenerInstanceId = InstanceUId;
OpenEditWindow.UseCurrentActivePage = true;
OpenEditWindow.PageUId = EditPageUId;
var parameters =  
      new Dictionary<string, string> {
            {"recordId", recordId.ToString()},
            {"entitySchemaUId", EntitySchemaUId},
            {"treeGridId", Page.TreeGrid.ClientID},
			{"SysModuleEditId", SysModuleEditId.ToString()}
      };
if (!IsDetailGrid && SysModuleId != Guid.Empty) {
	parameters.Add("SysModuleId", SysModuleId.ToString());
}
if (!LocatedInEditPage && !string.IsNullOrEmpty(ListenerPageProcessUId)) {
	var listenerPageProcess = UserConnection.ProcessEngine.GetProcessByUId(ListenerPageProcessUId);	
	var mainPageProcessUId = listenerPageProcess.GetPropertyValue("MainPageProcessUId") != null ? listenerPageProcess.GetPropertyValue("MainPageProcessUId").ToString() : string.Empty;
	if (!string.IsNullOrEmpty(mainPageProcessUId)) {
		parameters.Add("mainPageProcessUId", mainPageProcessUId);	
	}	
}
if(DefValuesId != null && !DefValuesId.IsEmpty()) {
	parameters.Add("defValuesId", DefValuesId.ToString());
}
if(SelectedFolderId != null && !SelectedFolderId.Equals(Guid.Empty)) {
	parameters.Add("folderId", SelectedFolderId.ToString());
}
if (!string.IsNullOrEmpty(EditPageHelpContextId)) {
	parameters.Add("helpContextId", EditPageHelpContextId);
}
OpenEditWindow.PageParameters = parameters;
OpenEditWindow.Centered = true;
OpenEditWindow.CloseOpenerOnLoad = false;
return true;

1) EditPageUId - это ID нужной страницы
2) Что за параметры SysModuleEditId, InstanceUId, SysModuleId, DefValuesId, SelectedFolderId, EditPageHelpContextId? Можно ли их прописать вручную?
3) Можно ли в PageParameters передать ID нужной активности?

Здравствуйте.
Конечно, если Вы пользуетесь 5.4 то это можно реализовать в рамках БП - вначале создать запись, а потом открыть карточку этой записи.
Но можно и кодом. При этом Вы можете обойтись этой частью кода:

string recordId = Guid.Empty.ToString();
EntitySchemaUId = Page.DataSource.SchemaUId;
var pageSchemaManager = Page.DataSource.Schema.SchemaManagerProvider.GetManager("PageSchemaManager");
Guid EditPageUId = new Guid("f2bf397b-8fa3-48ba-b691-57360871967a");
var editPageSchema = pageSchemaManager.GetInstanceByUId(EditPageUId) as PageSchema;
OpenEditWindow.OpenerInstanceId = InstanceUId;
OpenEditWindow.UseCurrentActivePage = true;
OpenEditWindow.PageUId = EditPageUId;
var parameters =  
      new Dictionary<string, string> {
            {"recordId", recordId.ToString()},
            {"entitySchemaUId", EntitySchemaUId},
            {"treeGridId", Page.TreeGrid.ClientID},
                        {"SysModuleEditId", SysModuleEditId.ToString()}
      };

где recordId - ID нужной активности.

У элемента "Добавить данные" есть такой параметр RecordDefValues, как правильно записать туда параметры? Как я понял, здесь можно указать параметры полей новой записи.

Здравствуйте, Дмитрий.
Через метод Add, где первый параметр - имя поля обьекта, второй - его значение.

var RecordDefValues= new Dictionary<
	string, object>();
RecordDefValues.Add("TypeId", "fbe0acdc-cfc0-df11-b00f-001d60e938c6");

Вот что BPM выдает, если присваивать такую конструкцию к свойству элемента

Вот код скрипта:

Guid EntitySchemaId = new Guid("c449d832-a4cc-4b01-b9d5-8a12c42a9f89");
AddNewTask.EntitySchemaId = EntitySchemaId;
Guid ParentActivityId = new Guid("c2ebcd46-c33c-4fc1-8736-d36bb9ddce5f");
Guid AccountId = new Guid("3f0f1cd5-2ac9-4e0b-bc17-e386a91743c9");
var DefValues =  
      new Dictionary<string, object> {
            {"AccountId", AccountId.ToString()},
            {"ParentActivityId", ParentActivityId.ToString()}
      };
AddNewTask.RecordDefValues = DefValues;
return true;

А зачем писать код, если все можно сделать через карточки редактирования параметров в дизайнере?

Не понял что Вы имеете ввиду

Параметры - не константа, по моему другого пути нет, кроме как писать из скрипта

Насколько я понял, Вам необходимо создать еще одну задачу, заполнив ее поле "Контрагент" значением из первой задачи, и открыть ее карточку редактирования. В версии 5.4 все это решается без единой строчки скрипта:
1. Заводите первую задачу с помощью элемента "Задача"
2. Ставите элемент "Карточка редактирования", который создаст вторую задачу и откроет ее карточку.
3. В списке "Значения полей по умолчанию" добавляете колонку "Контрагент", ставите ей значение "Установить из другого параметра или свойства", выбираете элемент первой задачи и ее колонку "Контрагент" (см. картинку)

Все.

бизнес-процесс

У меня что-то не открывается окно свойств для элемента процесса, оно должно открываться по 2-ному клику?

"Беляков Дмитрий" написал:

У меня что-то не открывается окно свойств для элемента процесса, оно должно открываться по 2-ному клику?

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

Я уточню: мы же говорим о бизнес-процессах, а не о встроенных процессах страниц? Во встроенных процессах страниц эти элементы использовать нельзя, соотв. иконки в контекстном меню элемента нет и окно свойств не открывается специально.

Да, в БП процессах действительно нашла свойства для элемента процесса.
А как можно автоматически запускать нарисованный процесс?
И как передать параметры?
Нужно чтобы по кнопке, находящейся в реестре активностей, запускался процесс по добавлению новой задачи, и чтобы указывается Id предыдущей(родительской) активности.

Александра, если Вам нужно создавать подчиненную активность в конкретных определенных случаях, создайте новый БП, стартовым событием которого будет элемент "сигнал", который будет "слушать" изменения в объекте "Активности". При этом, можно установить дополнительные условия, которым должна соответствовать запись объекта, для того чтобы ПБ запустился (к примеру тип активности = "задача", ответственный = "Антон Петрович"). Далее, создайте новую активность, значение по умолчанию установите из элемента чтения данных, который вычтет ту активность, по которой был запущен БП.

Если создавать подчиненную активность нужно в "рандомных" случаях, добавьте кнопку "Создать подчиненную активность", перейдите на событие OnClick - при этом откроется дизайнер процессов, и далее добавьте элемент под-процесс, и выберите, какой процесс Вам нужно запустить.

Вопрос такой: как забрать данные с помощью действия "Читать данные"? Допустим я получил ID нужной записи, в свойствах действия указал фильтрацию по этому ID. После этого элемента у меня идет "Открытие карточки редактирования". Как передать параметр (допустим, Контрагента) из прочитанной активности в элемент "Открытие карточки редактирования"?

И еще вопрос: По OnClick кнопки создался процесс, после начального сообщения ставлю скрипт, где беру ID выбранной записи и передаю его в следующий элемент "Подпроцесс", с помощью которого запускаю созданный ранее процесс. Но при сохранении пишет: "Элемент "ProcessCreateNewTask" не может быть сериализован в БД, т.к. не сериализуется процесс". Что это означает?

Для лучшего представления скриншоты:

1) Процесс на OnClick действия:

2) Сам процесс создания новой активности:

"Беляков Дмитрий" написал:

И еще вопрос: По OnClick кнопки создался процесс, после начального сообщения ставлю скрипт, где беру ID выбранной записи и передаю его в следующий элемент "Подпроцесс", с помощью которого запускаю созданный ранее процесс. Но при сохранении пишет: "Элемент "ProcessCreateNewTask" не может быть сериализован в БД, т.к. не сериализуется процесс". Что это означает?


Это означает, что Вы не установили признак "Сериализовать в БД" в свойствах процесса. Если хоть один элемент процесса требует сериализации (в Вашем случае - подпроцесс), то весь процесс тоже необходимо отметить как сериализуемый в базу данных.

"Беляков Дмитрий" написал:

Вопрос такой: как забрать данные с помощью действия "Читать данные"? Допустим я получил ID нужной записи, в свойствах действия указал фильтрацию по этому ID. После этого элемента у меня идет "Открытие карточки редактирования". Как передать параметр (допустим, Контрагента) из прочитанной активности в элемент "Открытие карточки редактирования"?


Для колонки "Контрагент" реестре колонок элемента "Открыть карточку редактирования" устанавливаете "значение из другого параметра или свойства" (как описано выше), находите в дереве элементов соответствующее "Чтение данных". У этого элемента есть параметр "Результат выборки". Справа будет список колонок прочитанной записи, отфильтрованный по подходящим типам данных. Находите там "Контрагент".

Mapping

"Дмитрий Логвиненко" написал:
Беляков Дмитрий пишет:

И еще вопрос: По OnClick кнопки создался процесс, после начального сообщения ставлю скрипт, где беру ID выбранной записи и передаю его в следующий элемент "Подпроцесс", с помощью которого запускаю созданный ранее процесс. Но при сохранении пишет: "Элемент "ProcessCreateNewTask" не может быть сериализован в БД, т.к. не сериализуется процесс". Что это означает?

Это означает, что Вы не установили признак "Сериализовать в БД" в свойствах процесса. Если хоть один элемент процесса требует сериализации (в Вашем случае - подпроцесс), то весь процесс тоже необходимо отметить как сериализуемый в базу данных.


Да но это свойство нельзя выставить, если процесс создан в событии OnClick (речь не о дизайнере процессов).

"Дмитрий Логвиненко" написал:

Для колонки "Контрагент" реестре колонок элемента "Открыть карточку редактирования" устанавливаете "значение из другого параметра или свойства" (как описано выше), находите в дереве элементов соответствующее "Чтение данных". У этого элемента есть параметр "Результат выборки". Справа будет список колонок прочитанной записи, отфильтрованный по подходящим типам данных. Находите там "Контрагент".

Вот, пытаюсь выбрать, но почему-то выборка не активна:

Что я не так сделал? Вот настройки для элемента "Чтение данных":

"Беляков Дмитрий" написал:

Да но это свойство нельзя выставить, если процесс создан в событии OnClick (речь не о дизайнере процессов).


Да, как я написал выше, это все касается только бизнес-процессов. Во встроенных процессах страниц нельзя включить сериализацию и использовать элементы с обязательной сериализацией. У Вас есть такой элемент: "Открыть карточку редактирования". Его нельзя применить во встроенных процессах.

"Беляков Дмитрий" написал:

Что я не так сделал? Вот настройки для элемента "Чтение данных":

Вы в элементе "Чтение данных" считаете количество записей, удовлетворяющих условию. В данном случае, это будет ровно одна запись. Результат "Количество записей" - целочисленный тип данных. Колонка "Контрагент" - тип "Справочник "Контрагент". Как я написал, возможные поля результата отфильтрованы по допустимым типам данных. В данном случае типу "Справочник" нельзя присвоить целое число. Поэтому список допустимых полей пуст.

С чтением данных разобрался, спасибо.

Если "Открыть карточку редактирования" нельзя использовать в моем случае, то что же тогда надо использовать, пошел по такому пути: читаем родительскую активность --> создаем новую задачу --> а дальше ее надо открыть, как лучше это сделать? (что должно быть на месте обведенного элемента?)

Процесс:

"Беляков Дмитрий" написал:

С чтением данных разобрался, спасибо.

Если "Открыть карточку редактирования" нельзя использовать в моем случае, то что же тогда надо использовать, пошел по такому пути: читаем родительскую активность --> создаем новую задачу --> а дальше ее надо открыть, как лучше это сделать? (что должно быть на месте обведенного элемента?)


Именно этот элемент и нужно использовать. В качестве действия у него укажите "Открыть страницу".
Во встроенном процессе Вам придется использовать механизм, который Вы обсуждали с Дмитрием Олейником выше. После "Создать подчиненную задачу" необходимо вставить задание-сценарий с подготовкой параметров для элемента "Выполнить действие процесса 1". В коде в комментарии #4 переменной recordId присвойте Id записи, созданной в элементе "Создать подчиненную задачу". Он находится в параметре RecordId этого элемента.

Ох, что-то не создается задача

Схема скрипта:

Вот настройки создания задачи:

Дмитрий, есть ли возможность из вне подключится к Вашей системе BPMonline - посмотреть на БП?

Отправил в личку

Что нибудь удалось выяснить?

Дмитрий, простите за задержу к ответом.
В данный момент ситуация следующая: подключится по указанному Вами адресу с браузера не могу, хотя telnet говорит что подключение по этому IP и по этому порту возможно:

1

2

PS: проблема решена - был закрыт доступ по порту. Сегодня в течении дня посмотрю в чем может быть проблема.

Жду с нетерпением)

Задачу уже создает. Осталось решить как открыть эту самую задачу

А все вроде получилось!
Создается задача и открывается

Еще вопрос: можно ли сделать так, чтобы при нажатии на кнопку "Отмена" в карточке новой задачи, удалялась эта задача?

Вот процесс:

Дмитрий,
попробуйте в обработчике события кнопки "Отмена" выполнить DELETE запрос к БД:

var delete = new Delete(UserConnection).From("Activity").Where("Id").IsEqual(Column.Parameter(new Guid("<Id задачи>")));
delete.Execute();
Показать все комментарии