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

Материал из razgovorov.ru
Перейти к: навигация, поиск
Строка 32: Строка 32:
 
По мимо событий содержащих результат вызова команды, в OLE Объект могут приходить события содержащие прогресс выполнения длительной операции (например загрузки больших файлов) или события произошедшие в СБИС, например распознавание документа и т.п. В интеграционных модулях рекомендуется построить обработку событий на принципах регистрации и вызова обработчика обратного вызова. Интеграционный модуль должен игнорировать не интересующие или неожиданные события.  
 
По мимо событий содержащих результат вызова команды, в OLE Объект могут приходить события содержащие прогресс выполнения длительной операции (например загрузки больших файлов) или события произошедшие в СБИС, например распознавание документа и т.п. В интеграционных модулях рекомендуется построить обработку событий на принципах регистрации и вызова обработчика обратного вызова. Интеграционный модуль должен игнорировать не интересующие или неожиданные события.  
  
Кроме асинхронных вызовов, сами команды ExtSdk2 могут выполняться асинхронно. В основном это касается методов отправки. Такие методы в качестве ответа возвращают специальный тип ошибки [[Подключение_к_ExtSdk2_через_OLE_-_Сценарии_ExtSdk2#Событие Error #ASYNC|Error #ASYNC]]. Результат выполнения приходит отдельным событием [[Подключение_к_ExtSdk2_через_OLE_-_Сценарии_ExtSdk2#Событие Event #ASYNC|Event #ASYNC]].
+
Кроме асинхронных вызовов, сами команды ExtSdk2 могут выполняться асинхронно. В основном это касается методов отправки. Такие методы в качестве ответа возвращают специальный тип ошибки [[Обработка_ответов_от_плагина_-_Сценарии_ExtSdk2#Событие Error #ASYNC|Error #ASYNC]]. Результат выполнения приходит отдельным событием [[Обработка_ответов_от_плагина_-_Сценарии_ExtSdk2#События Event #ASYNC|Event #ASYNC]].
  
 
Такой подход обусловлен тем, что изначально предполагалось исключительно синхронное выполнение методов внутри СБИС3 Плагин.  
 
Такой подход обусловлен тем, что изначально предполагалось исключительно синхронное выполнение методов внутри СБИС3 Плагин.  
  
 
Рекомендуем ознакомиться с примером реализации подключения к ExtSdk2 на python или 1С. Данный пример эмулирует синхронную работу кода информационной системы.  
 
Рекомендуем ознакомиться с примером реализации подключения к ExtSdk2 на python или 1С. Данный пример эмулирует синхронную работу кода информационной системы.  
 
<syntaxhighlight lang="python" line='line'>
 
 
    ole = win32com.client.Dispatch("Tensor.SbisPluginClientCOM")
 
 
    guid_module = ole.GetModule(name)
 
 
    query_id = str(uuid.uuid4())
 
    module_method = "ExtSdk2.AuthByPassword"
 
    parameters_module_method = json.dumps({"Login": "login", "Password": "password"}, ensure_ascii=True)
 
    domain = online.sbis.ru
 
 
    CallMethodWithoutAuth( query_id, guid_module, module_method, parameters_module_method, domain )
 
 
    answer = read_all_object( query_id )
 
 
    session_id = answer[ 'Result' ]
 
 
    def read_all_object( query_id ):
 
       
 
        # Словарь с функциями обработки событий по типу
 
        supported_events = {
 
            'Message': parse_Message,
 
            'Error': parse_Error,
 
            'Event': parse_Event
 
        }
 
 
        json_string = ole.ReadAllObject()
 
        events = json.loads(json_string)
 
 
        for event in events:
 
            event_type = event.get('type')
 
            supported_events[event_type](event)
 
            if( event[ 'queryID' ] == query_id )
 
              return event[ 'data' ]
 
 
</syntaxhighlight>
 
 
 
В ответ на команды СБИС3 Плагин отправляет события, кроме этого аналогичным образом передаются события из СБИС. Таким образом в любой момент времени вы можете получать события как на свои вызовы, так и просто события ExtSdk2
 
 
События бывают трех типов: '''Message''', '''Error''', '''Event''', которые следует разобрать и найти ответ по переданному '''query_id'''
 
 
=== Примеры событий от модуля ===
 
 
=== Событие Message ===
 
Событие типа Message содержит '''queryID''' вызываемого метода и результат работы в поле 'Result'.
 
<syntaxhighlight lang="json">
 
{
 
  'type': 'Message',
 
  'queryID': '15e79572-b1be-4dc2-a0e9-3652ecb187c5',
 
  'data': {
 
    'Result': ...,
 
    'Stat': ...
 
    }
 
  }
 
}
 
</syntaxhighlight>
 
=== Событие Error ===
 
Событие типа Error содержит '''queryID''' вызываемого метода и объект ошибки в поле 'data'.
 
<syntaxhighlight lang="json">
 
{
 
  'type': 'Error',
 
  'queryID': '15e79572-b1be-4dc2-a0e9-3652ecb187c5',
 
  'data': {
 
    'code': ...,
 
    'detail': ...,
 
    'dump': {},
 
    'message': ...,
 
    'method_name': 'ExtSdk2....',
 
    ...
 
  }
 
}
 
</syntaxhighlight>
 
 
=== Событие Error #ASYNC ===
 
<syntaxhighlight lang="json">
 
{
 
  'type': 'Error',
 
  'queryID': 'b3e310ec-7d85-4026-bfad-228690f38d55',
 
  'data': {
 
    'code': 308,
 
    'detail': '#ASYNC',
 
    'dump': {},
 
    'message': 'Ожидайте загрузки документа',
 
    'method_name': 'ExtSdk2.WriteDocumentEx',
 
    'stack': [
 
      {
 
        'method_name': 'AsyncUploadAttachments b3e310ec-7d85-4026-bfad-228690f38d55'
 
      }
 
    ]
 
  }
 
}
 
</syntaxhighlight>
 
 
=== Событие Event ===
 
Событие типа Event содержит '''queryID''' вызываемого метода и имя события в поле 'eventName'.
 
<syntaxhighlight lang="json">
 
{
 
  'type': 'Event',
 
  'data': {
 
    'channelName': 'SbisPluginEvent',
 
    'eventName': 'connected',
 
    'type': 'object',
 
    'data': ...
 
  }
 
  'queryID': '15e79572-b1be-4dc2-a0e9-3652ecb187c5'
 
}
 
</syntaxhighlight>
 
 
=== Событие Event #ASYNC ===
 
<syntaxhighlight lang="json">
 
{
 
  'type': 'Event',
 
  'data': {
 
    'channelName': 'SbisPluginEvent',
 
    'eventName': 'extsdk2.async.complete',
 
    'type': 'object',
 
    'data': {
 
      'QueryId': '4fb98709-0264-4e01-a0aa-e4d30b4b65a7',
 
      'Result': {...},
 
      'Stat': {...}
 
    }
 
  }
 
}
 
</syntaxhighlight>
 
  
 
[[Категория:Сценарии ExtSdk2]]
 
[[Категория:Сценарии ExtSdk2]]

Версия 10:43, 2 июня 2021

Краткое описание

Подключение к OLE объекту

Основным способом для подключения к ExtSdk2 из внешних систем является OLE объект "Tensor.SbisPluginClientCOM". Данный OLE объект устанавливается на ПК пользователя при полной установке СБИС3 Плагин. Обновляется OLE объект автоматически вместе с обновлением СБИС3 Плагин. Подключение к OLE объекту аналогично работе с другими OLE объектами.

В момент подключения, OLE объект устанавливает WebSocket соединение с СБИС3 Плагин, по этому до отправки первой команды нужно убедиться, что данное подключение установлено дождавшись событие "connected" (type=Event, data.eventName=connected). . Подробнее см. в разделе Получение и обработка событий.

Подготовительные операции

ExtSdk2 является расширением (модулем) СБИС3 Плагин. При обращении к модулю плагину требуется указывать идентификатор модуля. Получить идентификатор ExtSdk можно при помощи команды ole.GetModule.


Кроме идентификатора модуля, для отправки команд в ExtSdk2 вызывающая сторона (клиент) должен быть аутентифицирован. Для аутентификации в ExtSdk2 доступны несколько вариантов. Результатом аутентификации является полученный идентификатор сессии который следует передавать при каждом вызове ExtSdk2 (допускается на одном соединении вызов команд из разных сессий).

Важно! Рекомендуется хранить данный идентификатор сессии между подключениями и вызывать аутентификацию только при получении ошибки аутентификации.

Вызов команд

Для взаимодействия с OLE объектом, в зависимости от возможностей Вашей системы, можно использовать либо JSON либо XML (в данном случае XML это безусловно сериализованный в XML JSON). Структура передаваемых данных идентична в обоих вариантах, выбор вариант зависит от наличия в ИС и скорости работы соответствующего парсера. В наших интеграционных модулях для 1С и SAP из-за необходимости поддержки старых версий используется XML.

Все вызовы СБИС3 Плагин асинхронны - вы отправляете команду и ждете сообщения о результатах выполнения команды. Для отправки команды, в зависимости от формата работы, нужно вызвать метод ole.CallMethod или ole.CallMethodXML (исключение составляют команды аутентификации, их следует вызывать при помощи методов CallMethodWithoutAuth и CallMethodWithoutAuthXML). В ответ вы получите идентификатор запроса (UUID), данный идентификатор будет присутствовать в событии ответа и по нему вы сможете понять к какому запросу относится данное событие.

Со списком всех доступных команд Вы можете ознакомиться. В изложены наиболее оптимальные алгоритмы работы с ExtSdk2.

Получение и обработка событий

Работа с ExtSdk2 и СБИС3 Плагин осуществляется асинхронно, т.е. в ответ на ваш вызов Вы получите только его идентификатор, а не результат или ошибку. Для получения результата требуется делать периодический вызов функции ole.ReadAllObject или ole.ReadAllXml2 (в зависимости от формата обмена). Данные функции возвращают все события которые поступили от плагина с момента последнего вызова этой функции (или запуска плагина если это первый вызов).

По мимо событий содержащих результат вызова команды, в OLE Объект могут приходить события содержащие прогресс выполнения длительной операции (например загрузки больших файлов) или события произошедшие в СБИС, например распознавание документа и т.п. В интеграционных модулях рекомендуется построить обработку событий на принципах регистрации и вызова обработчика обратного вызова. Интеграционный модуль должен игнорировать не интересующие или неожиданные события.

Кроме асинхронных вызовов, сами команды ExtSdk2 могут выполняться асинхронно. В основном это касается методов отправки. Такие методы в качестве ответа возвращают специальный тип ошибки Error #ASYNC. Результат выполнения приходит отдельным событием Event #ASYNC.

Такой подход обусловлен тем, что изначально предполагалось исключительно синхронное выполнение методов внутри СБИС3 Плагин.

Рекомендуем ознакомиться с примером реализации подключения к ExtSdk2 на python или 1С. Данный пример эмулирует синхронную работу кода информационной системы.