Нажимаю в WorkSpace запись в гриде. Должна обновляться новая вкладка в детализации. Нужно событие где я могу получить ID выделенной записи и доступ к окну на вкладке детализации. В принципе можно с события грида писать что то наподобие: ParentWindow.ParentWindow.ComponentsByName('').ComponentsByName('')... - пока не смог прописать цепочку вызовов.

Нравится

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

Михаил, чтобы получить доступ к workspace из грида, то так

var MainWindow = Connector.Attributes('MainWindow');
var WorkspaceWindow = MainWindow.ComponentsByName('wndWorkspace').Window;

Но судя по вопросу вы хотите что-то делать в окне детали в зависимости от того какая запись выбрана.
Грид вам поможет только при переключении на другую запись. А что будете делать если переключилась не запись, а была выбрана другая деталь или это не важно. Так что думаю, это лучше приписать в воркспейс в RefrehsDetails на нужную вам деталь. А получить ID выделенной записи из воркспейса можно так

var ID = wndGridData.Window.ComponentsByName('dlData').Dataset('ID');

В событие grdDataOnSelectionChange получаю я ID

var ID = wndGridData.Window.ComponentsByName('dlData').Dataset('ID');

а как дальше обратиться к окну детали? Как то так не получается:

DataGrid.ParentWindow.ParentWindow.wfmClient.pgTreeRequirement.pgTreeRequirement.wndTreeRequirement

Здравствуйте, Михаил!
Получение окна детали из окна реестра:

Self.Attributes('WorkspaceWindow').ComponentsByName('wndTasksDetail');

Получение ID первой из выделенных записей в реестре:

grdData.SelectedIDs.CommaText.split(',')[0];

Спасибо. Итоговый вариант:

var ID=DataGrid.SelectedIDs.CommaText.split(',')[0];
var wd=Self.Attributes('WorkspaceWindow').ComponentsByName('wndTreeRequirement');
var dlData= wd.Window.ComponentsByName('dlData');
ApplyDatasetFilter(dlData.Dataset, 'ChangeRequestID', ID, true);
dlData.Dataset.Open();

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

if (pcDetails.ActivePage.Name == pgTreeRequirementDetail.Name) { //где pgTreeRegurementDetail - название страницы детали
	RefreshCommonDetail(BaseWorkspace, wndTreeRequirement, 
			'ChangeRequestID', 'ChangeRequestID'); //где один 'ChangeRequestID' - это название фильтра, а другой это родительское поле(т.е. поле которое связано с ID на гриде)
}

Если же у вас дальше идут какие-то манипуляции, то я не знаю зачем переоткрывать датасет.

Да, так совсем хорошо. А что там с переоткрытием Dataset? Не переоткрывается соединение?
RefreshCommonDetail - вшито в ядро -( так что еще вопрос что там происходит

function RefreshCommonDetail не в ядре, а находится в scr_WorkspaceUtils.
Фактически она также переоткрывает датасет, но там стоит много каких-то проверок.
Думаю не просто так разрабы ее создали, но если ваш вариант вас устраивает, то используйте его.

Михаил, чтобы датасет всегда переоткрывался при переходе к детали, задайте для функции function RefreshCommonDetail параметр AlwaysRefresh. Пример:

RefreshCommonDetail(BaseWorkspace, wndTreeRequirement, 
                        'ChangeRequestID', 'ChangeRequestID', null, null, null, true);

"Сазанов Александр Владимирович" написал:

function RefreshCommonDetail не в ядре, а находится в scr_WorkspaceUtils.

Фактически она также переоткрывает датасет, но там стоит много каких-то проверок.

Думаю не просто так разрабы ее создали, но если ваш вариант вас устраивает, то используйте его.


Хм, это террасофт меня в заблуждение ввел. Кликнул по функции, переход не произошел. А вот если открыть scr_WorkspaceUtils и там на вызов кликнуть то переход происходит на определение.

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

Коллеги, добрый день.

Вопрос: как происходит (должна происходить) инициализация нового раздела?

Почему возник вопрос:
Террасофт не запущен, в прошлом сеансе был открыт раздел "Документы", деталь "Контакты".
Запускаем Террасофт.
В детали в ActionMenuItem есть пункт "Контакт" (т.е. перейти к контакту).
Переходим к контакту. При этом профайлером отслеживаем, что происходит...
А происходит вот что:
-Достаются из БД сервисы раздела - все ОК
при этом вызываются методы (Call Stack):
ShowGroupWorkspace
ShowWorkspace
GotoWorkspace
GotoWorkspaceByReferenceInfo
GotoWorkspaceByActionMenuItem
GotoReference

Приведу как выглядит последний метод:

var WorkspaceWindow = PrepareWorkspace(GroupCode, WorkspaceUSI, AddHistory,
ActivateMainPage);
if (IsEmptyValue(IDDataFieldValue)
|| (Assigned(IDDataFieldValue) && IsEmptyArray(IDDataFieldValue))) {
return;
}
System.BeginProcessing();
try {
FilterWorkspace(WorkspaceWindow, IDDataFieldValue)
} finally {
System.EndProcessing();
}

Что происходит с запросами к базе:
1) PrepareWorkspace - выбирает ПРОИЗВОЛЬНЫЕ контакты (в соответствии с настройкой сортировки + настройкой числа строк), которые мне в общем то НЕ НУЖНЫ. (в моем случае 40 записей)

2) Происходит запрос с выборкой НУЖНОГО мне 1 контакта в FilterWorkspace(WorkspaceWindow, IDDataFieldValue)

Не кажется что это слегка не логично?
Возможно я что-то не доглядел и нужно копать глубже, в методы обработки событий Workspace
Но зачем вытаскивать из базы 40 "левых" записей перед тем, как показать 1 нужную... вот это мне непонятно...

Возможно это ошибка кастомизации, пожэтому хотелось бы узнать, как это происходит в коробке...

Спасибо!

Нравится

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

Здравствуйте,
Так как "Перейти к" разделу и выделить запись, это дополнительная возможность, предварительно нужно проинициализировать раздел.
Одним из этапов начальной инициализации раздела является выбор данных реестра согласно фильтрам и сортировке, которые были предварительно настроены в разделе.
Так как в нашем случае клиент Террасофта не был запущен, пройдет инициализация, и выбор записей, после чего применится фильтр , по записи с грида c которой мы переходим.
Если бы раздел, в который мы переходим, уже открывался до этого, лишнего запроса не было бы.

Алексей,

Спасибо за ответ, возможно в этом поведении приложения есть смысл... но не тогда, когда мы знаем ID-ники записей, которые хотим выбрать.
Хорошо, попробуем поработать над этим.

На данный момент, со стороны технической поддержки Terrasoft, нужны ли какие либо действия?

Спасибо, Алексей,

Думаю что нет, я просто хотел узнать как это работает в коробочной версии.
Если возникнут сложности с переделкой стандартного поведения, то непременно обращусь!

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