Добрый день!
Нужно создать действие: создание одной активности на основании другой. При этом переносить контрагента из родительской активности в подчиненную.
Как можно это сделать?
Заранее спасибо.
Нравится
В 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. После этого элемента у меня идет "Открытие карточки редактирования". Как передать параметр (допустим, Контрагента) из прочитанной активности в элемент "Открытие карточки редактирования"?
Для колонки "Контрагент" реестре колонок элемента "Открыть карточку редактирования" устанавливаете "значение из другого параметра или свойства" (как описано выше), находите в дереве элементов соответствующее "Чтение данных". У этого элемента есть параметр "Результат выборки". Справа будет список колонок прочитанной записи, отфильтрованный по подходящим типам данных. Находите там "Контрагент".
"Дмитрий Логвиненко" написал:
Беляков Дмитрий пишет:
И еще вопрос: По OnClick кнопки создался процесс, после начального сообщения ставлю скрипт, где беру ID выбранной записи и передаю его в следующий элемент "Подпроцесс", с помощью которого запускаю созданный ранее процесс. Но при сохранении пишет: "Элемент "ProcessCreateNewTask" не может быть сериализован в БД, т.к. не сериализуется процесс". Что это означает?
Это означает, что Вы не установили признак "Сериализовать в БД" в свойствах процесса. Если хоть один элемент процесса требует сериализации (в Вашем случае - подпроцесс), то весь процесс тоже необходимо отметить как сериализуемый в базу данных.
Да но это свойство нельзя выставить, если процесс создан в событии OnClick (речь не о дизайнере процессов).
"Дмитрий Логвиненко" написал:Для колонки "Контрагент" реестре колонок элемента "Открыть карточку редактирования" устанавливаете "значение из другого параметра или свойства" (как описано выше), находите в дереве элементов соответствующее "Чтение данных". У этого элемента есть параметр "Результат выборки". Справа будет список колонок прочитанной записи, отфильтрованный по подходящим типам данных. Находите там "Контрагент".
Вот, пытаюсь выбрать, но почему-то выборка не активна:
Что я не так сделал? Вот настройки для элемента "Чтение данных":
"Беляков Дмитрий" написал:Да но это свойство нельзя выставить, если процесс создан в событии OnClick (речь не о дизайнере процессов).
Да, как я написал выше, это все касается только бизнес-процессов. Во встроенных процессах страниц нельзя включить сериализацию и использовать элементы с обязательной сериализацией. У Вас есть такой элемент: "Открыть карточку редактирования". Его нельзя применить во встроенных процессах.
"Беляков Дмитрий" написал:Что я не так сделал? Вот настройки для элемента "Чтение данных":
Вы в элементе "Чтение данных" считаете количество записей, удовлетворяющих условию. В данном случае, это будет ровно одна запись. Результат "Количество записей" - целочисленный тип данных. Колонка "Контрагент" - тип "Справочник "Контрагент". Как я написал, возможные поля результата отфильтрованы по допустимым типам данных. В данном случае типу "Справочник" нельзя присвоить целое число. Поэтому список допустимых полей пуст.
С чтением данных разобрался, спасибо.
Если "Открыть карточку редактирования" нельзя использовать в моем случае, то что же тогда надо использовать, пошел по такому пути: читаем родительскую активность --> создаем новую задачу --> а дальше ее надо открыть, как лучше это сделать? (что должно быть на месте обведенного элемента?)
Процесс:
"Беляков Дмитрий" написал:С чтением данных разобрался, спасибо.
Если "Открыть карточку редактирования" нельзя использовать в моем случае, то что же тогда надо использовать, пошел по такому пути: читаем родительскую активность --> создаем новую задачу --> а дальше ее надо открыть, как лучше это сделать? (что должно быть на месте обведенного элемента?)
Именно этот элемент и нужно использовать. В качестве действия у него укажите "Открыть страницу".
Во встроенном процессе Вам придется использовать механизм, который Вы обсуждали с Дмитрием Олейником выше. После "Создать подчиненную задачу" необходимо вставить задание-сценарий с подготовкой параметров для элемента "Выполнить действие процесса 1". В коде в комментарии #4 переменной recordId присвойте Id записи, созданной в элементе "Создать подчиненную задачу". Он находится в параметре RecordId этого элемента.
Ох, что-то не создается задача
Схема скрипта:
Вот настройки создания задачи:
Дмитрий, есть ли возможность из вне подключится к Вашей системе BPMonline - посмотреть на БП?
Дмитрий, простите за задержу к ответом.
В данный момент ситуация следующая: подключится по указанному Вами адресу с браузера не могу, хотя telnet говорит что подключение по этому IP и по этому порту возможно:
PS: проблема решена - был закрыт доступ по порту. Сегодня в течении дня посмотрю в чем может быть проблема.
Задачу уже создает. Осталось решить как открыть эту самую задачу
А все вроде получилось!
Создается задача и открывается
Еще вопрос: можно ли сделать так, чтобы при нажатии на кнопку "Отмена" в карточке новой задачи, удалялась эта задача?
Вот процесс:
Дмитрий,
попробуйте в обработчике события кнопки "Отмена" выполнить DELETE запрос к БД:
var delete = new Delete(UserConnection).From("Activity").Where("Id").IsEqual(Column.Parameter(new Guid("<Id задачи>"))); delete.Execute();