требуется создать деталь для контактов - "Подчиненные"
подчиненные контактов и есть контакты. Для решения задачи были проделаны шаги:

1. создана таблица определения подчиненного\руководителя
ID
ManagerID - id руководителя
SubContactID - id подчиненного
WorkFrom - время начала подчинения
WorkTo - время окончания подчинения
,а так же в таблицу tbl_Contacts были добавлены 2 поля
с указанием распределения процентов от продажи - ManagerPercent, SubContactPerent

2. Запрос на выборку подчиненных выбранного контакта в реестре:
SELECT
*
FROM
[dbo].[tbl_Contact] AS [tbl_Contact]
LEFT OUTER JOIN
[dbo].[tbl_Account] AS [tbl_Account] ON [tbl_Account].[ID] = [tbl_Contact].[AccountID]
WHERE([tbl_Contact].[ID] =
(SELECT
[tbl_SubContact].[SubContactID] AS [SubContactID]
FROM
[dbo].[tbl_SubContact] AS [tbl_SubContact]
WHERE([tbl_SubContact].[ManagerID] = :ContactID)))

3. датасет с полями
(tbl_Contact) ContactID
(tbl_Contact) Name
(tbl_Contact) Communication
(tbl_Account) AccountName

4. окно wnd_SubContactGridArea на основе wnd_BaseGridArea
5. окно wnd_SubContactEdit на основе wnd_BaseDBEdit (его пока особо не трогал)
6. Добавил деталь "Подчиненные"
pgSubContactDetail -> fmSubContactDetailWindow ->
-> wndSubContactDetail(window=wnd_SubContactGridArea)

7. внес изменения в скрипт wnd_SubContactGridAreaScript
function Initialize(Window) {
SetAttribute(Window, 'EditWindowUSI', 'wnd_SubContactEdit');
}

function wnd_SubContactGridAreaOnPrepare(Window) {
Initialize(Window);
wnd_BaseGridAreaOnPrepare(Window);
}

8. в скрипт scr_ContactsWorkspase в функцию RefreshDetails добавил
...
} else
if (pcDetails.ActivePage.Name == pgSubContactDetail.Name) {
//ShowInformationDialog("it's work");
RefreshCommonDetail(BaseWorkspace, wndSubContactDetail, 'ContactID',
'ContactID');
} //

Делал, заглядывая в пост https://community.terrasoft.ua/forum/topic/5445, и др.
При выборе созданной детали она пуста. Подскажите что я сделал не так?

Нравится

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

В окне wnd_SubContactGridArea не доглядел свойство ActiveView, установил его - вроде заработало, однако тут же возникла проблема, при попытке изменить данные в основном реестре таблицы tbl_Contact (любой контакт) из программы или из субд пишет ошибку - "в триггерах INSTEAD OF не поддерживается прямая рекурсия", не могу понять откуда она взялась. Жду совета мастера.

А почему у Вас в запросе на выборку идет фильтр сравнения по ID?
WHERE([tbl_Contact].[ID] = ...
Не правильнее ли IN фильтр? Выбираем тех контактов, ID которых находятся среди тех ID, руководитель которых выбран в параметр.
Измените. Если проблема не устраниться проверьте профайлером, какой именно запрос вызывает ошибку.

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

Этот запрос работает корректно, выдает всех подчиненных заданного контакта,
деталь отображает подчиненных выбранного в реестре контакта.
SELECT
[tbl_Contact].[ID] AS [ContactID],
[tbl_Contact].[Name] AS [Name],
[tbl_Contact].[AccountID] AS [AccountID],
[tbl_Contact].[Communication1] AS [Communication1],
[tbl_Contact].[ManagerPercent] AS [ManagerPercent],
[tbl_Contact].[SubContactPercent] AS [SubContactPercent],
[tbl_Account].[Name] AS [AccountName],
[tbl_SubContact].[WorkFrom] AS [WorkFrom],
[tbl_SubContact].[WorkTo] AS [WorkTo],
[tbl_SubContact].[ID] AS [SubContactID]
FROM
[dbo].[tbl_Contact] AS [tbl_Contact]
LEFT OUTER JOIN
[dbo].[tbl_Account] AS [tbl_Account] ON [tbl_Account].[ID] = [tbl_Contact].[AccountID]
INNER JOIN
[dbo].[tbl_SubContact] AS [tbl_SubContact] ON [tbl_SubContact].[SubContactID] = [tbl_Contact].[ID]
WHERE([tbl_SubContact].[ManagerID] = :ContactID)

Но никак не могу разобраться с формой редактирования, создал в ней 3 необходимых поля:
фио подчиненного (lookupDataControl) поле справочника Contact.Name
в подчинении ОТ (DateTimeDataControl) поле даты SubContact.WorkFrom
в подчинении ДО (DateTimeDataControl) поле даты SubContact.WorkTo
+ нужно учитывать изменение идентификаторов подчиненного и руководителя в таблице tbl_SubContact
(ID
ManagerID - id руководителя
SubContactID - id подчиненного
WorkFrom - время начала подчинения
WorkTo - время окончания подчинения)

пробовал дописать скрипт по аналогии с уже существующими, так же сравнивал с форумом,
положительного результата пока не добился, подскажите пожалуйста с чего начать, что не так?
пока полного понимания кода нет.

//-----------------------------------------------------------------------------
// wnd_SubContactEditScript
//-----------------------------------------------------------------------------
var SubContactEdit = new Object(); //по сути здесь ds_SubContact
 
function wnd_SubContactEditOnPrepare(Window) {
	Initialize();
    wnd_BaseDBEditOnPrepare(Window); 
}
 
// initialization
function InitializeGlobalVariables() {
    SubContactEdit.ParentItemFieldName = 'ContactID';
    SubContactEdit.ParentItemID = GetAttribute(Self, 'ParentItemID');
    BaseDBEdit.RecordID = GetAttribute(Self, 'RecordID');                          
    BaseDBEdit.RefreshedDataset = GetAttribute(Self, 'RefreshedDataset');
}
function InitializeDataset() {
    SubContactEdit.Dataset = dlData.Dataset; 
}
function Initialize() {
    InitializeGlobalVariables();
    InitializeDataset();
}  
 
 
function SetParentItemID() {
    var ContactIDField = SubContactEdit.Dataset.DataFields.ItemsByName('SubContactID');
    ContactIDField.Value = SubContactEdit.ParentItemID;
}
 
function dlDataOnDatasetAfterAppend(Dataset) {
    SetParentItemID();
}
 
function dlDataOnDatasetAfterPost(Dataset) {
    if (!Assigned(SubContactEdit.ContactDataset)) {
        SubContactEdit.ContactDataset = Services.GetNewItemByUSI('ds_SubContact');
        }
    var ContactDataset = SubContactEdit.ContactDataset;
    ContactDataset.Open();
    ContactDataset.Locate('ID', SubContactEdit.ParentItemID);
    ContactDataset.Edit();
    ContactDataset.DisableEvents();
    ContactDataset.Post();
    ContactDataset.EnableEvents();     
}

По вопросу создания include фильтра можете посмотреть на ответ здесь
Уточните, пожалуйста, что у Вас не так с карточкой редактирования?

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

вот последний код скрипта:

//-----------------------------------------------------------------------------
// wnd_SubContactEditScript
//-----------------------------------------------------------------------------
var SubContactEdit = new Object(); //по сути здесь ds_SubContact
 
function wnd_SubContactEditOnPrepare(Window) {
	Initialize();
    wnd_BaseDBEditOnPrepare(Window); 
}
 
// initialization
function InitializeGlobalVariables() {
    SubContactEdit.ParentItemFieldName = 'ContactID';
    SubContactEdit.ParentItemID = GetAttribute(Self, 'ParentItemID');
    BaseDBEdit.RecordID = GetAttribute(Self, 'RecordID');                          
    BaseDBEdit.RefreshedDataset = GetAttribute(Self, 'RefreshedDataset');
}
function InitializeDataset() {
    SubContactEdit.Dataset = dlData.Dataset; 
}
function Initialize() {
	InitializeDataset();
    InitializeGlobalVariables();
}  
 
//           
function SetParentItemID() {
    var ContactIDField = SubContactEdit.Dataset.DataFields.ItemsByName('ContactID');
    ContactIDField.Value = SubContactEdit.ParentItemID;
}
 
function dlDataOnDatasetAfterAppend(Dataset) {
    SetParentItemID();
}
 
function dlDataOnDatasetAfterPost(Dataset) {
    if (!Assigned(SubContactEdit.ContactDataset)) {
        SubContactEdit.ContactDataset = Services.GetNewItemByUSI('ds_SubContact');
        }
    var ContactDataset = SubContactEdit.ContactDataset;
    ContactDataset.Open();
    ContactDataset.Locate('ID', SubContactEdit.ParentItemID);
    ContactDataset.Edit();
    ContactDataset.DisableEvents();
    ContactDataset.Post();
    ContactDataset.EnableEvents();     
}

Проверьте следующее:

  1. в датасете ds_SubContact запрос на выборку, в котором данные берутся из таблицы tbl_SubContact
  2. в даталинке окна должен быть датасет ds_SubContact

Если у Вас не определен обработчик OKOnClick, то вызывается базовый обработчик, который пишет в датасет прикрепленного к карточке даталинка. Могу порекомендовать использовать отладчик (debugger инициирует останов на отладку) - это то, что делал бы я в такой ситуации. Если не получится разобраться, пишите письмо на support@tscrm.com. Потребуются сервисы карточки и все связанные с ней (sq, tbl, доработанные сервисы).

1.
В том то и дело, что данные в запросе sq_SubContact должны браться из таблицы tbl_Contact, объединенные с таблицей tbl_SubContact т.к. подчиненные контакта - есть контакты. Таблица tbl_SubContact служит для определения связей между подчиненными и руководителями. Не понимаю как дать понять ядру что вставка нужна в таблицу tbl_SubContact

2.
в даталинке установлен ds_SubContact

привожу код wnd_SubContactGridAreaScript

//-----------------------------------------------------------------------------
// wnd_SubContactGridAreaScript
//-----------------------------------------------------------------------------
 
function Initialize(Window) {
    SetAttribute(Window, 'EditWindowUSI', 'wnd_SubContactEdit');
    SetAttribute(Window, 'ParentItemFieldName', 'ContactID'); // id of main grid
}
 
//-----------------------------------------------------------------------------
// Event handlers
//-----------------------------------------------------------------------------
 
function wnd_SubContactGridAreaOnPrepare(Window) {
    Initialize(Window); 
    wnd_BaseGridAreaOnPrepare(Window);
}
 
function btnAddOnClick(Control) { //
    var Attributes = GetAddDataAttributes(Self, BaseGridArea);
    var DefaultValues = GetNewDictionary();
    ShowEditWindowEx('wnd_SubContactEdit', Attributes, DefaultValues);
}

Откройте датасет, нажмите на тулбаре "Предпросмотр", увидите запросы на выборку, вставку и удаление. Скорее всего вставка и удаление идет в tbl_Contact. Для реализации того же для таблицы tbl_SubContact Вам нужно создать новый запрос на выборку и датасет, где уже главной таблицей будет таблица субконтактов. В sq_* Вы аналогично текущему sq_SubContact сделаете присоединение, но наоборот -- tbl_Contact к таблице tbl_SubContact. Соответственно функционал и логика останется, но запись будет идти в нужную таблицу.

Принцип понятен, сделал как вы сказали, итог:
добавилась запись в таблице tbl_SubContacts, однако в ней остались 2 незаполненных поля - ManagerID и SubContactID (логично, т.к. их нет в авто-сгенерированных запросах). Как полям присвоить необходимые значения ?

Эти поля нужно заполнять из карточки, которая открывается по добавлению записи на деталь. Механизм таков: новым запросом на выборку (с главной таблицей субконтактов) выбираются эти две колонки (ManagerID и SubContactID), а в датасете для них создаются поля справочников с указанием корректных датасетов для подстановки (предположительно ds_Manager и ds_Contact). После этого в карточке редактирования нужно добавить два поля справочника, которые будут связаны с этими полями датасета. Соответственно после заполнения их в карточке данные будут записаны в таблицу.

ManagerID - равен параметру :ContactID запроса на выборку sq_SubContact, или просто текущая запись реестра в момент нажатия кнопки "добавить".
SubContactID - равен ID записи, выбранной карточке редактирования в поле для выбора подчиненного (edtContact)

Оба поля берутся из tbl_Contact.ID, но разные, у меня не получилось сделать ManagerID и SubContactID редактируемыми тем способом, что указан выше.

В данный момент я пытаюсь сделать так:

//-----------------------------------------------------------------------------
// wnd_SubContactEditScript
//-----------------------------------------------------------------------------
var SubContactEdit = new Object(); //по сути здесь ds_SubContact
 
// initialization
function InitializeDataset() {
    SubContactEdit.Dataset = dlData.Dataset; // ds_SubContact
}
function InitializeGlobalVariables() {
    SubContactEdit.ParentItemFieldName = 'ContactID'; // для группы
    SubContactEdit.ParentItemID = GetAttribute(Self, 'ParentItemID'); // ParentItemID - выбранный в реестре id
    BaseDBEdit.RecordID = GetAttribute(Self, 'RecordID');                          
    BaseDBEdit.RefreshedDataset = GetAttribute(Self, 'RefreshedDataset');
}
function Initialize() {
	InitializeDataset();
    InitializeGlobalVariables();
}  
 
function SetParentItemID() {  
    var ContactIDField = SubContactEdit.Dataset.DataFields.ItemsByName('ContactID');
    ContactIDField.Value = SubContactEdit.ParentItemID; // ParentItemID - выбранный в реестре id   
}
 
//-----------------------------------------------------------------------------
// Event handlers
//-----------------------------------------------------------------------------
 
function wnd_SubContactEditOnPrepare(Window) {
	Initialize();
    wnd_BaseDBEditOnPrepare(Window); 
}  
 
function dlDataOnDatasetAfterAppend(Dataset) {
    SetParentItemID();
}
function dlDataOnDatasetBeforePost(Dataset, DoPost) {
    Dataset.DataFields.ItemsByName('ManagerID').Value = SubContactEdit.ParentItemID;
	Dataset.DataFields.ItemsByName('SubContactID').Value = '8C6AE091-B24D-42B2-BD2B-4AE2B72EDB8E'; //dlData.Dataset.DataFields.ItemsByName('ID').Value;
 
    debugger;
}

Проблема в обработчике dlDataOnDatasetBeforePost в строке
Dataset.DataFields.ItemsByName('SubContactID').Value = '8C6AE091-B24D-42B2-BD2B-4AE2B72EDB8E';
пишет что ошибка при установке значения параметра "8C6AE091-B24D-42B2-BD2B-4AE2B72EDB8E is not valid GUID value", однако такой гуид есть в таблице контактов, и целостность не должна нарушаться.

Так же я не знаю как правильно взять ID из поля выбранного подчиненного в карточке редактирования, чтобы подставить в параметр SubContactID, поэтому пробую с явным значением ID.
Поле ManagerID обновляется корректно.

Со значением ID: присваивайте в формате Value = '{GUID}' т.е. в фигурных скобках.
Чтобы выбирать в поле субконтакта значения из контактов нужно (что-то у Вас уже сделано, но напишу все по порядку):

  • в sq_ присоединить tbl_Contact к tbl_SubContact
  • в секции select выбрать колонку из tbl_SubContact, куда нужно писать ID субконтакта
  • также выбрать поле Name из tbl_Contact, присоедененной к tbl_SubContact по полю SubContactID
  • в датасете добавить lookup-колонку, указать поле для отображения - Name из предыдущего пункта, колонка - SubContactID, справочник - ds_Contact
  • в карточке должно быть добавлено поле типа LookupDataControl с указанием SubContactID в свойстве DataFieldName

При этом выбор в поле будет производиться из контактов, а сохраняться в поле SubContactID таблицы субконтактов. При этом это поле будет само записываться в таблицу, на DatasetBeforePost не обязательно его заполнять.
Обращаться к заданному субконтакту можно так, как Вы и делаете: Dataset.DataFields.ItemsByName('SubContactID').Value или даже несколько проще: Dataset.Values('SubContactID')

Как все интересно закручено :), Действительно у меня получилось сделать так как вы посоветовали, большое спасибо.

Однако возникает еще вопрос: не работают запросы на редактирование:
- удаление видит 0 выбранных элементов
- изменение вываливается в ChechAssign
- копирование жалуется что keyDataField is not assign, думаю проблема кокраз в нем

Подскажите пожалуйста где копать.

датасет:

---------------- SelectQuery ----------------
SELECT
	[tbl_Contact].[ID] AS [ContactID],
	[tbl_Contact].[Name] AS [Name],
	[tbl_Account].[ID] AS [AccountID],
	[tbl_Contact].[Communication1] AS [Communication1],
	[tbl_Contact].[ManagerPercent] AS [ManagerPercent],
	[tbl_Contact].[SubContactPercent] AS [SubContactPercent],
	[tbl_Account].[Name] AS [AccountName],
	[tbl_SubContact].[WorkFrom] AS [WorkFrom],
	[tbl_SubContact].[WorkTo] AS [WorkTo],
	[tbl_SubContact].[ID] AS [ID],
	[tbl_SubContact].[ManagerID] AS [ManagerID],
	[tbl_SubContact].[SubContactID] AS [SubContactID]
FROM
	[dbo].[tbl_SubContact] AS [tbl_SubContact]
LEFT OUTER JOIN
	[dbo].[tbl_Account] AS [tbl_Account] ON [tbl_Account].[ID] = [tbl_SubContact].[SubContactID]
INNER JOIN
	[dbo].[tbl_Contact] AS [tbl_Contact] ON [tbl_Contact].[ID] = [tbl_SubContact].[SubContactID]
WHERE([tbl_SubContact].[ManagerID] = :ContactID);
 
---------------- InsertQuery ----------------
INSERT INTO [dbo].[tbl_SubContact] ([WorkFrom], [WorkTo], [ID], [ManagerID], [SubContactID])
VALUES (:WorkFrom, :WorkTo, :ID, :ManagerID, :SubContactID);
 
---------------- UpdateQuery ----------------
UPDATE [dbo].[tbl_SubContact]
	SET [WorkFrom] = :WorkFrom,
	[WorkTo] = :WorkTo,
	[ManagerID] = :ManagerID,
	[SubContactID] = :SubContactID
WHERE([tbl_SubContact].[ID] = :ID);
 
---------------- DeleteQuery ----------------
DELETE FROM [dbo].[tbl_SubContact]
WHERE([tbl_SubContact].[ID] = :ID);

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

Какая ошибка на CheckAssigned? Посмотрите студией, какой стек вызова? (желательно в формате скрипт.функция.текст_строчки_вызова)

ошибка "Ошибка выполнения Microsoft JScript: Исключение брошено и не поймано"
scr_Common.CheckAssigned(Object, ObjectName)
Object=null ObjectName="Parameter"
ErrorMgs "Объект 'Parameter' не присвоен"

далее
ошибка "TSDskWindowLibrary.DskWindow: OLE error 80020101"
scr_WindowUtils.ShowEditWindowEx
EditWindow.Prepare();

Заодно хочу спросить по поводу удаления записей из родительской таблицы контактов - безопасно ли будет сделать связь FSubContactSubContactID (Contact.ID = SubContactID) каскадной? Или лучше все сделать руками?

По поводу каскадной связи - можно сделать каскадной, все должно отработать корректно.
По поводу ошибки - сложно в режиме форума сказать, что за параметр есть null. Напишите обращение с пометкой "Виталию", решим проблему.

отправил письмо на community@tscrm.com, жду ответа

Добрый день!
Успешно получили Ваше письмо и приступили к обработке.
Ждите ответ на свой e-mail.

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

извиняюсь за настойчивость, есть-ли какие нибудь идеи?

На данный момент ведутся работы. как только ошибка будет решена, мы Вам сразу сообщим.

// ### debug
 
в ходе отладки события вызова окна редактирования:
в ф-и ShowEditWindowEx:
 
EditWindow.Prepare();
wnd_SubContactPeriodsEditOnPrepare
   wnd_BaseDBEditOnPrepare
      ProcessBaseDBEditOnPrepare
         InitializeDBEdit() в строке 
	 BaseDBEdit.WorkflowDataFields = Attributes('WorkflowDataFields'); 
	 значение WorkflowDataFields = null - нормально ли это?
 
далее вызов EditRecord:
  OpenDatasetWithRecordID
    ApplyDatasetIDFilter(Dataset, ID, true); значения подаются норм
      ApplyDatasetFilter(Dataset, 'ID', IDValue, Enabled); значения ok
	ApplySelectQueryFilter(SelectQuery, FilterName, ParamValue, Enabled); значения ok
          EnableSelectQueryFilters(SelectQuery, Enabled, FilterCodes);
            цикл для EnableFilters (SelectQuery.Count = 1)
              EnableFilter
              if (FiltersNode.Code == FilterCode) { 
              //значение Code = ""
 
              после рекурсивного вызова 
              if (FiltersNode.Code == FilterCode) { 
              //FiltersNode.Code = "SubContactPeriods.ManagerID = Contact.ID", FilterCode = "ID"
 
              далее условие 
              if ((Assigned(FiltersNode.TestExpression)) && 
		(FiltersNode.TestExpression.ExpressionType == fetSelect)) {
              // TestExpression = "", ExpressionType = 1, fetSelect = 2
              по условию не срабатывает
              EnableSelectQueryFilters(
			FiltersNode.TestExpression.ExpressionSelectQuery, Enabled, 
			new Array(FilterCode));
 
              в итоге ф-я EnableFilter возвращает false
 
 
          SetParameterValue(SelectQuery.Parameters, FilterName, ParamValue); 
            var Parameter = Parameters.ItemsByName(ParamName);
            // после присваивания Parameter = null
            далее вываливаемся на CheckAssigned(Parameter, 'Parameter');
 
// ### code
 
вызов окна редактирования:
function btnEditOnClick(Control) {
    var Attributes = GetEditDataAttributes(Self, BaseGridArea);
    //var DefaultValues = GetNewDictionary();   
    ShowEditWindowEx('wnd_SubContactPeriodsEdit', Attributes/*, DefaultValues*/);
}
 
и: 
function wnd_SubContactPeriodsEditOnPrepare(Window) {
	Initialize();
	debugger;
    wnd_BaseDBEditOnPrepare(Window); // fail 
	edtSubContactPercent.DataField.ValAsFloat = 100;  // default value
} 

буду рад любым коментариям

Для ShowEditWindowEx нужно передавать в атрибуте RecordID значение ID той записи, для которой открывается карточка редактирования. Вы это делаете через вызов GetEditDataAttributes. Если свал происходит по наложению фильтра окна детали, но при этом все данные корректные аж до функции EnableSelectQueryFilters, то, возможно, ошибка кроется в запросе на выборку, точнее в фильтре. Какой параметр (ParamName) не находит? Есть ли он в запросе?
Что-то Вы не учли, и пока не видно, что именно...

В запросе всего 1 параметр: ContactID - UID, ввод
Единственный фильтр сравнения такой: [tbl_SubContact].[ManagerID] = :ContactID, фильтр включен

циклы по обработке параметров ходили по 1 разу.

Рекомендуется в запросе на выборку отключать фильтры сравнения, которые впоследствии будут включены через скрипты конфигурации. Хотя не думаю, что проблема именно в этом.

Виталий, я высылал вам код детали с неработающей кнопкой "Изменить" на почту, очень ждал какого-либо вердикта, есть ли у вас какие-то комментарии по поводу отправленных вам сервисов?

Владимир, в телефонном разговоре с Вами я сообщил (возможно не вполне исчерпывающе), что работаю над отдельным заданием, поэтому, к сожалению, не имею возможности подключиться к Вам или отрабатывать ошибку у себя. Перейду к решению проблемы, как только освобожусь. Прошу прощения за доставленные неудобства.

спасибо, буду ждать :)

Нашел в постах немного информации о редактировании записей детали (http://www.community.terrasoft.ua/forum/topic/5040), так же пользуясь готовыми сервисами, пытаюсь поправить наконец таки мой сервис.
Никак не могу понять как инициализируется объект BaseWorkspace, который присутствует во многих скриптах, при попытке использовать его я получаю - "'BaseWorkspace' - определение отсутствует", я не смог найти скрипта где увидел бы его инициализацию.
Подскажите где его брать, и может ли это быть основной проблемой?

к скрипту подключены:
scr_BaseGridAreaUtils
scr_DB
scr_Utils

//-----------------------------------------------------------------------------
// wnd_SubContactPeriodsGridAreaScript
//-----------------------------------------------------------------------------
 
var SubContactPeriodsGridArea = new Object();
 
function InitializeSubContactPeriodsDetail(Window) {
	debugger
    // Имя поля кода элемента, входящего в группу. (например для контактов ContactID); - название родительского поля
    SetAttribute(Window, 'ParentItemFieldName', 'ManagerID');  //ContactID
    SetAttribute(Window, 'EditWindowUSI', 'wnd_SubContactPeriodsEdit');
	SetAttribute(Window, 'DatasetUSI', 'ds_SubContactPeriods');
    SetAttribute(Window, 'WorkspaceDataset', BaseWorkspace.GridDataset); // <- 2 атрибута остаются без значений
    SetAttribute(Window, 'ParentItemID', BaseWorkspace.GridDataset.ValAsStr('ID'));
    /*SetAttribute(Window, 'WorkspaceDataset', 'ds_Contact');
    SetAttribute(Window, 'ParentItemID', 'ID');*/
}
 
function Initialize(Window) {    
    SubContactPeriodsGridArea.DatasetUSI = GetAttribute(Window, 'DatasetUSI');
	SubContactPeriodsGridArea.WorkspaceDataset = GetAttribute(Window, 'WorkspaceDataset');
}
 
function EditData() {
	var Attributes = GetEditDataAttributes(Self, BaseGridArea);		
	Attributes.Add('DatasetUSI', SubContactPeriodsGridArea.DatasetUSI);
	Attributes.Add('WorkspaceDataset', SubContactPeriodsGridArea.WorkspaceDataset);
	ShowEditWindowEx(BaseGridArea.EditWindowUSI, Attributes);	
}
 
function AddData() {
	var Attributes = GetAddDataAttributes(Self, BaseGridArea);
    var DefaultValues = GetNewDictionary();   
    ShowEditWindowEx('wnd_SubContactPeriodsEdit', Attributes, DefaultValues);	
}
 
//-----------------------------------------------------------------------------
// Event handlers
//-----------------------------------------------------------------------------
 
function btnAddOnClick(Control) { 	
	AddData();
}
 
function btnEditOnClick(Control) { //bad
    EditData();
}
 
function wnd_SubContactPeriodsGridAreaOnPrepare(Window) {
	InitializeSubContactPeriodsDetail(Window);
	Initialize(Window); 
	wnd_BaseGridAreaOnPrepare(Window);
}
 
function wnd_SubContactPeriodsGridAreaOnNotify(ScriptableService, Sender, Message, Data) {
    if ((Message == MSG_OK) && (Sender.Name == Self.Attributes('EditWindowUSI'))) {
        var WorkspaceWindow = Self.Attributes('WorkspaceWindow');
        WorkspaceWindow.Notify(Self, MSG_REFRESHDETAIL, System.EmptyValue);
    }; 
    wnd_BaseGridAreaOnNotify(ScriptableService, Sender, Message, Data); 
}

*не обращайте внимание что деталь меняется с wnd_SubContactPeriods на wnd_SubContact, их просто 2 а проблема 1 и та же

Спасибо за помощь, со всем разобрался, проблемы были в недопонимании принципа работы отключенных фильтров запроса.

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