Еще одна полезная штука.
В данном случае решением будет создание отдельной функции инициализации и обновления информации на детали, которая будет передавать нужный фильтр.
Откройте wnd_ContactsWorkspace и добавьте в него контейнер страницы pgContactContractsDetail а в нее контейнер окна wndContactContractsDetail. Унаследуйте wndContactContractsDetail от wnd_ContractsGridArea.
Откройте wnd_ContactsWorkspaceScript и добавьте в него следующий программный код:
В функцию function RefreshDetails:
Необходимо добавить следующий программный код:
RefreshContactContractsDetail();
} else
В конец скрипта:
ContactsWorkspace.ContactContractsWindow = wndContactContractsDetail.Window;
var DetailWindow = ContractsWorkspace.ContactContractsWindow;
SetAttribute(DetailWindow, 'DatasetUSI', 'ds_Trained');
SetAttribute(DetailWindow, 'EditWindowUSI', 'wnd_TrainedEdit');
SetAttribute(DetailWindow, 'ParentItemFieldName', 'ContactID');
DetailWindow.Prepare();
ContactsWorkspace.ContactContractsDataset =
DetailWindow.ComponentsByName('dlData').Dataset;
}
function RefreshContactContractsDetail() {
if (ContactsWorkspace.InitializeContactContractsFlag != true) {
InitializeContactContractsDetail();
ContactsWorkspace.InitializeContactContractsFlag = true;
}
var ContactID = BaseWorkspace.GridDataset.ValAsGUID('ContactID');
if (ContactID == ContactsWorkspace.ContactContractsOldContactID) {
return;
} else {
ContactsWorkspace.ContactContractsOldContactID = ContactID;
}
RefreshDetailData(BaseWorkspace.GridDataset, 'ContactID',
ContactsWorkspace.ContactContractsDataset, 'ContactID');
}
Обратите внимание, в этом случае родительская запись тоже попадет в список, т.к. попадает в критерий фильтрации.
Для устранения данной проблемы можно в конце функции RefreshContactContractsDetail() добавить следующий дополнительный фильтр:
ContactsWorkspace.ContactContractsDataset.Close();
ContactsWorkspace.ContactContractsDataset.Open();
Приятной работы!
С уважением,
Белецкий Арсений
Группа компаний Terrasoft
Нравится
а почему у вас везде ContractsWorkspace, хотя речь идет о разделе контактов?
Может кому понадобится, на основе первого поста.
Создание вкладки "Договоры" в карточке контрагента:
В wnd_AccountEdit:
- добавить Page pgContracts
- добавить форму frmContracts
- добавить контейнер cntContracts
- Контейнеру cntContractsпрописал атрибут Window wnd_ContractsGridArea
К скрипту scr_AccountEdit:
- Добавил используемый скрипт scr_WorkspaceUtils - это я сделал в рамках другой задачи и не проверял результат без него.
- Добавил в функцию wnd_AccountEditOnPrepare(Window)
InitializeAccountContractsDetail(); RefreshContractsDetail();
- Добавил функцию
function InitializeAccountContractsDetail(){ AccountEdit.AccountContractsWindow = cntContracts.Window; var DetailWindow = AccountEdit.AccountContractsWindow; SetAttribute(DetailWindow, 'DatasetUSI', 'ds_Contract'); SetAttribute(DetailWindow, 'EditWindowUSI', 'wnd_ContractsGridArea'); SetAttribute(DetailWindow, 'ParentItemFieldName', 'ID'); SetAttribute(DetailWindow, 'ChildFilterName', 'CustomerID'); SetAttribute(DetailWindow,'AddSelfReference',true); DetailWindow.Prepare(); AccountEdit.AccountContractsDataset = DetailWindow.ComponentsByName('dlData').Dataset; }
- Добавил функцию
function RefreshContractsDetail() { if (AccountEdit.InitializeContactContractsFlag != true) { InitializeAccountContractsDetail(); AccountEdit.InitializeContactContractsFlag = true; } var BaseWorkspace = {GridDataset: dlData.Dataset}; var CustomerID = BaseWorkspace.GridDataset.ValAsGUID('ID'); if (CustomerID == AccountEdit.ContactContractsOldContactID) { return; } else { AccountEdit.ContactContractsOldContactID = CustomerID; } RefreshDetailData(BaseWorkspace.GridDataset, 'ID', AccountEdit.AccountContractsDataset, 'CustomerID'); }