Создание новой карточки из другого раздела

У меня есть деталь(своя) в одном из разделов(свой раздел) на которой отфильтрованы нужные мне контакты, я хочу сделать, чтоб при двойном клике на этом контакте создавалась новая карточка "Операция" с заполненными полями Контакт, Контрагент и тд. и после сохранения этой карточки ссылка на нее записывалась в основную таблицу в моем разделе.
как это правильно сделать?

Нравится

21 комментарий

Добрый день!

На событии double click реестра раздела вызовите необходимую карточку через функцию ShowEditWindowEx.

http://www.community.terrasoft.ua/system/files/30-08-2012_13-54-27.png

спасибо
все получилось, почему-то не заметил(или не там смотрел) это событие.
а как осуществить:
после сохранения этой карточки ссылка на нее записывалась в основную таблицу в моем разделе.
как это правильно сделать?

"Довженко Тимофей" написал:после сохранения этой карточки

за это отвечает событие 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 -- это наше окно.

возможны очепятки, так как сразу написано здесь, на комюнити. поэтому внимательно копируйте код. удачи!

меня опередили:smile:

спасибо!

новый вопрос возник.
а как теперь обновить основной реестр?

Здравствуйте!

Воспользуйтесь методом:

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);

и т.д.

у меня Self.ParentContainer - null

"Олейник Дмитрий" написал:

спасибо, не там получал датасет

Не за что.
Если у Вас возникнут дополнительные вопросы - обращайтесь!

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