У меня есть деталь(своя) в одном из разделов(свой раздел) на которой отфильтрованы нужные мне контакты, я хочу сделать, чтоб при двойном клике на этом контакте создавалась новая карточка "Операция" с заполненными полями Контакт, Контрагент и тд. и после сохранения этой карточки ссылка на нее записывалась в основную таблицу в моем разделе.
как это правильно сделать?
Нравится
Добрый день!
На событии double click реестра раздела вызовите необходимую карточку через функцию ShowEditWindowEx.
спасибо
все получилось, почему-то не заметил(или не там смотрел) это событие.
а как осуществить:
после сохранения этой карточки ссылка на нее записывалась в основную таблицу в моем разделе.
как это правильно сделать?
"Довженко Тимофей" написал:после сохранения этой карточки
за это отвечает событие AfterPost невизуального компонента dlData Вашего окна (которое Вы открываете)
"Довженко Тимофей" написал:ссылка на нее записывалась в основную таблицу в моем разделе.
как это правильно сделать?
что Вы имеете ввиду?
насколько мной был понят вопрос: выделяется запись, на детали к ней щелкается дважды и открывается окно. после его закрытия ИД созданной записи записывается в выделенную ранее в основном реестре раздела. так? думаю, тут лучше использовать события нотифай.
1)на афтерпост вызываемого окна прописать функцию SendNotify(Self.Attributes('NotifyObject'),'NewDetailID',[Dataset('ID')]);
здесь первый параметр -- по идее, окно раздела (должно быть по умолчанию при вызове окна. если нету его -- значит, нужно его дополнительно прописать)
'NewDetailID' -- наше сообщение, на которое мы будем "ориентироваться" дальше
[Dataset('ID')]-- ИД созданной записи
2) на событии окна раздела дописать логику для нашего сообщения (а именно -- редактировать выделенную запись и добавить нашу ID -- она будет в переменной Data, тип массив)
2й способ
можно попробовать передавать ИД выделенной записи в атрибуты открываемого окна. тогда на афтерпосте просто редактировать эту запись
"Ольга Прилипко" написал: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 -- это наше окно.
возможны очепятки, так как сразу написано здесь, на комюнити. поэтому внимательно копируйте код. удачи!
новый вопрос возник.
а как теперь обновить основной реестр?
Здравствуйте!
Воспользуйтесь методом:
RefreshDataset(Dataset);
Сам датасет основного реестра можно получить примерно так:
var Dataset = Self.ParentContainer.ParentWindow.Window.ComponentsByName('dlData').Dataset;
на
var Dataset = Self.ParentContainer.ParentWindow.Window.ComponentsByName('dlData').Dataset;
выдает ошибку:
Ошибка выполнения Microsoft JScript: Требуется объект
Попробуйте так:
var Dataset = Self.ParentContainer.ParentWindow.ComponentsByName('wndGridData').Window.ComponentsByName('dlData').Dataset;
"Олейник Дмитрий" написал:var Dataset = Self.ParentContainer.ParentWindow.ComponentsByName('wndGridData').Window.ComponentsByName('dlData').Datas
тоже самое -Ошибка выполнения Microsoft JScript: Требуется объект
Здравствуйте.
Установите отладчик, и проверьте в MS Visual Studio как правильно достучаться с детали в окно основного реестра, а из него к датасету.
Должно быть примерно так:
var Dataset = Self.ParentContainer.ParentWindow.ComponentsByName('wndGridData').Window.ComponentsByName('dlData').Dataset;
но вместо "wndGridData" подставьте название Window контейнера окна основного реестра в сервисе окна Вашего раздела.
К примеру в wnd_TasksWorkspace контейнер окна основного реестра имеет название wndGridData.
а если попробовать послать нотифай?
после изменения записи (на афтерпосте открываемого окна) написать:
SendNotify(Self.Attributes('NotifyObject'),'MSG_RefreshDataset',[]);
а в функцию
wnd_YourWorkspaceOnNotify(ScriptableService, Sender, Message, Data)
в конце, перед вызовом базового метода scr_BaseWorkspace.wnd_BaseWorkspaceOnNotify(ScriptableService, Sender, Message, Data);
дописать примерно такое:
if ((Message == 'MSG_RefreshDataset') && (ExtractUSICodeEx(Sender.USI) == 'wnd_okno')) { RefreshWorkspace(); return; }
"Ольга Прилипко" написал:а если попробовать послать нотифай?
после изменения записи (на афтерпосте открываемого окна) написать:
SendNotify(Self.Attributes('NotifyObject'),'MSG_RefreshDataset',[]);
а в функцию
wnd_YourWorkspaceOnNotify(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 нет.
"Олейник Дмитрий" написал:Здравствуйте.
Установите отладчик, и проверьте в MS Visual Studio как правильно достучаться с детали в окно основного реестра, а из него к датасету.
Должно быть примерно так:
var Dataset = Self.ParentContainer.ParentWindow.ComponentsByName('wndGridData').Window.ComponentsByName('dlData').Dataset;
но вместо "wndGridData" подставьте название Window контейнера окна основного реестра в сервисе окна Вашего раздела.
К примеру в wnd_TasksWorkspace контейнер окна основного реестра имеет название wndGridData.С уважением,
Олейник Дмитрий
Эксперт 3-й линии поддержки
я из своего, нового, раздела, открываю окно операции, все равно должно сработать?
Здравствуйте.
Да, смотрите тут какая логика:
когда Вы открываете окно операции с детали, ParentContainer для этого окна будет окно реестра детали. Для окна реестра детали в свою очередь окно раздела, в котором Вы находитесь.
В разделе есть окно, которое в базовом варианте называется wndGridData - это окно основного реестра записей раздела. Вот в нем и нужно найти через ComponentsByName('dlData').Dataset датасет и обновить его по
RefreshDataset(Dataset);
Если у Вас установлен MS Visual Studi, то поставьте отладчик и попробуйте дойти до этого компонента.
Я дошел таким образом:
var Dataset = Self.ParentContainer.ParentWindow.ComponentsByName('wndGridData').Window.ComponentsByName('dlData').Dataset;
Если MS Visual Studio нету, тогда предлагаю Вам через
MessageBox('SomeText');
проверять, "где Вы".
Т.е прописать примерно так:
MessageBox(Self.ParentContainer.ParentWindow.USI);
потом
MessageBox(Self.ParentContainer.ParentWindow.ComponentsByName('wndGridData').Window.USI);
и т.д.
"Олейник Дмитрий" написал:
спасибо, не там получал датасет
Не за что.
Если у Вас возникнут дополнительные вопросы - обращайтесь!