Скрипты
Разработка

Вызов функции из другого скрипта

Добрый день.
У меня есть 2 скрипта, назовем из Script1 и Script2.
В скрипте 2 есть функция btnOkOnClick.
Я хочу сделать так, чтобы в Script 1 вызывалась функция btnOkOnClick из скрипта 2, но не знаю как это сделать. Оно пишет, что отсутствует объект.

Нравится

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

Укажите в первом скрипте использование второго:

Если я функцию использую непосредственно со скрипта, то она отрабатывает нормально.
Но если вызываю в другом скрипте, то пишет BaseDBEdit не оперделен

Значит, первый скрипт у вас скорее всего к окну, унаследованному от wnd_BaseDBEdit. Автоматически в нем виден скрипт scr_BaseDBEdit, в котором и определен этот объект.
Когда из второго скрипта вызывается функция первого скрипта, то объект не виден.

Не видя функции, сложно дать точный совет, но в общем - надо чтобы в этой функции не использовался объект BaseDBEdit (или в вызываемых ею функциях).

Здравствуйте, Олег.

Ситуация спорная. Как уже сказал Валерий, если первый скрипт у Вас к окну не унаследованному от wnd_BaseDBEdit, а второй - к унаследованному, то при вызове из первого скрипта функции из второго скрипта, объект может быть не виден. С другой стороны, когда Вы подключили к первому скрипту второй, то, по идее, этого должно быть достаточно.
Попробуйте подключить к первому скрипту, помимо второго скрипта, еще и скрипт scr_BaseDBEdit.
Кроме того, попробуйте обращаться к функции как имя_скрипта.имя_функции (это нужно во избежание путаницы в том случае, если у Вас есть одноименные функции в этих скриптах).

Инна Безверхняя,
II линия службы поддержки Terrasoft

Попробуйте подключить к первому скрипту, помимо второго скрипта, еще и скрипт scr_BaseDBEdit.

К сожалению не помогло... странно конечно, по логике ничего сложного, а столько проблем вызывает.

Ошибка выполнения метода 'blablaOnClick'. 'BaseDBEdit' - определение отсутствует

scr_TaskGridArea

[javascript]
function blablaOnClick(Control) {
scr_TaskEdit.btnCancelTaskOnClick(Control)
}
[/javascript]

scr_TaskEdit
[javascript]
function btnCancelTaskOnClick(Control) {
BaseDBEdit.Dataset.Edit();
BaseDBEdit.Dataset.Values('StatusID')='{9A74B908-9FA8-4CC3-8916-BC3D2798AC3A}';
btnOKOnClick(Control);

}
[/javascript]

К скрипту TaskGridArea прикрепил скрипты scr_TaskEdit и scr_BaseDBEdit

Здравствуйте Олег
Проверил, действительно если вызывать если вызывать btnOKOnClick другого окна следующим образом
[javascript]
function btnOKOnClick(Control) {
wnd_test2Script.btnOKOnClick(Control);
}
[/javascript]
получаем ошибку определения, даже при подключении скриптов где определен btnOKOnClick второго окна

Предлагаю другое решение, вызывать событие следующим образом
[javascript]
var wnd2= Services.GetNewItemByUSI('wnd_test2');
wnd2.ComponentsByName('btnOK').Click();
[/javascript]

В вашем случае:
[javascript]
function blablaOnClick(Control) {
var wndTask= Services.GetNewItemByUSI('wnd_TaskEdit');
wndTask.ComponentsByName('btnCancelTask').Click();
}
[/javascript]

'BaseDBEdit.Dataset' - есть null или не является объектом

Если использовать окно, то надо еще вызывать его метод Prepare, иначе не все переменные инициализируются.
Я бы посоветовал по возможности убрать свою вызываемую функцию из скрипта к окну, в какой-нибудь отдельный скрипт. По-хорошему скрипт к окну должен работать в рамках окна и может вызывать функции из вспомогательных скриптов, нехорошо, когда в нем лежат функции, вызываемые из других скриптов :smile:

Действительно, тестировал на простых сервисах. Олег, попробуйте вызвать метод Prepare, интересующего вас окна wndTask.Prepare();

Яворский Алексей
Эксперт 3-й линии поддержки

[javascript]
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();
}
[/javascript]

[javascript]
function btnCancelTaskOnClick(Control) {
BaseDBEdit.Dataset.Edit();
BaseDBEdit.Dataset.Values('StatusID')='{9A74B908-9FA8-4CC3-8916-BC3D2798AC3A}';
btnOKOnClick(Control);

}
[/javascript]

Пишет, что dataset не в edit or insert режиме

Проблему с датасетом решил, но prepare не решил основную проблему.
Пишет "Запись удалена" "Карточка открыта на редактирование другим пользователем"

Олег, попробуйте так:
[javascript]
function btnCancelTaskOnClick(Control) {
BaseDBEdit.Dataset.Edit();
BaseDBEdit.Dataset.Values('StatusID')='{9A74B908-9FA8-4CC3-8916-BC3D2798AC3A}';
BaseDBEdit.Dataset.Append();
BaseDBEdit.Dataset.Close();
btnOKOnClick(Control);
}
[/javascript]

'BaseDBEdit.Dataset' - есть null или не является объектом
Не помогло

[javascript]
function blablaOnClick(Control) {
var Attributes = GetEditDataAttributes(Self, BaseGridArea);
var wndTask = Services.GetNewItemByUSI('wnd_TaskEdit');
ShowEditWindowEx('wnd_TaskEdit', Attributes);
//wndTask.Prepare();
wndTask.ComponentsByName('btnCancelTask').Click();
}
[/javascript]
Меня смущает var Attributes = GetEditDataAttributes(Self, BaseGridArea - так и должно быть?);
var wndTask = Services.GetNewItemByUSI('wnd_TaskEdit'); - new item
Что можно попробовать вместо Prepare? Из за него пишет что карточка редактируется кем то
ShowEditWindowEx('wnd_TaskEdit', Attributes); правильно ли я указал открытие окна

В место ShowEditWindowEx('wnd_TaskEdit', Attributes); попробуйте проще wndTask.Show();

wndTask.Show(); открывает окно без данных

[javascript]
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();
}
[/javascript]

wndTask.ComponentsByName('btnCancelTask').Click();
Я как понял, этой строкой мы имитируем нажатие кнопки. Но террасофт ругается, что BaseDBEdit не является объектом. Так вот я не пойму, почему оно ругается, если при нажатии кнопки руками ошибки нету

Здравствуйте, Олег!

А может быть стоит попробовать обойти данную проблему? Например, создать свой аналогичный обработчик события OnClick непосредственно в Вашем скрипте, а не вызывать его из другого скрипта?
Конечно, если это не критично, если же, по каким-либо причинам, Вам необходимо вызывать именно ту функцию, то может быть Вы подробнее опишите нам ситуацию, чтобы мы смогли предложить какой-нибудь другой вариант решения.

Инна Безверхняя,
II линия службы поддержки Terrasoft

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

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