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

Добрый день.
У меня есть 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

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

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

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

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