Подключение к ExtSdk2 через OLE - Сценарии ExtSdk2 — различия между версиями

Материал из razgovorov.ru
Перейти к: навигация, поиск
Строка 15: Строка 15:
  
 
     Получение модуля
 
     Получение модуля
 +
 
     guid_module = ole.GetModule(name)
 
     guid_module = ole.GetModule(name)
 +
  
 
     Вызов методов модуля через COM-объект
 
     Вызов методов модуля через COM-объект
    ole.CallMethodWithoutAuth
 
    ole.CallMethodWithoutAuthXML
 
  
     ole.CallMethod
+
     query_id = str(uuid.uuid4())
     ole.CallMethodXML
+
    module_method = "ExtSdk2.AuthByPassword"
 +
    parameters_module_method = json.dumps({"Login": "login", "Password": "password"}, ensure_ascii=True)
 +
    host = online.sbis.ru
 +
 
 +
     ole.CallMethodWithoutAuth( query_id, guid_module, module_method, parameters_module_method, host )
  
     def call_method(self, ole_method, module_method, parameters_module_method):
+
     account_id = ********@plugin.sbis.ru
        try:
 
            query_id = str(uuid.uuid4())
 
            param_list = [query_id, self.guid_module, module_method, parameters_module_method]
 
            ole_method_dict = {
 
                'CallMethodWithoutAuth': {"method": self.ole.CallMethodWithoutAuth, "params": param_list + [self.host]},
 
                'CallMethod': {"method": self.ole.CallMethod, "params": param_list + [self.account_id]},
 
                'CallMethodWithoutAuthXML': {"method": self.ole.CallMethodWithoutAuthXML,
 
                                            "params": param_list + [self.host]},
 
                'CallMethodXML': {"method": self.ole.CallMethodXML, "params": param_list + [self.account_id]}
 
            }
 
  
            ole_method_dict[ole_method]['method'](*ole_method_dict[ole_method]['params'])
+
    ole.CallMethod( query_id, guid_module, module_method, parameters_module_method, account_id )
  
            return query_id
 
        except Exception as err:
 
            raise err
 
 
</source>
 
</source>
  
 
Для корректной адресации наших запросов в плагин к модулю ExtSdk2 необходимо сначала получить его guid. Guid можно получить в функции get_module, которая вызывает непосредственно метод COM-объекта ole.GetModule(name).  
 
Для корректной адресации наших запросов в плагин к модулю ExtSdk2 необходимо сначала получить его guid. Guid можно получить в функции get_module, которая вызывает непосредственно метод COM-объекта ole.GetModule(name).  
  
Вызов методов ExtSdk2 выполняется через вызов методов COM-объекта. Методы "ole.CallMethodWithoutAuth" и "ole.CallMethodWithoutAuthXML" вызываются для авторизации в плагине и позволяют получить идентификатор сессии с которым можно вызывать все остальные методы модуля через "CallMethod" и "CallMethodXML".  
+
Вызов методов ExtSdk2 выполняется через вызов методов COM-объекта. Методы "ole.CallMethodWithoutAuth" и "ole.CallMethodWithoutAuthXML" вызываются для авторизации в плагине и позволяют получить идентификатор сессии с которым можно вызывать все остальные методы модуля через "CallMethod" и "CallMethodXML". Методы с постфиксом XML вызываются с "parameters_module_method" в виде xml.
  
 
Методы на вход принимают query_id вызываемого метода, guid_module - guid полученного модуля, module_method - метод модуля, который хотим позвать, parameters_module_method - параметры вызываемого метода, а так же либо host на котором мы хотим работать( online.sbis.ru ), либо account_id - полученный идентификатор сессии с которым можно вызывать остальные методы модуля.  
 
Методы на вход принимают query_id вызываемого метода, guid_module - guid полученного модуля, module_method - метод модуля, который хотим позвать, parameters_module_method - параметры вызываемого метода, а так же либо host на котором мы хотим работать( online.sbis.ru ), либо account_id - полученный идентификатор сессии с которым можно вызывать остальные методы модуля.  
  
На выходе получаем query_id вызываемого метода, который нужно передать в функцию read_all_xml для ожидания ответа.
+
По переданному query_id следует ожидать ответа от модуля.
 +
 
 
== Пример реализации получения ответов от COM-объекта ==
 
== Пример реализации получения ответов от COM-объекта ==
 
<source lang="json">
 
<source lang="json">
  
     @staticmethod
+
     xml_string = ole.ReadAllXml2()
    def parse_Message(_event):
 
        _event['data'] = XmlJsonSerializer.decode(_event['data'])
 
        pass
 
 
 
    @staticmethod
 
    def parse_Error(_event):
 
        if _event['queryID'] == 'ReadAllXml':  # ошибка сериализатора
 
            raise Exception(_event['data'])
 
        else:
 
            _event['data'] = XmlJsonSerializer.decode(_event['data'])
 
            if _event['data']['detail'] == '#ASYNC':
 
                _event['queryID'] = -1
 
        pass
 
 
 
    @staticmethod
 
    def parse_Event(_event):
 
        _event['data'] = XmlJsonSerializer.decode(_event['data'])
 
        query_id = f'Event_{_event["data"]["eventName"]}'
 
 
 
        if query_id == 'Event_extsdk2.async.complete' \
 
                or query_id == 'Event_extsdk2.async.progress' \
 
                or query_id == 'Event_extsdk2.async.error':
 
            _event['data'] = _event['data']['data']
 
            _event['queryID'] = _event['data']['QueryId']
 
  
            if query_id == 'Event_extsdk2.async.error':
 
                _event['type'] = 'Error'
 
                _event['data'] = _event['data']['Error']
 
        else:
 
            _event['queryID'] = query_id
 
        pass
 
 
    @staticmethod
 
    def pars_event(_event):
 
        if _event['type'] == 'Message' or _event['type'] == 'Event':
 
            return _event['data']
 
        elif _event['type'] == 'Error':
 
            return _event['data']
 
            # raise ExtException(_event['data'])
 
        return _event
 
 
    def read_all_xml(self, requests):
 
        '''
 
        Чтение и обработка событий сконвертированных в json_xml
 
        :param requests: массив идентификаторов запросов, на которые мы ждем ответ.
 
        :return:
 
        '''
 
 
        supported_events = {
 
            'Message': self.parse_Message,
 
            'Error': self.parse_Error,
 
            'Event': self.parse_Event
 
        }
 
        result = []
 
        while len(result) == 0:
 
            xml_string = self.ole.ReadAllXml2()
 
            events = XmlJsonSerializer.decode(xml_string)
 
            for event in events:
 
                event_type = event.get('type')
 
                if event_type not in supported_events:
 
                    raise Exception(f'Warning not supported event {event_type}')
 
                supported_events[event_type](event)
 
 
                try:
 
                    query_id = requests.index(event['queryID'])
 
                    if query_id >= 0:
 
                        requests.pop(query_id)
 
                        result.append(self.pars_event(event))
 
                except ValueError:
 
                    pass
 
        return result
 
 
</source>
 
</source>
  
Выше представлен пример реализации получения ответов от COM-объекта плагина в функции "read_all_xml", которая постоянно опрашивает плагин на наличие ответов через вызов функции self.ole.ReadAllXml2(). "В качестве аргумента "requests" передается массив с query_id, вызываемых методов в плагине, на которые мы хотим получить ответ.
+
ReadAllXml2" непосредственно функция COM-объекта, возвращающая массив событий в виде xml строки. Пришедшую строку следует разобрать на события и найти интересующий нас ответ по переданному query_id
 
 
ReadAllXml2" непосредственно функция COM-объекта, возвращающая массив событий в виде xml строки. Пришедшая строка сериализуется в массив Python по событиям "events = XmlJsonSerializer.decode(xml_string)" и разбирается по типам событий в функциях "parse_Message", "parse_Error", "parse_Event" соответственно. На выходе получаем массив ответов от плагина по интересующим нас методам.
 
 
 
== Пример подключения к ExtSdk2 через OLE ==
 
<source lang="json">
 
    @classmethod
 
    def setUpClass(cls):
 
        cls.plugin = OleSbis3Plugin()
 
        cls.plugin.host = online.sbis.ru
 
        cls.plugin.get_module("ExtSdk2")
 
</source>
 
Создаем новое подключение при инициализации объекта OleSbis3Plugin(), в котором описаны все вышеупомянутые методы. Устанавливаем хост и получаем guid интересующего нас модуля. На этом подключение к ExtSdk2 завершается, можно переходить к авторизации.
 
  
 
[[Категория:Сценарии ExtSdk2]]
 
[[Категория:Сценарии ExtSdk2]]

Версия 10:32, 20 апреля 2021

Для работы со СБИС3 Плагин из внешних систем, таких как 1С или SAP, требуется получить COM-объект, зарегистрированный Плагином в Вашей системе. Его название "Tensor.SbisPluginClientCOM". Все примеры кода указаны на языке Python.

Получение COM-объекта

    ole = win32com.client.Dispatch("Tensor.SbisPluginClientCOM")

Получение COM-объекта занимает одну строку "ole = win32com.client.Dispatch("Tensor.SbisPluginClientCOM")" с использованием библиотеки pywin32. Далее Плагин подготавливает необходимые внутренние инструменты для подключения и в случае успеха пробрасывает событие с именем "Event_connected".

Пример вызовов методов плагина через COM-объект

    Получение модуля

    guid_module = ole.GetModule(name)


    Вызов методов модуля через COM-объект

    query_id = str(uuid.uuid4())
    module_method = "ExtSdk2.AuthByPassword"
    parameters_module_method = json.dumps({"Login": "login", "Password": "password"}, ensure_ascii=True)
    host = online.sbis.ru

    ole.CallMethodWithoutAuth( query_id, guid_module, module_method, parameters_module_method, host )

    account_id = ********@plugin.sbis.ru

    ole.CallMethod( query_id, guid_module, module_method, parameters_module_method, account_id )

Для корректной адресации наших запросов в плагин к модулю ExtSdk2 необходимо сначала получить его guid. Guid можно получить в функции get_module, которая вызывает непосредственно метод COM-объекта ole.GetModule(name).

Вызов методов ExtSdk2 выполняется через вызов методов COM-объекта. Методы "ole.CallMethodWithoutAuth" и "ole.CallMethodWithoutAuthXML" вызываются для авторизации в плагине и позволяют получить идентификатор сессии с которым можно вызывать все остальные методы модуля через "CallMethod" и "CallMethodXML". Методы с постфиксом XML вызываются с "parameters_module_method" в виде xml.

Методы на вход принимают query_id вызываемого метода, guid_module - guid полученного модуля, module_method - метод модуля, который хотим позвать, parameters_module_method - параметры вызываемого метода, а так же либо host на котором мы хотим работать( online.sbis.ru ), либо account_id - полученный идентификатор сессии с которым можно вызывать остальные методы модуля.

По переданному query_id следует ожидать ответа от модуля.

Пример реализации получения ответов от COM-объекта

    xml_string = ole.ReadAllXml2()

ReadAllXml2" непосредственно функция COM-объекта, возвращающая массив событий в виде xml строки. Пришедшую строку следует разобрать на события и найти интересующий нас ответ по переданному query_id