У меня возник вопрос по поводу скрипта, в частности scr_Dataflow1CUtils.
В этом скрипте вначале обьявляется глобальная внутри скрипта переменная:
В этой переменной впоследствии будут храниться все активные подключения к 1С.
Если этот скрипт был инициализирован во время запуска синхронизации из раздела "Интеграции", что будет если я обращусь к скрипту через вот такой код в скрипте scr_Main:
Смогу ли я через обращение ScriptItem.Connections получить список подключений или эта переменная будет пустой, хотя подключения были уже проиниициализированы и выполнены.
То есть будет ли это одна и та же сущность скрипта, что используется в момент подключения к 1С и в момент обращения из скрипта scr_Main?
Во время закрытия CRM у меня вызывается функция закрытия всех 1С подключений. Изначально я подключил скрипт scr_Dataflow1CUtils в скрипт scr_Main и пользовался следующей функцией для закрытия подключений:
for (var j in scr_Dataflow1CUtils.Connections) {
if (scr_Dataflow1CUtils.IsConnected(j)) {
scr_Dataflow1CUtils.Disconnect(j, true);
}
}
}
Сейчас я хотел бы исключить подключаемый скрипт scr_Dataflow1CUtils, чтобы уменьшить время на инициализацию CRM при ее запуске, но каким-то образом все таки выполнять закрытие всех соединений при выходе из CRM.
Нравится
Переписал функцию отключения соединений с 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С соединений.