Создание новой активности по кнопке из реестра с открытием страницы редактирования активности.

Пытаюсь реализовать сабж.
Читал тут https://community.terrasoft.ru/forum/topic/8691, но так и не понял как в результате все у человека срослось?
Так и не понял, открыть окно редактирования можно через элементы бизнес-процесса или все скриптом делать?
И еще: как мне передать параметр из процесса в подпроцесс? Можно ли это сделать если основной процесс это процесс страницы реестра?

Нравится

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

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

На нажатие кнопки в обработчике события заполняю параметры (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");
Показать все комментарии