Создание новой активности по кнопке из реестра с открытием страницы редактирования активности.
Пытаюсь реализовать сабж.
Читал тут https://community.terrasoft.ru/forum/topic/8691, но так и не понял как в результате все у человека срослось?
Так и не понял, открыть окно редактирования можно через элементы бизнес-процесса или все скриптом делать?
И еще: как мне передать параметр из процесса в подпроцесс? Можно ли это сделать если основной процесс это процесс страницы реестра?
Нравится
Вообще задача довольно тривиальная: по кнопке в реестре создать активность используя данные выбранной в данный момент в реестре записи.
На нажатие кнопки в обработчике события заполняю параметры (id выбранной в реестре записи и кой чего еще нужного), далее идет вызов подпроцесса.
Не дает сохранить, так как "Элемент "CreateActivity" не может быть сериализован в БД, т.к. не сериализуется процесс". Не сериализуются обработчики, это понятно, тогда как?
Выше читал http://www.community.terrasoft.ru/forum/topic/8691, и понял что там пошли каким то другим путем, но до конца так и не понял каким....
Кто нибудь поможет?
Такое ощущение, что вообще никто никогда этого не делал......
Почитайте эту тему http://www.community.terrasoft.ru/forum/topic/9208
Там я создавал инцидент из активности (из карточки)
Думаю перенастроить на активность и из реестра не сильно усложнит задачу.
Здравствуйте, Александр!
Открытие окна редактирования состоит из трех этапов:
1. Обработчик сигнала (в Вашем случае - нажатие на кнопку)
2. Скрипт инициализации окна с заданием параметров;
3. Действие процесса "открытие окна".
Пример открытия карточки создания задачи из реестра Контрагентов.
Вот как это выглядит в дизайнере бизнес-процессов:
Как это устроено внутри:
1. Стартовый сигнал - обработчик нажатия на кнопку:
2. Скрипт.
var defValues = new Dictionary <string, object>(); defValues.Add("Account", Page.TreeGrid.SelectedNodes[0].Values["Id"]); defValues.Add("Type", new Guid("FBE0ACDC-CFC0-DF11-B00F-001D60E938C6")); //тип - задача var parameters = new Dictionary<string, string> { {"recordId", Guid.Empty.ToString()}, //для создания новой записи {"defValuesId", defValues.ToString()} //сюда можно передать значения полей окна }; UserTaskOpenPage.PageParameters = parameters; UserTaskOpenPage.UseOpenerRegisterScript = true; UserTaskOpenPage.PageUId = new Guid("f2bf397b-8fa3-48ba-b691-57360871967a"); //идентификатор схемы окна редактирования return true;
где UserTaskOpenPage - название элемента БП "Открыть страницу". Обратите внимание, тут указан специфический набор параметров, их может быть как больше, так и меньше.
3. Действие БП "Открыть страницу":
Что то не так, карточка активности нужная открывается, но не передаются параметры...
Может я что то не так передаю?
var defValues = new Dictionary ();
defValues.Add("Type", new Guid("E1831DEC-CFC0-DF11-B00F-001D60E938C6"));
defValues.Add("Account", Page.TreeGrid.SelectedNodes[0].Values["LotCustomerId"]);
defValues.Add("PGNHK_AuctionLot", Page.TreeGrid.SelectedNodes[0].Values["Id"]);
var parameters = new Dictionary {
{"recordId", Guid.Empty.ToString()}, //для создания новой записи
{"defValuesId", defValues.ToString()} //сюда можно передать значения полей окна
};
UserTaskOpenPage.PageParameters = parameters;
UserTaskOpenPage.UseOpenerRegisterScript = true;
UserTaskOpenPage.PageUId = new Guid("a2036c88-ca04-4744-967b-5b8a46612d83");
Получилось...., код изначально не совсем верен, но полезно, понял логику процесса.
Так должно быть:
var defValuesId = Guid.NewGuid();
var defValues = new Dictionary ();
defValues.Add("Type", new Guid("E1831DEC-CFC0-DF11-B00F-001D60E938C6"));
defValues.Add("Account", Customer );
defValues.Add("PGNHK_AuctionLot", AuctionLot );
UserConnection.SessionData[defValuesId.ToString()] = defValues;
var parameters = new Dictionary {
{"recordId", Guid.Empty.ToString()}, //для создания новой записи
{"defValuesId", defValuesId.ToString()}
};
UserTaskOpenPage.PageParameters = parameters;
UserTaskOpenPage.UseOpenerRegisterScript = true;
UserTaskOpenPage.PageUId = new Guid("a2036c88-ca04-4744-967b-5b8a46612d83"); //идентификатор схемы окна редактирования
Александр, defValues нужно создавать не просто как Dictionary, а определять:
var defValues = new Dictionary <string, object>();
Дело в том, что каждая карточка содержит унаследованную от базовой функцию вычитки значений по умолчанию, которая принимает объект определенного типа.
Это очепятка, сорри, на самом деле, как вы и сказали стоит :-)
Александр, попробуйте добавить сохранение defValues в SessionData:
Page.UserConnection.SessionData[defValuesId.ToString()] = defValues; var parameters = new Dictionary<string, string> { {"recordId", Guid.Empty.ToString()}, {"entitySchemaUId", "16be3651-8fe2-4159-8dd0-a803d4683dd3"}, {"defValuesId", defValuesId.ToString()} }; UserTaskOpenPage.PageParameters = parameters;
Ээээ, вообще то все работает, а в чем глубинный смысл?...
Я что то не то там выше вставил, сейчас посмотрел, на самом деле у меня вот так все выглядит:
var defValuesId = Guid.NewGuid(); var defValues = new Dictionary <string, object>(); defValues.Add("Type", new Guid("E2831DEC-CFC0-DF11-B00F-001D60E938C6")); defValues.Add("Account", Customer ); defValues.Add("PGNHK_AuctionLot", AuctionLot ); defValues.Add("Notes", Notes ); UserConnection.SessionData[defValuesId.ToString()] = defValues; var parameters = new Dictionary<string, string> { {"recordId", Guid.Empty.ToString()}, //для создания новой записи {"defValuesId", defValuesId.ToString()} }; ActivityEmailOpenPage.PageParameters = parameters; ActivityEmailOpenPage.UseOpenerRegisterScript = true; ActivityEmailOpenPage.PageUId = new Guid("dcdda065-321b-4560-aacb-05f6cc72cd80");