5.x

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

Добрый день.
В БП по сигналу мне бы хотелось, чтобы открывалась страница реестра Взаимосвязей.
Каким образом мне правильно сделать, чтобы туда передавался контакт в 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.
вот пример кода:
[csharp]
var ReportSchemaUId = "56a4f892-df6b-4dac-99ad-762f56553035";//Базовая страница реестра взаимосвязей
var EntitySchemaUId = "8409eced-ba37-4a6a-a031-671fcb7be3e2";

Guid ContactId = ReadDataUserTask2.ResultEntity.GetTypedColumnValue("ContactId");
RelationUserTask.OpenerInstanceId = InstanceUId;
RelationUserTask.PageUId = new Guid("56a4f892-df6b-4dac-99ad-762f56553035");
var parameters =
new Dictionary {
{"ContactAId", ContactId.ToString()},
{"DataSourceUId", EntitySchemaUId.ToString()},
{"TreeGridId", EntitySchemaUId.ToString()}//,
};

RelationUserTask.PageParameters = parameters;

RelationUserTask.Centered = true;
RelationUserTask.CloseOpenerOnLoad = false;

var SelectedActiveRows = new List();
SelectedActiveRows.Add(new Guid(DocumentId.ToString()));

var selectedRows = new Dictionary();
selectedRows.Add("Item1", "Contact");
selectedRows.Add("Item2", "Id");
selectedRows.Add("Item3", SelectedActiveRows);
UserConnection.SessionData[EntitySchemaUId.ToString() + "_SelectedActiveRows"] = selectedRows;

[/csharp]

В каком угодно, это зависит от реализации.
Главное, внутри его потом вычитать и использовать в логике страницы.
Для примера посмотрите, как из AccountEditPage в DuplicatesSearchResultModulePage передаются DuplicateSchemaId и ещё несколько параметров.
[csharp]
OpenDuplicatesSearchResultsUserTask.OpenerInstanceId = Page.Process.InstanceUId;
OpenDuplicatesSearchResultsUserTask.PageUId = duplicateSearchResultsPageUId;
OpenDuplicatesSearchResultsUserTask.UseCurrentActivePage = true;
OpenDuplicatesSearchResultsUserTask.PageParameters = new Dictionary() {
{"SchemaId", SearchForDuplicatesUserTask.SchemaId.ToString()},
{"DuplicateSchemaId", SearchForDuplicatesUserTask.DuplicateSchemaId.ToString()},
{"EditPageId", SearchForDuplicatesUserTask.EditPageId.ToString()},
{"RecordId", SearchForDuplicatesUserTask.RecordId.ToString()},
{"DataKey", DataKey}
};
OpenDuplicatesSearchResultsUserTask.CloseMessage = "DuplicateResultsPageClosed";
[/csharp]
[csharp]
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;
}
[/csharp]

Александр, добрый день.
При нажатии на кнопку запускаю БП.
В БП написала такой код и открываю страницу:
[csharp]
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("ContactId");

var parameters = new Dictionary {
{"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;
[/csharp]
Далее на Базовой странице реестра взаимосвязей добавила код на событие PageLoadComplete:
[csharp]
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();
[/csharp]

Что получилось:
При нажатии на кнопку открывается страница реестра взаимосвязей.
Далее нажимаю на ней на кнопку Добавить - Контакт и тут происходит свал системы.
[csharp]
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)
[/csharp]
Что я не доделала или сделала не так? Как исправить?

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

Я посмотрела не хватает для полноценной работы параметров:
[csharp]
var ParentEntityId = Guid.Parse(Page.Request.QueryString["ParentEntityId"]);
var MainEntitySchemaId = Guid.Parse(Page.Request.QueryString["MainEntitySchemaId"]);
var ParentEntitySchemaId = Guid.Parse(Page.Request.QueryString["ParentEntitySchemaId"]);
[/csharp]
В БП я их определила и передаю, на странице реестра взаимосвязей они тоже подхватываются.
А как передать их на страницу редактирования взаимосвязи?

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

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