Обращение к переменным и методам скрипта

У меня возник вопрос по поводу скрипта, в частности scr_Dataflow1CUtils.
В этом скрипте вначале обьявляется глобальная внутри скрипта переменная:

var Connections = {};

В этой переменной впоследствии будут храниться все активные подключения к 1С.
Если этот скрипт был инициализирован во время запуска синхронизации из раздела "Интеграции", что будет если я обращусь к скрипту через вот такой код в скрипте scr_Main:
var ScriptItem = Services.GetSingleItemByID(ServiceScriptID);
, где ServiceScriptID - это ID скрипта сервиса 'scr_Dataflow1CUtils'.
Смогу ли я через обращение ScriptItem.Connections получить список подключений или эта переменная будет пустой, хотя подключения были уже проиниициализированы и выполнены.
То есть будет ли это одна и та же сущность скрипта, что используется в момент подключения к 1С и в момент обращения из скрипта scr_Main?

Во время закрытия CRM у меня вызывается функция закрытия всех 1С подключений. Изначально я подключил скрипт scr_Dataflow1CUtils в скрипт scr_Main и пользовался следующей функцией для закрытия подключений:

function Disconnect1CConnections(){
        for (var j in scr_Dataflow1CUtils.Connections) {
                if (scr_Dataflow1CUtils.IsConnected(j)) {
                        scr_Dataflow1CUtils.Disconnect(j, true);
                }
        }
}

Сейчас я хотел бы исключить подключаемый скрипт scr_Dataflow1CUtils, чтобы уменьшить время на инициализацию CRM при ее запуске, но каким-то образом все таки выполнять закрытие всех соединений при выходе из CRM.

Нравится

2 комментария

Переписал функцию отключения соединений с 1С следующим образом и она работает:

function Disconnect1CConnections(){
	var ScriptItem = Services.GetSingleItemByUSI('scr_Dataflow1CUtils');
	for (var j in ScriptItem.ScriptControl.CodeObject.Connections) {
		if (ScriptItem.ScriptControl.Run('IsConnected', j)) {
			ScriptItem.ScriptControl.Run('Disconnect', j, true);
		}
	}
}

Таким образом я отключил скрипт scr_Dataflow1CUtils из скрипта scr_Main, что позволило пропустить инициализацию этого скрипта во время загрузки CRM, и перенести время инициализации на момент закрытия CRM (конечно, если перед этим скрипт не был уже инициализирован. В таком случае он просто берется из кэша).

"Кошкаров Андрей" написал:То есть будет ли это одна и та же сущность скрипта, что используется в момент подключения к 1С и в момент обращения из скрипта scr_Main?

Да. ScriptItem.ScriptControl.CodeObject.Connections действительно будет ссылаться на один и тот же екземпляр объекта. Даже в случае следующего кода

	var EditWindow1 = Services.GetNewItemByUSI('wnd_1CSynchro');
	var EditWindow2 = Services.GetSingleItemByUSI('wnd_1CSynchro');
        var ScriptItem = Services.GetSingleItemByUSI('scr_Dataflow1CUtils');
        var test = EditWindow1.ScriptControl.CodeObject.Connections == EditWindow2.ScriptControl.CodeObject.Connections
        var test2 = ScriptItem.ScriptControl.CodeObject.Connections == EditWindow2.ScriptControl.CodeObject.Connections

переменные test, test2 - будут содержать true.
Но по хорошему, лучше хранить объект Connections в атрибутах коннектора:
Connector.Attributes('1CConnecctions') = {}
Нужно как минимум переписать scr_Dataflow1CUtils для этого.
В будущих версиях будет учтена необходимость отключения 1С соединений.

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