В разделе создаю еще одну Page, прикручиваю WindowContainer и подставляю в него еще один реестр (это уже другая таблица), но детали инициализируются данными из того реестра, который был создан раньше, т.е., например, при попытке загрузить файл, ParentItemID имеет значение из таблицы первого реестра. Как инициализировать детали при переключении с одной Page на другую? мне достаточно одной детали - Файлы...
Нравится
Если я правильно поняла Вашу проблему, то возможно, Вы неправильно прописали рефреш детали и в скрипте остались ссылки на предыдущий реестр.
как узнать? найдите в скрипте раздела строчки, похожие на эти (в разных версиях ТС и разных разделах может быть по-разному). обычно это функция RefreshDetails():
else if (pcDetails.ActivePage.Name == pgProjectsInInvoiceDetail.Name) { //debugger; RefreshCommonDetail(BaseWorkspace, wndProjectsInInvoiceDetail, 'InvoiceID', 'InvoiceID'); }
здесь
pgProjectsInInvoiceDetail -- название компонента Page Вашей детали,
wndProjectsInInvoiceDetail -- название компонента Виндов Вашей детали
InvoiceID -- фильтры, по которым фильтруются данные на детали (обычно созвучно с названием раздела).
детали ведь фильтруются по одной записи (причем таблицы соединяются иннер-джойном), а Вы хотите сделать по двум записям (с одного раздела и с другого).
не знаю, возможно ли сделать "2 раздела в одном" -- но можно сделать "2 детали в одной" -- может, это Вам больше подойдет?
Опишу подробней, вдруг Вам пригодится.
например, у раздела "Счета" есть деталь "Проекты в счете". есть еще деталь "Задачи в счете". но нужно, чтобы отображались еще задачи по конкретному проекту в счете -- тогда добавляем еще один виндовс контейнер в Page для проектов + прописываем обычный рефреш для обоих деталей. а потом на событии OnSelectionChange грида Проектов пишем код для фильтрации датасета задач по проектИД:
function grdDataOnSelectionChange(DataGrid) { //debugger var TaskWindow = Self.ParentContainer.ParentWindow.ComponentsByName('wndTasksInProject').Window; var Dataset = TaskWindow.ComponentsByName('dlData').Dataset; if (DataGrid.SelectedIDs.Count) { var ProjectID = DataGrid.Datasetlink.Dataset('ProjectID'); Dataset.Close(); ApplyDatasetFilter(Dataset, 'ProjectID', ProjectID,true); Dataset.Open(); TaskWindow.Attributes('ProjectID') = ProjectID; } }
последняя строчка (запись проджектИД в атрибуты окна) -- для того, чтобы при добавлении задачи с этой детали поле "проект" заполнялось автоматически.
так. жара спала -- и, перечитав еще раз вопрос, до меня 1) дошел его смысл и 2) даже нарисовалась идея. но только идея -- нужно все равно детальней изучать задачу.
В общем, если абстрагироваться -- то на детали при переключении между записями в основном реестре происходит фильтрация датасета по ИД записи, на которую мы переключились. то есть: закрытие датасета, 2) наложения фильтра "записьИД" 3) открытие датасета. то есть, теоретически, можно прописать свой рефреш для детали, в зависимости от активной страницы (в общих чертах: если пейдж1 -- рефреш по записям реестра1 (причем всех деталей, по идее), иначе -- рефреш по записям второго реестра).
теперь про файлы. там вообще отдельная история. судя по коду
if (pcDetails.ActivePage.Name == pgFilesDetail.Name) { RefreshFilesDetail(BaseWorkspace, wndFilesDetail, 'InvoiceID', 'tbl_FileInInvoice', 'iq_FileInInvoice'); } else
то у них рефреш немного другой (да и функционал добавления, редактирования и хранения тоже специфический) -- значит, нужно тоже прописать его аналогично, только подставив соответствующие сервисы (если их нет -- нужно создавать по аналогии с уже существующими для других разделов).
как узнать, какая страница активна? по свойству ActivePage компонеты pcData. примерный код:
switch (pcData.ActivePage) { case 'grid1': //рефреш 1 break; case 'grid2': //рефреш 2 break; }
надеюсь, мой ответ хоть немного Вам поможет.