Подключение к ExtSdk2 через OLE - Сценарии ExtSdk2
Для работы со СБИС3 Плагин из внешних систем, таких как 1С или SAP, требуется получить COM-объект, зарегистрированный Плагином в Вашей системе. Его название "Tensor.SbisPluginClientCOM". Все примеры кода указаны на языке Python.
Содержание
Получение COM-объекта
ole = win32com.client.Dispatch("Tensor.SbisPluginClientCOM")
Получение COM-объекта занимает одну строку ole = win32com.client.Dispatch("Tensor.SbisPluginClientCOM") с использованием библиотеки pywin32. Далее Плагин подготавливает необходимые внутренние инструменты для подключения и в случае успеха пробрасывает событие Event в виде json сериализованного в строку. У данного события в объекте 'data' лежит поле 'eventName' со значением '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 с помощью функции COM-объекта GetModule.
Вызов методов ExtSdk2 выполняется через вызов методов COM-объекта. Метод CallMethodWithoutAuth вызывается для авторизации в плагине и позволяет получить идентификатор сессии - account_id. С данным идентификаторов следует вызывать все остальные методы модуля через CallMethod.
Для интегрируемых систем, работающих с xml, следует использовать CallMethodWithoutAuthXML и CallMethodXML соответственно.
Пример получения ответов от COM-объекта
json_string = ole.ReadAllObject()
ReadAllObject функция COM-объекта, возвращающая json массив событий в виде строки.
Для интегрируемых систем, работающих с xml, следует использовать ReadAllXml2.
xml_string = ole.ReadAllXml2()
События бывают трех типов: Message, Error, Event, которые следует разобрать и найти ответ по переданному query_id
Примеры событий от модуля
Событие Message
Событие типа Message содержит queryID вызываемого метода и результат работы в поле 'Result'.
{
'type': 'Message',
'queryID': '15e79572-b1be-4dc2-a0e9-3652ecb187c5',
'data': {
'Result': ...,
'Stat': ...
}
}
}
Событие Error
Событие типа Error содержит queryID вызываемого метода и объект ошибки в поле 'data'.
{
'type': 'Error',
'queryID': '15e79572-b1be-4dc2-a0e9-3652ecb187c5',
'data': {
'code': ...,
'detail': ...,
'dump': {},
'message': ...,
'method_name': 'ExtSdk2....',
...
}
}
Событие Event
Событие типа Event содержит queryID вызываемого метода и имя события в поле 'eventName'.
{
'type': 'Event',
'data': {
'channelName': 'SbisPluginEvent',
'eventName': 'connected',
'type': 'object',
'data': ...
}
'queryID': '15e79572-b1be-4dc2-a0e9-3652ecb187c5'
}
Пример функции обработки одной страницы событий
def read_all_object():
# Словарь с функциями обработки событий по типу
supported_events = {
'Message': parse_Message,
'Error': parse_Error,
'Event': parse_Event
}
result = []
json_string = ole.ReadAllObject()
events = json.loads(json_string)
for event in events:
event_type = event.get('type')
supported_events[event_type](event)
result.append(event)
return result
Функция read_all_object может быть модифицирована с добавлением параметра query_id. Тогда она будет постоянно опрашивать плагин на наличие ответа от вызываемого метода, игнорируя все остальные.
Реализация функций parse_Message, parse_Error, parse_Event зависит от потребностей пользователя, например получения только поля 'data' у события, и поэтому может быть описана самостоятельно. В текущем варианте представлен пример для получения полной информации по пришедшим событиям.