Не получается Открыть страницу выбора из справочника

ПО действию выполняется процесс, в этом процессе при определенном значение данных вызывается джоб(другой процесс). Вот в этом процессе у меня не получается добавить действие открыть страницу выбора из справочника... Ну, т.е добавить то получилось, но справочник не открывается и ошибки никакой нет (кстати почему нет ошибки?)
параметры для вызова справочника :

OpenUserTaskSenderMailing.ProcessKey = InstanceUId;
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;

Нравится

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

Вот пример открытия такого окна из БП:
from lookup
Скрипт в начале (фрагмент):

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
1

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

окей, спасибо, буду тогда искать другие пути реализации

Есть идея, может получится вызвать справочник в процессе где он отобразится, и отловить результат промежуточным сообщением, а потом уже это промежуточное сообщение передавать в необходимый мне процесс (код)?

Нет. Так тоже не выйдет. У Вас в тот момент вообще может не быть пользователя с браузером.

Показать все комментарии