У меня есть деталь(своя) в одном из разделов(свой раздел) на которой отфильтрованы нужные мне контакты, я хочу сделать, чтоб при двойном клике на этом контакте создавалась новая карточка "Операция" с заполненными полями Контакт, Контрагент и тд. и после сохранения этой карточки ссылка на нее записывалась в основную таблицу в моем разделе. как это правильно сделать?
спасибо
все получилось, почему-то не заметил(или не там смотрел) это событие.
а как осуществить:
после сохранения этой карточки ссылка на нее записывалась в основную таблицу в моем разделе.
как это правильно сделать?
"Довженко Тимофей" написал:после сохранения этой карточки
за это отвечает событие AfterPost невизуального компонента dlData Вашего окна (которое Вы открываете)
"Довженко Тимофей" написал:ссылка на нее записывалась в основную таблицу в моем разделе.
как это правильно сделать?
что Вы имеете ввиду?
насколько мной был понят вопрос: выделяется запись, на детали к ней щелкается дважды и открывается окно. после его закрытия ИД созданной записи записывается в выделенную ранее в основном реестре раздела. так? думаю, тут лучше использовать события нотифай.
1)на афтерпост вызываемого окна прописать функцию SendNotify(Self.Attributes('NotifyObject'),'NewDetailID',[Dataset('ID')]);
здесь первый параметр -- по идее, окно раздела (должно быть по умолчанию при вызове окна. если нету его -- значит, нужно его дополнительно прописать)
'NewDetailID' -- наше сообщение, на которое мы будем "ориентироваться" дальше
[Dataset('ID')]-- ИД созданной записи
2) на событии окна раздела дописать логику для нашего сообщения (а именно -- редактировать выделенную запись и добавить нашу ID -- она будет в переменной Data, тип массив)
2й способ
можно попробовать передавать ИД выделенной записи в атрибуты открываемого окна. тогда на афтерпосте просто редактировать эту запись
Опять таки, если я верно понял, Вам нужно ID созданной по даблклику операции, записать в родительскую выделенную запись в реестре. В таком случае, на событии OnDatasetAfterPost компонента dlData(вкладка "не визуальные") того сервиса карточки, которая открывается при даблклике, нужно прописать примерно следующий код:
var ID = Dataset('ID');
var ParentID = Self.ParentContainer.ParentWindow.Window.ComponentsByName('dlData').Dataset('ID');
var Dataset = Services.GetNewItemByUSI('ds_MyParentDataset');
ApplyDatasetFilter(Dataset, 'ID', ParentID, true);
Dataset.Open();
Dataset.Edit();
Dataset('MyField')= ID;
Dataset.Post();
Dataset.Close();
даже не скажу, ничего на ум не приходит.... могу только примерно написать, как это сделать:
1) передаем атрибут. назовем его, например "SelectedRecordID".
var EditWindow = Services.GetNewItemByUSI('wnd_okno');//...
EditWindow.Attributes('SelectedRecordIDs')= grdData.SelectedIDs[0];//то, что выше и ниже уже есть. в этой строчке мы и передаем атрибут//...
EditWindow.Prepare();
EditWindow.Show();
2) на вкладке "Невизуальные" открываемого окна выбираем dlData, ищем его событие AfterPost() и пишем примерно следующее:
if(!!Self.Attributes('SelectedRecordID')){
var NewRecordID = Dataset('ID');// ИД созданной записи
var DS = GetOpenedDatasetByUSIWithFilter('ds_workspace','ID',Self.Attributes('SelectedRecordID'));
DS.DisableEvents();
DS.Edit();
DS('FieldID')= NewRecordID;//FieldID -- поле, куда нужно записать наше ИД
DS.Post();
DS.EnableEvents();}
wnd_okno -- сервис открываемого окна
ds_workspace -- датасет основного раздела (где мы выделяем запись)
Self -- это наше окно.
возможны очепятки, так как сразу написано здесь, на комюнити. поэтому внимательно копируйте код. удачи!
Установите отладчик, и проверьте в MS Visual Studio как правильно достучаться с детали в окно основного реестра, а из него к датасету.
Должно быть примерно так:
var Dataset = Self.ParentContainer.ParentWindow.ComponentsByName('wndGridData').Window.ComponentsByName('dlData').Dataset;
но вместо "wndGridData" подставьте название Window контейнера окна основного реестра в сервисе окна Вашего раздела.
К примеру в wnd_TasksWorkspace контейнер окна основного реестра имеет название wndGridData.
а в функцию wnd_YourWorkspaceOnNotify(ScriptableService, Sender, Message, Data)
в конце, перед вызовом базового метода scr_BaseWorkspace.wnd_BaseWorkspaceOnNotify(ScriptableService, Sender, Message, Data);
дописать примерно такое:
в конце, перед вызовом базового метода scr_BaseWorkspace.wnd_BaseWorkspaceOnNotify(ScriptableService, Sender, Message, Data);
дописать примерно такое:
if ((Message == 'MSG_RefreshDataset') && (ExtractUSICodeEx(Sender.USI) == 'wnd_okno')) {
RefreshWorkspace();
return;
}
так как окно я создаю из детали, то и notify возвращается на деталь, а как передать notify на workspace ?
и если просмотреть все message которые приходя к окну детали, то там есть только ok, close, afterclose а MSG_RefreshDataset нет.
когда Вы открываете окно операции с детали, ParentContainer для этого окна будет окно реестра детали. Для окна реестра детали в свою очередь окно раздела, в котором Вы находитесь.
В разделе есть окно, которое в базовом варианте называется wndGridData - это окно основного реестра записей раздела. Вот в нем и нужно найти через ComponentsByName('dlData').Dataset датасет и обновить его по
RefreshDataset(Dataset);
Если у Вас установлен MS Visual Studi, то поставьте отладчик и попробуйте дойти до этого компонента.
Я дошел таким образом:
var Dataset = Self.ParentContainer.ParentWindow.ComponentsByName('wndGridData').Window.ComponentsByName('dlData').Dataset;
Если MS Visual Studio нету, тогда предлагаю Вам через