Добрый день.
У меня есть 2 скрипта, назовем из Script1 и Script2.
В скрипте 2 есть функция btnOkOnClick.
Я хочу сделать так, чтобы в Script 1 вызывалась функция btnOkOnClick из скрипта 2, но не знаю как это сделать. Оно пишет, что отсутствует объект.
Нравится
Если я функцию использую непосредственно со скрипта, то она отрабатывает нормально.
Но если вызываю в другом скрипте, то пишет BaseDBEdit не оперделен
Значит, первый скрипт у вас скорее всего к окну, унаследованному от wnd_BaseDBEdit. Автоматически в нем виден скрипт scr_BaseDBEdit, в котором и определен этот объект.
Когда из второго скрипта вызывается функция первого скрипта, то объект не виден.
Не видя функции, сложно дать точный совет, но в общем - надо чтобы в этой функции не использовался объект BaseDBEdit (или в вызываемых ею функциях).
Здравствуйте, Олег.
Ситуация спорная. Как уже сказал Валерий, если первый скрипт у Вас к окну не унаследованному от wnd_BaseDBEdit, а второй - к унаследованному, то при вызове из первого скрипта функции из второго скрипта, объект может быть не виден. С другой стороны, когда Вы подключили к первому скрипту второй, то, по идее, этого должно быть достаточно.
Попробуйте подключить к первому скрипту, помимо второго скрипта, еще и скрипт scr_BaseDBEdit.
Кроме того, попробуйте обращаться к функции как имя_скрипта.имя_функции (это нужно во избежание путаницы в том случае, если у Вас есть одноименные функции в этих скриптах).
Инна Безверхняя,
II линия службы поддержки Terrasoft
Попробуйте подключить к первому скрипту, помимо второго скрипта, еще и скрипт scr_BaseDBEdit.
К сожалению не помогло... странно конечно, по логике ничего сложного, а столько проблем вызывает.
Ошибка выполнения метода 'blablaOnClick'. 'BaseDBEdit' - определение отсутствует
scr_TaskGridArea
function blablaOnClick(Control) { scr_TaskEdit.btnCancelTaskOnClick(Control) }
scr_TaskEdit
function btnCancelTaskOnClick(Control) { BaseDBEdit.Dataset.Edit(); BaseDBEdit.Dataset.Values('StatusID')='{9A74B908-9FA8-4CC3-8916-BC3D2798AC3A}'; btnOKOnClick(Control); }
К скрипту TaskGridArea прикрепил скрипты scr_TaskEdit и scr_BaseDBEdit
Здравствуйте Олег
Проверил, действительно если вызывать если вызывать btnOKOnClick другого окна следующим образом
function btnOKOnClick(Control) { wnd_test2Script.btnOKOnClick(Control); }
получаем ошибку определения, даже при подключении скриптов где определен btnOKOnClick второго окна
Предлагаю другое решение, вызывать событие следующим образом
var wnd2= Services.GetNewItemByUSI('wnd_test2'); wnd2.ComponentsByName('btnOK').Click();
В вашем случае:
function blablaOnClick(Control) { var wndTask= Services.GetNewItemByUSI('wnd_TaskEdit'); wndTask.ComponentsByName('btnCancelTask').Click(); }
'BaseDBEdit.Dataset' - есть null или не является объектом
Если использовать окно, то надо еще вызывать его метод Prepare, иначе не все переменные инициализируются.
Я бы посоветовал по возможности убрать свою вызываемую функцию из скрипта к окну, в какой-нибудь отдельный скрипт. По-хорошему скрипт к окну должен работать в рамках окна и может вызывать функции из вспомогательных скриптов, нехорошо, когда в нем лежат функции, вызываемые из других скриптов :smile:
Действительно, тестировал на простых сервисах. Олег, попробуйте вызвать метод Prepare, интересующего вас окна wndTask.Prepare();
Яворский Алексей
Эксперт 3-й линии поддержки
function blablaOnClick(Control) { var Attributes = GetAddDataAttributes(Self, BaseGridArea); var wndTask = Services.GetNewItemByUSI('wnd_TaskEdit'); ShowEditWindowEx(BaseGridArea.EditWindowUSI, Attributes, BaseGridArea.AddDataDefaultValues); wndTask.Prepare(); wndTask.ComponentsByName('btnCancelTask').Click(); }
function btnCancelTaskOnClick(Control) { BaseDBEdit.Dataset.Edit(); BaseDBEdit.Dataset.Values('StatusID')='{9A74B908-9FA8-4CC3-8916-BC3D2798AC3A}'; btnOKOnClick(Control); }
Пишет, что dataset не в edit or insert режиме
Проблему с датасетом решил, но prepare не решил основную проблему.
Пишет "Запись удалена" "Карточка открыта на редактирование другим пользователем"
Олег, попробуйте так:
function btnCancelTaskOnClick(Control) { BaseDBEdit.Dataset.Edit(); BaseDBEdit.Dataset.Values('StatusID')='{9A74B908-9FA8-4CC3-8916-BC3D2798AC3A}'; BaseDBEdit.Dataset.Append(); BaseDBEdit.Dataset.Close(); btnOKOnClick(Control); }
'BaseDBEdit.Dataset' - есть null или не является объектом
Не помогло
function blablaOnClick(Control) { var Attributes = GetEditDataAttributes(Self, BaseGridArea); var wndTask = Services.GetNewItemByUSI('wnd_TaskEdit'); ShowEditWindowEx('wnd_TaskEdit', Attributes); //wndTask.Prepare(); wndTask.ComponentsByName('btnCancelTask').Click(); }
Меня смущает var Attributes = GetEditDataAttributes(Self, BaseGridArea - так и должно быть?);
var wndTask = Services.GetNewItemByUSI('wnd_TaskEdit'); - new item
Что можно попробовать вместо Prepare? Из за него пишет что карточка редактируется кем то
ShowEditWindowEx('wnd_TaskEdit', Attributes); правильно ли я указал открытие окна
В место ShowEditWindowEx('wnd_TaskEdit', Attributes); попробуйте проще wndTask.Show();
function blablaOnClick(Control) { var Attributes = GetEditDataAttributes(Self, BaseGridArea); var wndTask = Services.GetSingleItemByUSI('wnd_TaskEdit'); ShowEditWindowEx('wnd_TaskEdit', Attributes); // wndTask.IsDesigning = false; // wndTask.Prepare(); wndTask.ComponentsByName('btnCancelTask').Click(); }
wndTask.ComponentsByName('btnCancelTask').Click();
Я как понял, этой строкой мы имитируем нажатие кнопки. Но террасофт ругается, что BaseDBEdit не является объектом. Так вот я не пойму, почему оно ругается, если при нажатии кнопки руками ошибки нету
Здравствуйте, Олег!
А может быть стоит попробовать обойти данную проблему? Например, создать свой аналогичный обработчик события OnClick непосредственно в Вашем скрипте, а не вызывать его из другого скрипта?
Конечно, если это не критично, если же, по каким-либо причинам, Вам необходимо вызывать именно ту функцию, то может быть Вы подробнее опишите нам ситуацию, чтобы мы смогли предложить какой-нибудь другой вариант решения.
Инна Безверхняя,
II линия службы поддержки Terrasoft
Спасибо за советы, я подумал и понял, что надобность в данной функции отсуствуе. Всем еще раз спасибо, можно закрывать.