ПО действию выполняется процесс, в этом процессе при определенном значение данных вызывается джоб(другой процесс). Вот в этом процессе у меня не получается добавить действие открыть страницу выбора из справочника... Ну, т.е добавить то получилось, но справочник не открывается и ошибки никакой нет (кстати почему нет ошибки?)
параметры для вызова справочника :
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;
Нравится
Вот пример открытия такого окна из БП:

Скрипт в начале (фрагмент):
[csharp]
OpenCardTypePageUserTask.ProcessKey = InstanceUId;
OpenCardTypePageUserTask.PageParameters = new Dictionary ();
var pageParameters = (Dictionary )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>();
filters.Add(new Dictionary {
{"comparisonType", FilterComparisonType.Equal},
{"leftExpressionColumnPath", "CardType.Id"},
{"useDisplayValue", false},
{"rightExpressionParameterValues", new object[] {OldCardTypeId}}});
pageParameters.Remove("LookupFilters");
pageParameters.Add("LookupFilters", filters);
}
return true;
[/csharp]
У промежуточного события сообщение «LookupClosed».
Скрипт в конце:
[csharp]
var selectedStatusesIds = (Dictionary )OpenCardTypePageUserTask.GetSelectedValues(UserConnection);
if (selectedStatusesIds.Count == 0) {
return false;
}
Inner_CardCategory = new Guid(selectedStatusesIds.First().Key);
return true;
[/csharp]
на сколько поняла не все перечисленные вами параметры обязательные, обясните несколько из них пожалуйста:
[csharp]
pageParameters.Add("useHierarchy", false);
[/csharp]
[csharp]
pageParameters.Add("multiSelectMode", false);
[/csharp]
[csharp]
pageParameters.Add("customClosedEvent", "LookupClosed");
[/csharp]
Вот касательно последнего параметра, customClosedEvent что это? Как мне узнать правильное название необходимого мне значения? Я смотрела у нас в конфигурациях разные справочники открываются и для каждого справочника значение customClosedEvent свое иои LookupClosed это стандарное значение?. Опять же фильтр мне не нужен, мне нужны все значения справочника (можно его не использовать?)
Первый параметр — видимо, древовидность реестра. Если в справочнике нет в записях ссылки на родительскую, то не надо.
Второй — возможность выбора в окне нескольких записей за раз.
Третий — то событие, которое потом будете ловить. На скриншоте место лова — кружочек. Название события можно придумать любое латинскими буквами без пробелов, главное, чтобы значение в скрипте и «сообщение» у кружочка были одинаковыми. Это сделано, чтобы в разных частях процесса можно было показывать несколько окон и при их закрытии процесс шёл из того места, которого надо.
Ну вот вроде, все как у вас, но не работает..
Подготовка параметров MassMailingScriptTask
[csharp]
OpenUserTaskSenderMailing.ProcessKey = InstanceUId;
OpenUserTaskSenderMailing.UseCurrentActivePage = true;
OpenUserTaskSenderMailing.PageParameters = new Dictionary ();
var pageParameters = (Dictionary )OpenUserTaskSenderMailing.PageParameters;
pageParameters.Add("schemaUId", "22C06297-4508-4E5D-9362-4909CF8156CB");
pageParameters.Add("customClosedEvent", "LookupClosed");
return true;
[/csharp]
Работа с полученными данными MassMailingScriptTask
[csharp]
var manager = UserConnection.GetSchemaManager("EntitySchemaManager") as EntitySchemaManager;
SetMassMailingStatus(MassMailingId, new Guid("ED5F422E-F46B-1410-6590-1C6F65E24BE8"),
manager, this.UId, "StartDateTime");//В работе
//GetCurrentUserEmail();
var values = (Dictionary )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();
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(campaignColName);
Guid targetId = mailingMacros.GetTypedColumnValue(idMailing);
string recepient = mailingMacros.GetTypedColumnValue(EmailOfMailing);
Guid contactId = mailingMacros.GetTypedColumnValue(idContactOfMailing);
string contactName = mailingMacros.GetTypedColumnValue(contactNameOfMailing);
Guid accountId = mailingMacros.GetTypedColumnValue(accountIdOfMailing);
string accountName = mailingMacros.GetTypedColumnValue(accountNameOfMailing);
Guid ownerId = mailingMacros.GetTypedColumnValue(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;
[/csharp]
Сложно сказать. Может, причина в том, что запущен один процесс из другого. Попробуйте для пробы запустить сразу внутренний, вдруг заработает.
Ещё написали слово «джоб». Если оно действительно запускается по кварцу или иному планировщику, то в таком БП не факт, что вообще можно отображать что-то на экране. Пользователя с браузером может и не быть. Система не знает, кому окно показывать.
Ну я может не правильно выразилась... На прикрепленных файлах(см.ниже) ВЕСЬ процесс запускается по действию, проходит разные проверки и в конце в последнем коде (выделила желтым снимок_2) при определенном параметре вызывается процесс (выделила синим снимок_3) который я описывала изначально
Намудренно конечно, но так было изначально от разработчиков... Вот собственно в таком МЕГА процессе есть возможность открытия моего справочника?
На скриншоте не видно непосредственно как запускается job, но похоже, что таки через кварц.
В таком случае БП запускаются не мгновенно и работают в невизуальном режиме. А значит, никаких окон.
Вот если бы внутренний процесс вызывался через обычный блок-подпроцесс, тогда вроде бы можно было взаимодействовать с пользователями, а так нельзя.
окей, спасибо, буду тогда искать другие пути реализации
Есть идея, может получится вызвать справочник в процессе где он отобразится, и отловить результат промежуточным сообщением, а потом уже это промежуточное сообщение передавать в необходимый мне процесс (код)?
Нет. Так тоже не выйдет. У Вас в тот момент вообще может не быть пользователя с браузером.