Вопрос

Открыть страницу реестра

Добрый день.
В БП по сигналу мне бы хотелось, чтобы открывалась страница реестра Взаимосвязей.
Каким образом мне правильно сделать, чтобы туда передавался контакт в ContactAId и я могла создавать там новые записи при нажатии на кнопку "Добавить"?

Нравится

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

Здравствуйте!

Для решения необходимо использовать элемент "Преднастроенная страница". Элемент описан по ссылке:
http://www.community.terrasoft.ru/img/video/lms/28/story.html

Также данная тема обсуждалась в других ветках:
http://www.community.terrasoft.ru/forum/topic/25237

Здравствуйте.
Элемент бизнес-процесса "Преднастроенная страница" есть в 7ке, у нас же 5ка и такого элемента для работы с БП нет. Нужна другая реализация данной задачи.

Антонина, в 5.Х есть возможность добавить в процесс элемент-действие, в действии указать «Открыть страницу». Нужные значения передать в параметрах, а их обработку написать в процессе самой страницы.

Я так и пытаюсь сделать. Меня интересует в каком именно параметре нужно передавать значение ContactAId.
вот пример кода:

var ReportSchemaUId = "56a4f892-df6b-4dac-99ad-762f56553035";//Базовая страница реестра взаимосвязей
var EntitySchemaUId = "8409eced-ba37-4a6a-a031-671fcb7be3e2";
 
Guid ContactId = ReadDataUserTask2.ResultEntity.GetTypedColumnValue<Guid>("ContactId");
RelationUserTask.OpenerInstanceId = InstanceUId;
RelationUserTask.PageUId =  new Guid("56a4f892-df6b-4dac-99ad-762f56553035");
var parameters =  
      new Dictionary<string, string> {
            {"ContactAId", ContactId.ToString()},
			{"DataSourceUId", EntitySchemaUId.ToString()},
			{"TreeGridId", EntitySchemaUId.ToString()}//,
      };
 
RelationUserTask.PageParameters = parameters;
 
RelationUserTask.Centered = true;
RelationUserTask.CloseOpenerOnLoad = false;
 
var SelectedActiveRows = new List<Guid>();
SelectedActiveRows.Add(new Guid(DocumentId.ToString()));
 
var selectedRows = new Dictionary<string, object>();
selectedRows.Add("Item1", "Contact");
selectedRows.Add("Item2", "Id");
selectedRows.Add("Item3", SelectedActiveRows);
UserConnection.SessionData[EntitySchemaUId.ToString() + "_SelectedActiveRows"] = selectedRows;

В каком угодно, это зависит от реализации.
Главное, внутри его потом вычитать и использовать в логике страницы.
Для примера посмотрите, как из AccountEditPage в DuplicatesSearchResultModulePage передаются DuplicateSchemaId и ещё несколько параметров.

OpenDuplicatesSearchResultsUserTask.OpenerInstanceId = Page.Process.InstanceUId;
OpenDuplicatesSearchResultsUserTask.PageUId = duplicateSearchResultsPageUId;
OpenDuplicatesSearchResultsUserTask.UseCurrentActivePage = true;
OpenDuplicatesSearchResultsUserTask.PageParameters = new Dictionary<string, string>() {
	{"SchemaId", SearchForDuplicatesUserTask.SchemaId.ToString()},
	{"DuplicateSchemaId", SearchForDuplicatesUserTask.DuplicateSchemaId.ToString()},	
	{"EditPageId", SearchForDuplicatesUserTask.EditPageId.ToString()},
	{"RecordId", SearchForDuplicatesUserTask.RecordId.ToString()},
	{"DataKey", DataKey}
};
OpenDuplicatesSearchResultsUserTask.CloseMessage = "DuplicateResultsPageClosed";
		public virtual bool ChildInitScriptTaskExecute(ProcessExecutingContext context) {
			if (!Ext.IsAjaxRequest) {
	(Page.AspPage as UI.Core.Page).InitializeProfile(new ProfileKeyEventArgs());
	SchemaId = Guid.Parse(Page.GetParameterValue("SchemaId").ToString());
	DuplicateSchemaId = Guid.Parse(Page.GetParameterValue("DuplicateSchemaId").ToString());	
	EditPageId = Guid.Parse(Page.GetParameterValue("EditPageId").ToString());
	RecordId = Guid.Parse(Page.GetParameterValue("RecordId").ToString());
	DataKey = Page.GetParameterValue("DataKey").ToString();	
	Page.Grid.PageInstance.Process.SetPropertyValue("SchemaId", SchemaId);
	Page.Grid.PageInstance.Process.SetPropertyValue("DuplicateSchemaId", DuplicateSchemaId);	
	Page.Grid.PageInstance.Process.SetPropertyValue("EditPageUId", EditPageId);
	Page.Grid.PageInstance.Process.SetPropertyValue("DataKey", DataKey);
	Page.Grid.PageInstance.Process.SetPropertyValue("RecordId", RecordId);
}
return true;
		}

Александр, добрый день.
При нажатии на кнопку запускаю БП.
В БП написала такой код и открываю страницу:

var ReportSchemaUId = "56a4f892-df6b-4dac-99ad-762f56553035";//Базовая страница реестра взаимосвязей
var EntitySchemaUId = "533e9db5-b10c-44a9-bbef-168af653d2d5";//Взаимосвязь
var openerInstanceId = "8409eced-ba37-4a6a-a031-671fcb7be3e2";//Взаимосвязь (представление)
 
var EntitySchema = UserConnection.EntitySchemaManager.GetInstanceByName("Relationship");
Guid ContactId = ReadDataUserTask2.ResultEntity.GetTypedColumnValue<Guid>("ContactId");
 
var parameters = new Dictionary<string, string> {
    {"openerInstanceId", EntitySchemaUId},
	{"contactAId", ContactId.ToString()}
};
RelationUserTask.PageParameters = parameters;
Guid clientDocumentGridPageUId = new Guid("56a4f892-df6b-4dac-99ad-762f56553035");
RelationUserTask.PageUId = clientDocumentGridPageUId;
RelationUserTask.Centered = true;
RelationUserTask.CloseOpenerOnLoad = false;

Далее на Базовой странице реестра взаимосвязей добавила код на событие PageLoadComplete:

			Page.TreeGrid.Clear();
 
				  try
            {
			Guid contactAId = Guid.Parse(Page.Request.QueryString["contactAId"]);
			Guid sysSchemaEntity = Guid.Parse(Page.Request.QueryString["openerInstanceId"]);			
 
			Page.Label1.Caption=contactAId.ToString();
                var opportunityFilter = Page.DataSource.CurrentStructure.CreateIsNullFilter(Page.DataSource.Schema, "ContactA");
                Page.DataSource.CurrentStructure.Filters.Add(opportunityFilter);
                    var applicationFilter = Page.DataSource.CurrentStructure.CreateFilterWithParameters(Page.DataSource.Schema, FilterComparisonType.Equal,
                    "ContactA", contactAId);
                    Page.DataSource.CurrentStructure.Filters.Add(applicationFilter);                          
            }
            catch
            {
 
            }
            Page.DataSource.LoadRows();
           Page.TreeGrid.RefreshData();

Что получилось:
При нажатии на кнопку открывается страница реестра взаимосвязей.
Далее нажимаю на ней на кнопку Добавить - Контакт и тут происходит свал системы.

Exception Message: Object reference not set to an instance of an object.
Exception Type: System.NullReferenceException
Exception Source: TSBpm
 
Exception Stack Trace:
   at Terrasoft.WebApp.BaseRelationshipEditPageEventsProcess`1.ScriptTask1Execute(ProcessExecutingContext context)
   at Terrasoft.Core.Process.ProcessScriptTask.InternalExecute(ProcessExecutingContext context)
   at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)

Что я не доделала или сделала не так? Как исправить?

Где-то внутри ScriptTask1Execute в функцию вместо объекта попадает null. Нужно отлаживаться, чтобы понять, где именно.

Я посмотрела не хватает для полноценной работы параметров:

var ParentEntityId = Guid.Parse(Page.Request.QueryString["ParentEntityId"]);
var MainEntitySchemaId = Guid.Parse(Page.Request.QueryString["MainEntitySchemaId"]);
var ParentEntitySchemaId = Guid.Parse(Page.Request.QueryString["ParentEntitySchemaId"]);

В БП я их определила и передаю, на странице реестра взаимосвязей они тоже подхватываются.
А как передать их на страницу редактирования взаимосвязи?

Тоже через параметры. При стандартной логике кнопки «Добавить» и «Изменить» на странице реестра открывают окна-карточки при помощи JS, формируемого в функции GetRegisterAddPageScript и ей подобных.

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