Є реєстр запитів на внесення змін.
Редагується конкретний запит.
В ньому є деталь активності.
Редагується активність.
Змінюється статус активності.
По факту зміни статусу активності спрацьовує налаштований процес, який змінює статус запиту.

Все працює, але, ні на сторінці редагування запиту, ні, після його закриття, в реєстрі не відображається факт зміни статусу запиту (звісно, поки не зробиш примусового оновлення).

Запитання:
Як забезпечити візуальне оновлення статусу на сторінці редагування і в реєстрі запитів ?

Нравится

1 комментарий

Не уверен, что можно из процесса, работающего с данными, достучаться до визуального отображения.
Особенно к уже открытой карточке. Теоретически, БП может сработать и по интеграции, когда никакой карточки и реестра нет.

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

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

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

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

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

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

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

Добрый день!

Подскажите, каков код для добавления напоминания пользователю, а также, какие поля за что отвечают.

Насколько я понял, то за уведомления отвечает таблица "Reminding"...

Спасибо!

Нравится

4 комментария

Обычно сообщения в виде жёлтой плашки вверху окна выводятся кодом вроде:

Page.BaseMessagePanel.AddMessage(WarningMessageCaption, messagePanelMessage, MessageType.Warning);	

При этом текст сообщения лучше брать из локализируемой строки (справа в дереве в дизайнере БП).

Если же нужно много текста, то, возможно, стоит задизайнить отдельную карточку с текстовым полем и кнопкой ОК и показывать её.

Александр, а существует ли такой же код, только для использования в задании-сценарии (блок с C# кодом) в бизнес-процессе? Проблема в том, что это описание добавления напоминания я выполняю не в процессе модуля формы, а в отдельном простейшем БП, потому у меня нету "Page"...

Чтобы не было недоразумений, уточню следующим скрином, какие напоминания мне нужно добавлять:
Напоминания

А, так Вы об этих напоминаниях, теперь понял.

Такие создаются путём добавления новой записи в таблицу, дальше система сама их сама показывает.

В таблицу можно добавить при помощи класса Entity:

	var remindingSchema = UserConnection.EntitySchemaManager.GetInstanceByName("Reminding");
	var reminding = remindingSchema.CreateEntity(UserConnection);
	reminding.SetDefColumnValues();
	reminding.SetColumnValue("Id", Guid.NewGuid());
	reminding.SetColumnValue("AuthorId", UserConnection.CurrentUser.ContactId);
	reminding.SetColumnValue("ContactId", contactId);
	reminding.SetColumnValue("SourceId", new Guid("a66d08e1-2e2d-e011-ac0a-00155d043205"));
	reminding.SetColumnValue("RemindTime", UserConnection.CurrentUser.GetCurrentDateTime());
	reminding.SetColumnValue("Description", string.Format(RemindingDownMask.ToString(), ServiceDataUserTask.ResultEntity.PrimaryDisplayColumnValue));
	reminding.SetColumnValue("SubjectId", IncidentReadDataUserTask.ResultEntity.GetTypedColumnValue<Guid>("Id"));
	reminding.SetColumnValue("SubjectCaption", IncidentReadDataUserTask.ResultEntity.GetTypedColumnValue<string>("Number"));
	reminding.SetColumnValue("SysEntitySchemaId", new Guid("4a5122f9-493f-46a8-b757-fdddbb71a847"));
	reminding.Save();

Или аналогично при помощи более низкоуровневого Insert:

Insert insert = new Insert(UserConnection)
	.Into("Reminding")
	.Set("Id", Column.Parameter(Guid.NewGuid()))
	.Set("CreatedOn", Column.Parameter(DateTime.UtcNow))
	.Set("CreatedById", Column.Parameter(UserConnection.CurrentUser.ContactId))
	.Set("ModifiedOn", Column.Parameter(DateTime.UtcNow))
	.Set("ModifiedById", Column.Parameter(UserConnection.CurrentUser.ContactId))
	.Set("SubjectId", Column.Parameter(ContactConsts.SupervisorUId))
	.Set("SourceId", Column.Parameter(RemindingConst.AuthorSourceTypeUId))
	.Set("ContactId", Column.Parameter(UserConnection.CurrentUser.ContactId))
	.Set("RemindTime", Column.Parameter(DateTime.UtcNow))
	.Set("AuthorId", Column.Parameter(ContactConsts.SupervisorUId))
	.Set("Description", Column.Parameter(description))
	.Set("SysEntitySchemaId", Column.Parameter(UserConnection.EntitySchemaManager.GetInstanceByName("Contact").UId));
insert.Execute();

Примеры из разных мест, поиском можно найти ещё.

Поле SysEntitySchemaId задаёт Id нужной таблицы раздела, SubjectId — Id записи в нём, о которой напоминаем, SourceId — одна из 2 констант (либо «автору», либо «ответственнному»), остальные поля понятны из названия.

Александр, низкий поклон!!! Спасибо огромное!

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

Добрый день

Создала новый раздел по инструкции .
Сделала новую запись в этом разделе. Теперь: кнопки Добавить, Удалить и Копировать - работают. А при нажатии на кнопку Изменить, система выдает следующую ошибку:

Нравится

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

Татьяна, если Вы создали раздел по инструкции и что-то не работает, то причины могут быть такими:

  • Либо это неправильная инструкция.
  • Либо Вы что-то по ней сделали не так или пропустили какой-то шаг.

К сожалению, без дополнительной информации сложно сказать больше.

Можете попробовать самостоятельно провести отладку, чтобы понять, в чём дело.

Можно выслать мне корректную инструкцию по созданию раздела или видео-материал ?

О создании раздела есть здесь, со стр. 157.

Сделала еще раз по этой инструкции. Опять кнопку Изменить выдает ту же ошибку с именем параметра key. В чем ее причина, не подскажете?

Из всей инструкции у меня не получилось сделать Основную отображаемую колонку объекта. - Система просто ничего не выдавала для выбора.

Возможно, у Вас в объекте раздела не выбрано первичное поле для отображения.

#5 TatianaM 26 ноября 2015 – 14:34
Из всей инструкции у меня не получилось сделать Основную отображаемую колонку объекта. - Система просто ничего не выдавала для выбора.

Почему это произошло?

Кстати, беру объект активность, где указана осн.отображаемая колонка - Заголовок. Нажимаю в этом поле на кнопку выбора - система не предлагает к выбору Заголовок. ВОпрос- каким образом заголовок мог оказаться в этом поле?

Возможно, в этом Вашем новом разделе нет подходящего текстового поля.

Вот еще момент:

при создании основного объекта в инструкции написано:
"
После выбора родительского элемента в структуру объекта будут добавлены
системные колонки, которые содержат информацию, необходимую для
идентификации объекта системой: “Id”, “Создано”, “Создал”, “Изменено”,
“Изменил”.
"

так вот, я род.элемент указала "Базовый элемент" (как в инструкции), после чего системные колонки не добавились. Почему ? Может быть, в этом причина?

#10 TatianaM 26 ноября 2015 – 15:15
Вот еще момент:

при создании основного объекта в инструкции написано:
"
После выбора родительского элемента в структуру объекта будут добавлены
системные колонки, которые содержат информацию, необходимую для
идентификации объекта системой: “Id”, “Создано”, “Создал”, “Изменено”,
“Изменил”.
"

так вот, я род.элемент указала "Базовый элемент" (как в инструкции), после чего системные колонки не добавились. Почему ? Может быть, в этом причина?

// Хотя в объекте Активность в структуре тоже не отображаются колонки “Id”, “Создано”, “Создал”, “Изменено”, “Изменил”.

"Зверев Александр" написал:

Возможно, в этом Вашем новом разделе нет подходящего текстового поля.


В страница карточки записи есть многострочное поле, в объекте есть поле с типом Строка неогр.длины.

да!!!все, надо было тип изменить. все получилось

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

Добрый день
Я сделала новый раздел HELP. При этом, в рук-ве по настройке не нашла, как добавить еще возможность фильтрации по периоду. Помогите, пожалуйста. Заранее спасибо.

Сделала так:

А хотелось бы еще и период вывести, как, напр., в разделе Активность:

Нравится

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

Это делается правкой страницы раздела и добавлением дополнительной логики в её БП.

Чтобы понять, как такое сделать, можно изучить тот самый раздел активностей.
Вкратце, там встроена миникарточка с фильтрами за период и из окна раздела происходит взаимодействие с ней.

Спасибо, поняла.

Добрый день
Слева у меня сделана возможность выбирать период. Но почему реестр записей не изменяется при выборе определенного периода? У меня записи в реестре содержат колонки "Дата начала" и "Дата завершения", как/где эти даты учитываются , если выбран период? Если проводить аналогию с активностями - где именно (в каком скрипте) это учитывается?

В разделе активностей оно учитывается в функции BasePrepeareFilters. Вы можете сделать аналогично.

А в разделе Инциденты оно где учитывается, в какой функции ?

А в разделе Инциденты оно где учитывается, в какой функции ?

А в разделе Инциденты оно где учитывается, в какой функции ?

Вы можете открыть процесс этого раздела и посмотреть. Это несложно.

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

Добрый день!

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

Задача в чем. Нужно получить это уже отфильтрованный грид, наложить на него свой фильтр и отобразить его.

Нужен код, которым я могу вычитать данные из нужного мне грида и засэтить обратно после наложения своего фильтра.

Эти темы перечитывал:
https://community.terrasoft.ru/forum/topic/12723
https://community.terrasoft.ru/forum/topic/12327
https://community.terrasoft.ru/forum/topic/10834
https://community.terrasoft.ru/forum/topic/10764
https://community.terrasoft.ru/forum/topic/12978
https://community.terrasoft.ru/forum/topic/9063
https://community.terrasoft.ru/blogs/9136

Похожее, но не то...

Заранее благодарю!

P.S.: Прошу прощения за бестактность, но! Где можно узнать, какие методы и свойства мне доступны для какого-либо объекта в системе? Хоть какое-то минимальное SDK с объяснениями, пусть даже на китайском языке! Банально не хватает технической литературы по кодингу... =(

Нравится

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

Виталий, минимальный SDK находится здесь.
Свойства можно посмотреть в Visual Studio, подключившись к отладке сайта.
Возможно, то, что Вам нужно, можно посмотреть в скрипте ScriptBasePrepareFilters страницы BaseModulePage (базовая страница раздела). Там делается похожее, берётся датасорс страницы и добавляются и удаляются нужные фильтры. Также см. в других функциях и скриптах той же страницы.

Александр, как всегда выручаете) Спасибо за SDK! Ее находил. Думал, что есть еще какая-либо, которой пользуются немолодые программисты Terrasoft. Да вот только новый вопрос появился...

В исходном коде BaseModulePage в указанном Вами скрипте ScriptBasePrepareFilters имеется действительно все то, что мне нужно. НО! SDK не содержит описания метода CreateFiltersGroup. Вот и вопрос: какие перегрузки для него имеются и отработает ли он вообще? Я, конечно же, буду сейчас пробовать, но тем не менее, последний вопрос остается открытым... Выходит, что SDK не полная?

В SDK есть не всё. Намного больше можно узнать, просто выгрузив исходники конфигурации в виде cs-файлов и их изучая.

Тут на Community есть много примеров вызова этого метода. Похоже, всюду используется одна и та же перезагрузка, с 2 параметрами: текстовое название группы латинскими буквами и логическая операция («LogicalOperationStrict.And» или «LogicalOperationStrict.Or»).

Вас понял - спасибо за наставления!

Осталось решить последнее. Подскажите, каков код для обновления моего грида? Я выполняю следующий код для добавления в грид значений после применения фильтра:

Page.DataSource.LoadRows();

но предыдущие строки грида остаются (что, собственно, логично). Надо вручную обновлять, а это неудобно. В SDK, кстати, не нашел ничего о LoadRows, DataSource, Refresh, Reload, Update, Init и др.... =(

	Page.TreeGrid.Clear();
	Page.DataSource.LoadRows();

Теперь точно всё! Александр, еще раз Вам спасибо за помощь! Хорошего дня!

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

Добрый день!

Хотел поинтересоваться у знатоков, как добавлять системные переменные и каков синтаксис по их использованию: запись и считывание значения? Нашел пример для 7-ки:

https://community.terrasoft.ua/forum/topic/12369

Заранее благодарю!

Нравится

3 комментария

Если речь о системных настройках, как по ссылке, то так:

var maxFileSize = (int)Terrasoft.Core.Configuration.SysSettings.GetValue(UserConnection, "MaxFileSize");
...
Terrasoft.Core.Configuration.SysSettings.SetValue(UserConnection, "GoogleContactSynchInterval", GoogleContactSynchInterval);

Тип переменной может быть различным.

Добрый день!
В инструментах есть вкладка "Системные настройки", там Вы можете ее добавлять/изменять
Из С# кода (пример):

var value = (Guid)Terrasoft.Core.Configuration.SysSettings.GetValue(UserConnection, "SomeName");
 
Terrasoft.Core.Configuration.SysSettings.SetValue(UserConnection, UserConnection.RootAdminUnitGroupId, "SomeName", someValue);

Спасибо, коллеги! Очень признателен за ответы!

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

Добрый день!

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

Спасибо заранее!

Нравится

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

Здравствуйте, Виталий!

Не совсем ясна Ваша задача. Вам необходимо проводить отладку процесса, но при этом Вам необходимы данные страницы. Вы можете создать параметры процесса и передать туда параметры со страницы (на самом деле достаточно передать Id записи, а потом элементом "Чтение данных" подтянуть остальные параметры). Уточните, пожалуйста, Вашу задачу.

А также уточните, пожалуйста, версию и продукт, в котором Вы работаете.

Спасибо, что уделили время моему вопросу!

Программный продукт: Realty v5.4. (вроде ж тему создал в нужном разделе...)

"Вам необходимо проводить отладку процесса, но при этом Вам необходимы данные страницы." - нет, мне не нужно проводить отладку процесса. Мне нужно в момент отработки одного из сторонних модулей, обратиться к этот момент к тем значениям контролов на форме, которая открыта, но еще не записана, и которая не связанна напрямую с этим модулем, в котором мне нужно использовать данные контролов.

Т.е., если бы мне надо было взять значение некоторого чекбокса в модуле процесса этой же формы, я бы написал:

Page.someCheckBox1Edit.Value

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

Параметры процесса тоже выход, но не хотелось бы засорять ненужным структуру процесса. Тем более, эти параметры должны браться как-то из открытой формы. Мне нужно что-то типа:

UserConnection.OpenedPages.GetPage("MyPage").someCheckBox1Edit.Value

Это не реальный код, а просто прообраз того, как (может быть - потому и спрашиваю!) мне получить то, что мне нужно.

Думал как-то прикрутить это:

GetInstanceByName()

но как-то ума не приложу, что и к чему...(

Боюсь, что такого механизма нет и придётся вручную записывать и считывать значения в UserConnection.SessionData. Примеры работы с ней можно найти на Community или в исходниках других страниц.

Нашел по "UserConnection.SessionData" вот это:

http://www.community.terrasoft.ua/forum/topic/9471

Среди всех постов есть вот такой код, по которому у меня еще несколько вопросов:

var defValuesId = new Guid("775F0C4C-9176-449E-B284-4108272F87AA");
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;

Правильно ли я понял. Для текущего пользователя создается переменная с названием "defValuesId.ToString()" и в нее передается коллекция "defValues" типа "Dictionary()" с ранее инициализированными значениями этой коллекции. В любом (в любом?) другом месте я, используя код:

var myDefValues = UserConnection.SessionData["775F0C4C-9176-449E-B284-4108272F87AA"];

могу получить значения, сохраненные в той переменной моей же сессии (только этого пользователя). При чем могу эти значения вычитать произвольное количество раз и записать произвольное количество раз.

Всё ли я правильно понял? Самое основное, что меня интересует - это отсутствие привязки к месту, где я обращаюсь к значению, сохраненному в переменной моей сессии.

Да, Вы правы. Но только в пределах сессии пользователя. Если параллельный процес запущен по какому-то событию в пользовательском интерфейсе, то нормально. А если по таймеру-кварцу или внешней интеграции — сессия уже, наверно, другая.

Это как раз то, что мне нужно. Александр, очень благодарен Вам!

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

Добрый день!

Столкнулся с таким поведением различных версий BPMonline. В Loyalty (версия 5.3) не возникает проблем с всплывающими окнами в Internet Explorer 11 (Windows Server 2012 R2 Standard), а в Realty (версия 5.4) при идентичных настройках браузера ничего не работает, кроме авторизации. Т.е. всплывающие окна не появляются.

Возможно, проблема в чем-то другом. На просторах интернета, увы, ничего похожего нет.

Прошу помощи, кто сталкивался с подобным. Заранее благодарю!

Нравится

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

Никогда подобное не встречалось.
Вероятно, проблема всё же в настройках браузера, запрещены и разрешены окна для конкретного URL первого и второго сайта.

"Зверев Александр" написал:

Никогда подобное не встречалось.

Вероятно, проблема всё же в настройках браузера, запрещены и разрешены окна для конкретного сайта.


Настройки перепробовал все, вплоть до полного отключения блокировки всплывающих окон. Также "игрался" с включением/отключением сценариев и ActiveX. Сайт добавил во все разрешения и список надежных сайтов. Ничего не помогает. На Loyalty при этом (повторюсь) все работает без проблем.

А в другом браузере всё нормально?
А в таком же на другом компьютере?

Первое. В ЯндексБраузере все отлично работает (в плане всплывающих окон и уведомлений, если таковые блокируются). В ГуглХроме тоже, но Хром не поюзаешь для работы, т.к. он не поддерживает SilverLight.
Второе. Это серверный компьютер, и все пользователи (практически) работают на нем через RDP.

Если в одних браузерах всё работает, а в другом нет, то проблема либо в IE, либо в специфических настройках Windows, которые IE подхватывает. Поскольку между 5.3 и 5.4 особых доработок интерфейса не было, то дело, скорее всего, в адресе сайта. Если сайты Ваши, попробуйте поменять их местами и посмотрите, проблема в адресе или в версии.

Если ли бы и там (в 5.3) и там (в 5.4) были проблемы, то я бы смирился с Windows'ом и его "странным" IE. Но ведь в IE версия 5.3 работает без проблем! Т.е. получается, что в 5.4. всё же что-то есть, что на это может влиять...

Можете уточнить, что Вы имеете в виду под словами "попробуйте поменять их местами"? Сайты зарвёрнуты на нашем сервере. Мне нужно в IIS'е поменять номера портов местами?

Здравствуйте.
Пробовал проверить работу всплывающих окон Realty 5.4 на IE11 - всё нормально. Думаю, что решение Вам нужно искать у себя. Для начала, как рекомендовали выше, поменять местами порты сайта. Если не поможет, тогда, всё таки, смотреть настройки браузера, ОС, политики безопасности и т. д..

Спасибо коллеги! Буду копаться...

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

defValues.Add("Symptoms", Page.TitleEdit.Value.ToString());

А если поле имеет тип дата/время, то, подскажите, пожалуйста, как правильно написать то же самое?

Нравится

1 комментарий