Создание детали Договор в разделе Контакты

Еще одна полезная штука.

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

Откройте wnd_ContactsWorkspace и добавьте в него контейнер страницы pgContactContractsDetail а в нее контейнер окна wndContactContractsDetail. Унаследуйте wndContactContractsDetail от wnd_ContractsGridArea.

Откройте wnd_ContactsWorkspaceScript и добавьте в него следующий программный код:

В функцию function RefreshDetails:
Необходимо добавить следующий программный код:

 if (pcDetails.ActivePage.Name == pgContactContractsDetail.Name){
                   RefreshContactContractsDetail();
         } else

В конец скрипта:

function InitializeContactContractsDetail() {
         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() добавить следующий дополнительный фильтр:

ApplyDatasetFilter(ContactsWorkspace.ContactContractsDataset, 'NotID', BaseWorkspace.GridDataset.ValAsGUID('ID'), true);
    ContactsWorkspace.ContactContractsDataset.Close();
    ContactsWorkspace.ContactContractsDataset.Open();

Приятной работы!

С уважением,
Белецкий Арсений
Группа компаний Terrasoft

Нравится

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

а почему у вас везде 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');
    }

Андрей, спасибо за полезную реализацию!

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