Не получается Открыть страницу выбора из справочника
ПО действию выполняется процесс, в этом процессе при определенном значение данных вызывается джоб(другой процесс). Вот в этом процессе у меня не получается добавить действие открыть страницу выбора из справочника... Ну, т.е добавить то получилось, но справочник не открывается и ошибки никакой нет (кстати почему нет ошибки?)
параметры для вызова справочника :
string schemaUId = "22C06297-4508-4E5D-9362-4909CF8156CB";
OpenUserTaskSenderMailing.UseCurrentActivePage = true;
OpenUserTaskSenderMailing.PageParameters = new Dictionary string, object>();
var pageParameters = (Dictionary string, object>)OpenUserTaskSenderMailing.PageParameters;
pageParameters.Add("schemaUId", schemaUId);
return true;
Нравится
Вот пример открытия такого окна из БП:
Скрипт в начале (фрагмент):
OpenCardTypePageUserTask.ProcessKey = InstanceUId; OpenCardTypePageUserTask.PageParameters = new Dictionary <string, object>(); var pageParameters = (Dictionary <string, object>)OpenCardTypePageUserTask.PageParameters; pageParameters.Add("schemaUId", "F1E86D1A-DB06-4D92-859B-81B2E90FC5FB"); pageParameters.Add("useHierarchy", false); pageParameters.Add("customClosedEvent", "LookupClosed"); pageParameters.Add("multiSelectMode", false); if (OldCardTypeId != Guid.Empty) { var filters = new Collection<Dictionary<string, object>>(); filters.Add(new Dictionary<string, object> { {"comparisonType", FilterComparisonType.Equal}, {"leftExpressionColumnPath", "CardType.Id"}, {"useDisplayValue", false}, {"rightExpressionParameterValues", new object[] {OldCardTypeId}}}); pageParameters.Remove("LookupFilters"); pageParameters.Add("LookupFilters", filters); } return true;
У промежуточного события сообщение «LookupClosed».
Скрипт в конце:
var selectedStatusesIds = (Dictionary <string, object>)OpenCardTypePageUserTask.GetSelectedValues(UserConnection); if (selectedStatusesIds.Count == 0) { return false; } Inner_CardCategory = new Guid(selectedStatusesIds.First().Key); return true;
на сколько поняла не все перечисленные вами параметры обязательные, обясните несколько из них пожалуйста:
pageParameters.Add("useHierarchy", false);
pageParameters.Add("multiSelectMode", false);
pageParameters.Add("customClosedEvent", "LookupClosed");
Вот касательно последнего параметра, customClosedEvent что это? Как мне узнать правильное название необходимого мне значения? Я смотрела у нас в конфигурациях разные справочники открываются и для каждого справочника значение customClosedEvent свое иои LookupClosed это стандарное значение?. Опять же фильтр мне не нужен, мне нужны все значения справочника (можно его не использовать?)
Первый параметр — видимо, древовидность реестра. Если в справочнике нет в записях ссылки на родительскую, то не надо.
Второй — возможность выбора в окне нескольких записей за раз.
Третий — то событие, которое потом будете ловить. На скриншоте место лова — кружочек. Название события можно придумать любое латинскими буквами без пробелов, главное, чтобы значение в скрипте и «сообщение» у кружочка были одинаковыми. Это сделано, чтобы в разных частях процесса можно было показывать несколько окон и при их закрытии процесс шёл из того места, которого надо.
Ну вот вроде, все как у вас, но не работает..
Подготовка параметров MassMailingScriptTask
OpenUserTaskSenderMailing.ProcessKey = InstanceUId; OpenUserTaskSenderMailing.UseCurrentActivePage = true; OpenUserTaskSenderMailing.PageParameters = new Dictionary <string, object>(); var pageParameters = (Dictionary <string, object>)OpenUserTaskSenderMailing.PageParameters; pageParameters.Add("schemaUId", "22C06297-4508-4E5D-9362-4909CF8156CB"); pageParameters.Add("customClosedEvent", "LookupClosed"); return true;
Работа с полученными данными MassMailingScriptTask
var manager = UserConnection.GetSchemaManager("EntitySchemaManager") as EntitySchemaManager; SetMassMailingStatus(MassMailingId, new Guid("ED5F422E-F46B-1410-6590-1C6F65E24BE8"), manager, this.UId, "StartDateTime");//В работе //GetCurrentUserEmail(); var values = (Dictionary <string, object>)OpenUserTaskSenderMailing.GetSelectedValues(UserConnection); if (values.Count == 0) { return true; } var EmailFromId = new Guid(values.First().Key); //var EmailFromId = new Guid(EmailFromId); string EmailFrom = ""; Select select = new Select(UserConnection) .Column("Name") .From("SenderMailing") .Where("Id").IsEqual(EmailFromId.ToString()) as Select; PrepareMailSubjectAndBody(manager); var targetEntitySchemaQuery = new EntitySchemaQuery(manager, "MassMailingContact"); var idMailing = targetEntitySchemaQuery.AddColumn("Id").Name; var EmailOfMailing = targetEntitySchemaQuery.AddColumn("EmailAddress").Name; var idContactOfMailing = targetEntitySchemaQuery.AddColumn("Contact.Id").Name; var contactNameOfMailing = targetEntitySchemaQuery.AddColumn("Contact.Name").Name; var accountIdOfMailing = targetEntitySchemaQuery.AddColumn("Account.Id").Name; var accountNameOfMailing = targetEntitySchemaQuery.AddColumn("Account.Name").Name; var ownerOfMailing = targetEntitySchemaQuery.AddColumn("MassMailing.Owner.Id").Name; string campaignColName = targetEntitySchemaQuery.AddColumn("MassMailing.Campaign.Id").Name; targetEntitySchemaQuery.Filters.Add(targetEntitySchemaQuery.CreateFilterWithParameters(FilterComparisonType.Equal, "MassMailing.Id", MassMailingId)); var listFilter = new EntitySchemaQueryFilterCollection(targetEntitySchemaQuery, LogicalOperationStrict.Or); listFilter.Add(targetEntitySchemaQuery.CreateIsNullFilter("SendStatus")); listFilter.Add(targetEntitySchemaQuery.CreateFilterWithParameters(FilterComparisonType.NotEqual, "SendStatus", new Guid("8074FFC0-6107-E011-A646-16D83CAB0980"))); targetEntitySchemaQuery.Filters.Add(listFilter); var mailingCollection = targetEntitySchemaQuery.GetEntityCollection(UserConnection); var macrosDictionary = new Dictionary<string,string>(); var activityRecipients = string.Empty; var processUserTaskManager = UserConnection.ProcessUserTaskSchemaManager; var userTaskSchema = (ProcessUserTaskSchema)processUserTaskManager.FindInstanceByName("SendEmailUserTask"); MacrosHelper.UserConnection = UserConnection; foreach (var mailingMacros in mailingCollection) { Guid campaignId = mailingMacros.GetTypedColumnValue<Guid>(campaignColName); Guid targetId = mailingMacros.GetTypedColumnValue<Guid>(idMailing); string recepient = mailingMacros.GetTypedColumnValue<string>(EmailOfMailing); Guid contactId = mailingMacros.GetTypedColumnValue<Guid>(idContactOfMailing); string contactName = mailingMacros.GetTypedColumnValue<string>(contactNameOfMailing); Guid accountId = mailingMacros.GetTypedColumnValue<Guid>(accountIdOfMailing); string accountName = mailingMacros.GetTypedColumnValue<string>(accountNameOfMailing); Guid ownerId = mailingMacros.GetTypedColumnValue<Guid>(ownerOfMailing); string htmlBody = MacrosHelper.ProcessText(MailBody, UserConnection.CurrentUser.ContactId, contactId, accountId); if (accountId != Guid.Empty) { activityRecipients = GetActivityResipients(accountName, recepient); } else if (contactId != Guid.Empty) { activityRecipients = GetActivityResipients(contactName, recepient); } var activitySchema = manager.GetInstanceByName("Activity"); var activity = activitySchema.CreateEntity(UserConnection); activity.SetDefColumnValues(); activity.SetColumnValue("TypeId", new Guid("E2831DEC-CFC0-DF11-B00F-001D60E938C6")); // Email activity.SetColumnValue("Sender", EmailFrom); activity.SetColumnValue("Recepient", activityRecipients); activity.SetColumnValue("Title", MailSubject); activity.SetColumnValue("HtmlBody", htmlBody); activity.SetColumnValue("StartDate", DateTime.UtcNow); activity.SetColumnValue("DueDate", DateTime.UtcNow); activity.SetColumnValue("OwnerId", ownerId); activity.SetColumnValue("AuthorId", UserConnection.CurrentUser.ContactId); activity.SetColumnValue("StatusId", new Guid("4BDBB88F-58E6-DF11-971B-001D60E938C6")); // Finished activity.SetColumnValue("ResultId", new Guid("FB7D22DA-F36B-1410-E19F-1C6F65E9F927")); // Done activity.SetColumnValue("ShowInScheduler", false); if (campaignId != Guid.Empty) { activity.SetColumnValue("CampaignId", campaignId); } if (accountId != Guid.Empty) { activity.SetColumnValue("AccountId", accountId); } else if (contactId != Guid.Empty) { activity.SetColumnValue("ContactId", contactId); } activity.SetColumnValue("MassMailingId", MassMailingId); activity.Save(); CopyAttachmentsToActivity(MassMailingId, activity.PrimaryColumnValue); var userTask = (SendEmailUserTask)userTaskSchema.CreateProcessUserTask(UserConnection); userTask.ActivityId = activity.PrimaryColumnValue; userTask.Execute(context); ErrorCode = userTask.SendEmailStatus; SetMassMailingContactSendStatus(ErrorCode, targetId, manager); } SetMassMailingStatus(MassMailingId, new Guid("FF7F4232-F46B-1410-6690-1C6F65E24BE8"), manager, Guid.Empty, "EndDateTime");//Завершена return true;
Сложно сказать. Может, причина в том, что запущен один процесс из другого. Попробуйте для пробы запустить сразу внутренний, вдруг заработает.
Ещё написали слово «джоб». Если оно действительно запускается по кварцу или иному планировщику, то в таком БП не факт, что вообще можно отображать что-то на экране. Пользователя с браузером может и не быть. Система не знает, кому окно показывать.
Ну я может не правильно выразилась... На прикрепленных файлах(см.ниже) ВЕСЬ процесс запускается по действию, проходит разные проверки и в конце в последнем коде (выделила желтым снимок_2) при определенном параметре вызывается процесс (выделила синим снимок_3) который я описывала изначально
Намудренно конечно, но так было изначально от разработчиков... Вот собственно в таком МЕГА процессе есть возможность открытия моего справочника?
На скриншоте не видно непосредственно как запускается job, но похоже, что таки через кварц.
В таком случае БП запускаются не мгновенно и работают в невизуальном режиме. А значит, никаких окон.
Вот если бы внутренний процесс вызывался через обычный блок-подпроцесс, тогда вроде бы можно было взаимодействовать с пользователями, а так нельзя.
окей, спасибо, буду тогда искать другие пути реализации
Есть идея, может получится вызвать справочник в процессе где он отобразится, и отловить результат промежуточным сообщением, а потом уже это промежуточное сообщение передавать в необходимый мне процесс (код)?
Нет. Так тоже не выйдет. У Вас в тот момент вообще может не быть пользователя с браузером.