Перейти к содержимому
Настройка 1С
Решения по использованию программ 1С. Техподдержка. Сопровождение. Услуги программистов.
Пару слов об использовании внешней обработки СБИС в тандеме с 1С. Клиент получил новую ЭП — ключ создан на сберовском токене InfoCrypt VPN-Key-TLS. Все хорошо, но обработка СБИС для 1С в упор не замечала сертификат.
При этом в КриптоПро CSP — все ок. Контейнер виден, ошибок нет, сертификат установлен.
Как настроить подобную связку
Рассмотрим возможные ошибки и варианты решений. Ну что, подправить причёски — погнали.
❃ В окне обработки СБИС не дает выбрать вход по сертификату
► Перейдите в настройки и выберите другой способ обмена. Вход по ЭП доступен в ExtSDK и SDK.
❃ СБИС не находит установленный сертификат с VPN-Key-TLS
► Закройте СБИС Плагин. В конфигурационный файл «%LocalAppData%Sbis3Pluginuser-config.ini» добавьте строки:
[Считыватели]
РежимАктивныхСчитывателейКриптоПро5=true
Повторно запустите СБИС Плагин.
❃ Ошибка при создании COM-объекта (Не зарегистрирована компонента Tensor.SbisPluginClientCOM {ВнешняяОбработка.СБИС.Форма.ExtSDK.Форма(2339)}:
Ошибка при вызове конструктора (COMОбъект):
-2147221005(0х800401F3): Недопустимая строка с указанием класса)

► Причины: не запущен или не установлен СБИС Плагин. Одно из решений — установить или обновить Плагин.
В случае, если Плагин работает, но ошибка сохраняется:
- Переустановите СБИС Плагин вручную, указав режим полной конфигурации. Для того, чтобы подтянулся модуль для ExtSDK.
- Зарегистрируйте COM-объект вручную.
- Обновите компоненты .NET Framework и перезагрузите ПК.
- Выполните диагностику рабочего места.
✅ Успехов вам!
__________
Если не получается или требуется дополнительная поддержка, наши программисты 1С готовы помочь → +7-911-500-10-11
Обновлено 15.02.2022

Добрый день! Уважаемые читатели и гости одного из крупнейших IT блогов в рунете Pyatilistnik.org. В прошлый раз мы с вами разобрали замечательную утилиту командной строки robocopy, и с ее помощью научились создавать точные копии папок, двигать их в нужное расположение и многое другое. В сегодняшней публикации я покажу вам, как устранять ошибку «Сервер RPC недоступен (The rpc server is unavailable)», покажу примеры, когда ее мониторинг очень важен в работе корпоративных сервисов.
Для чего нужна служба «Удаленный вызов процедур (RPC)»
Удаленный вызов процедур (RPC) — это протокол, который одна программа может использовать для запроса услуги у программы, расположенной на другом компьютере в сети, без необходимости разбираться в деталях сети. RPC используется для вызова других процессов на удаленных системах, таких как локальная система. Вызов процедуры также иногда называют вызовом функции или вызовом подпрограммы .
RPC использует модель клиент-сервер. Запрашивающая программа — это клиент, а программа, предоставляющая услуги, — это сервер. Подобно обычному или локальному вызову процедуры, RPC — это синхронная операция, требующая приостановки запрашивающей программы до тех пор, пока не будут возвращены результаты удаленной процедуры. Однако использование облегченных процессов или потоков, которые совместно используют одно и то же адресное пространство, позволяет одновременно выполнять несколько RPC.
Язык определения интерфейса (IDL) — язык спецификации, используемый для описания интерфейса прикладного программирования (API) программного компонента — обычно используется в программном обеспечении удаленного вызова процедур. В этом случае IDL обеспечивает мост между машинами на обоих концах связи, которые могут использовать разные операционные системы (ОС) и компьютерные языки.
Процедура сообщения RPC
Когда программные операторы, использующие структуру RPC, компилируются в исполняемую программу, в скомпилированный код включается заглушка, которая выступает в качестве представителя кода удаленной процедуры. Когда программа запускается и выполняется вызов процедуры, заглушка получает запрос и пересылает его клиентской программе и времени выполнения на локальном компьютере. При первом вызове клиентской заглушки она связывается с сервером имен, чтобы определить транспортный адрес, по которому находится сервер.
Программа среды выполнения клиента знает, как обращаться к удаленному компьютеру и серверному приложению, и отправляет сообщение по сети, которое запрашивает удаленную процедуру. Точно так же сервер включает исполняющую программу и заглушку, которая взаимодействует с самой удаленной процедурой. Протоколы ответа-запроса возвращаются таким же образом.
Данная служба есть в любой операционной системе Windows, начиная от Windows 7 и заканчивая Windows 11 и в любой из Windows Server редакции.
Как работает RPC?
Когда вызывается служба RPC (удаленный вызов процедуры), вызывающая среда приостанавливается, параметры процедуры передаются по сети в среду, в которой должна выполняться процедура, а затем процедура выполняется в этой среде. Когда процедура завершается, результаты передаются обратно в вызывающую среду, где выполнение возобновляется, как если бы оно возвращалось из обычного вызова процедуры.
Во время RPC выполняются следующие шаги:
- Клиент вызывает клиентскую заглушку. Вызов представляет собой вызов локальной процедуры с параметрами, помещенными в стек обычным способом.
- Клиентская заглушка упаковывает параметры процедуры в сообщение и выполняет системный вызов для отправки сообщения. Упаковка параметров процедуры называется маршалингом.
- Локальная ОС клиента отправляет сообщение с клиентского компьютера на удаленный сервер.
- Серверная ОС передает входящие пакеты на серверную заглушку.
- Заглушка сервера распаковывает параметры из сообщения — это называется демаршалингом .
- Когда серверная процедура завершается, она возвращается к серверной заглушке, которая маршалирует возвращаемые значения в сообщение. Затем заглушка сервера передает сообщение на транспортный уровень.
- Транспортный уровень отправляет полученное сообщение обратно на клиентский транспортный уровень, который возвращает сообщение клиентской заглушке.
- Клиентская заглушка не упорядочивает возвращаемые параметры, и выполнение возвращается вызывающей стороне.
Клиент RPC по 135 порту подключается к службе RPC Endpoint Mapper (сопоставления конечных точек), а далее уже запрашивает номер порта, где запущено нужное RPC приложение. Служба сопоставления конечных точек вернет клиенту RPC номер динамического RPC порта (диапазон 1024 – 65535), на котором работает нужная служба. Дальше уже все взаимодействие идет по TCP порту
Если вы видите ошибку «Сервер RPC недоступен” (The RPC server is unavailable)», то у вас точно недоступен порт 135. Это может быть критичным для ряда ситуации. Например вы не сможете сохранить настройки RDS фермы, если у одного из хостов RDSH есть проблемы с RPC, то вы будите видеть ошибку «Could not change the connection state for server», вы не сможете перевести его в режим обслуживания (Drain Mode)

Или в приложении Terminal Services Manager будет ошибка при попытке получения данных «Сервер RPC недоступен«.

Так же RPC может быть причиной проблемы в репликации контроллеров домена, где в логах Windows будет фигурировать ошибка ID 1722. Это очень не приятный момент, который может привести к большим проблемам.
Типы RPC
Существует пять типов RPC:
- Обычный метод работы, при котором клиент выполняет вызов и не продолжает работу до тех пор, пока сервер не вернет ответ.
- Клиент звонит и продолжает свою обработку. Сервер не отвечает.
- Средство для отправки нескольких клиентских неблокирующих вызовов в одном пакете.
- У клиентов RPC есть средство широковещательной рассылки, т. е. Они могут отправлять сообщения на множество серверов, а затем получать все полученные ответы.
- Клиент делает неблокирующий вызов клиент/сервер; сервер сигнализирует о завершении вызова путем вызова процедуры, связанной с клиентом.
Почему может не работать служба RPC
- Удаленный компьютер с которым идет взаимодействие выключен
- На удаленном сервере не запущена или перестала работать служба RPC
- Подключение по RPC происходит не к тому серверу (Может быть проблема с DNS или IP адресом)
- Есть блокировки между клиентом и сервером на фаэрволе
- Используются некорректные настройки сетевого подключение на клиенте или сервере
Преимущества удаленного вызова процедур
К преимуществам удаленного вызова процедур можно отнести следующее:
- помогает клиентам общаться с серверами посредством традиционного использования вызовов процедур на языках высокого уровня;
- может использоваться как в распределенной, так и в локальной среде;
- поддерживает процессно-ориентированные и поточно-ориентированные модели;
- скрывает внутренний механизм передачи сообщений от пользователя;
- требует минимальных усилий для переписывания и повторной разработки кода;
- обеспечивает абстракцию, т. е. характер передачи сообщений по сети скрыт от пользователя;
- опускает многие уровни протокола для повышения производительности.
Недостатки RPC
Некоторые из недостатков RPC включают следующее:
- Клиент и сервер используют разные среды выполнения для своих соответствующих подпрограмм, и использование ресурсов, например файлов, также является более сложным. Следовательно, системы RPC не подходят для передачи больших объемов данных.
- RPC очень уязвим для сбоев, потому что он включает в себя систему связи, другую машину и другой процесс.
- Единого стандарта для RPC не существует; это может быть реализовано множеством способов.
- RPC основан только на взаимодействии и, как таковой, не предлагает гибкости, когда дело касается аппаратной архитектуры.
Проверка доступности службы RPC
- Как я и писал выше, в первую очередь вы должны убедиться, что удаленный компьютер к которому вы делаете проверку RPC доступен по сети. Для этого элементарно откройте командную строку или оболочку PowerShell и воспользуйтесь командой Ping, NSlookup, Test-NetConnection. Я буду производить проверку службы удаленного вызова в PowerShell. Выполним для начала команду Ping. Мой удаленный сервер называется SVT201S01.root.pyatilistnik.org. Пишем команду:
ping SVT201S01.root.pyatilistnik.org
Если вдруг компьютер не ответил, то это не значит, что он не работает, может работать брандмауэр и просто блокировать ping пакеты.
- Далее выполните Nslookup, чтобы удостовериться, что нужное вам имя компьютера преобразовывается в нужный IP-адрес. Выполните:
nslookup SVT201S01.root.pyatilistnik.org
Небольшой пример из практики, предположим, что вы мигрировали сервер в другую подсеть, в итоге в DNS должна быть изменена соответствующая запись, но Windows это поймет не сразу, так как у нее есть свой локальный кэш, он живет 15 минут, поэтому если при проверке DNS имени вам выдается не тот IP-адрес, вам необходимо произвести очистку кэша DNS.

- Далее я вам советую проверить отвечает ли порт. Напоминаю, что служба RPC Endpoint Mapper слушает порт под номером 135. В PowerShell введите команду:
Test-NetConnection svt2019s01.root.pyatilistnik.org -Port 135
Если удаленный RPC порт доступен вы в в строке TcpTestSucceeded будет стоять статус «True».

Если будет порт закрыт или блокируется, то ошибка «Сервер RPC недоступен (The rpc server is unavailable)» вам обеспечена. Поняв, что порт не отвечает, нужно удостовериться, что трафик от клиента до сервера не блокирует фаервол. По умолчанию в любой версии Windows есть встроенный брандмауэр. На время тестирования и поиска причины, я советую его выключить для всех профилей. Сделаем мы это через командную строку:
Netsh Advfirewall set allprofiles state off
Данная команда выключит брандмауэр на всех трех профилях сетевой карты.

Далее если порт 135 стал доступен, то можно делать правила на удаленном сервере. Напоминаю, что нужно сделать правило для трех служб:
- Remote Procedure Call (RPC) — Удаленный вызов процедур (RPC)
- RPC Endpoint Mapper — Сопоставитель конечных точек RPC
- COM Server Process Launcher — Модуль запуска процессов DCOM-сервера
Подробнее, о том как сделать правила — https://docs.microsoft.com/en-us/windows/security/threat-protection/windows-firewall/create-inbound-rules-to-support-rpc)
Еще хочу отметить, что если у вас есть сторонние антивирусные решения, например Касперский, то там так же есть встроенный сетевой экран, где так же нужно будет создать необходимые, разрешающие правила, которые корректно будут обрабатывать трафик динамических RPC портов.
Проверка работы служб RPC
Следующим шагом является проверка состояния службы на нужном вам сервере или компьютере. Проверять следует три службы:
- Remote Procedure Call (RPC) — Удаленный вызов процедур (RPC)
- RPC Endpoint Mapper — Сопоставитель конечных точек RPC
- COM Server Process Launcher — Модуль запуска процессов DCOM-сервера
В оболочке PowerShell выполните команду:
Для локального сервера — Get-Service RpcSs,RpcEptMapper,DcomLaunch| Select DisplayName,Status,StartType
Для удаленного выполнения Enter-PSSession svt2019s01 далее Get-Service RpcSs,RpcEptMapper,DcomLaunch| Select DisplayName,Status,StartType
Напоминаю, что в команде svt2019s01, это имя удаленного сервера. Как видно из примера, все службы RPC запущены и имею автоматический тип запуска.

Если службы не запущены, то откройте оснастку «services.msc’, зайдите в свойства службы и выставите автозапуск и попробуйте запустить вручную.

Если по каким, то причинам вы не можете запустить службу из оснастки, то можно это сделать через реестр (Кстати реестр можно править и удаленно). Для этого есть несколько веток, но для начала откройте окно «Выполнить» и введите regedit.

- Модуль запуска процессов DCOM-сервера — HKEY_LOCAL_MACHINESYSTEMCurrentControlSetservicesDcomLaunch
- Сопоставитель конечных точек RPC — HKEY_LOCAL_MACHINESYSTEMCurrentControlSetservicesRpcEptMapper
- Удаленный вызов процедур (RPC) — ветка реестра HKEY_LOCAL_MACHINESYSTEMCurrentControlSetservicesRpcSs
В каждом из этих расположений есть ключик «Start«, выставите ему значение «2«, это будет означать автоматический запуск службы.

Дополнительные сетевые проверки
В некоторых случаях причиной ошибок с доступностью RPC выступает сбой на сетевых адаптерах. Помогает сброс сетевых настроек и перезагрузка. В сети с Active Directory, старайтесь, чтобы на всех ваших сетевых адаптерах в свойствах были выставлены обе галки IPV4 и IPV6, особенно это актуально для контроллеров домена, где вы легко можете получать ошибку 1722. Еще может помочь отключение протокола Teredo у IPv6. В командной строке выполните:
netsh interface teredo set state disabled
Для включения обратно введите:
netsh interface teredo set state enabled
Еще на сайте Майкрософт пишут, что необходимо на сервере RPC иметь включенную службу «Удаленный реестр«. На этом у меня все, с вами был Иван Сёмин, автор и создатель IP портала Pyatilistnik.org.
RPC – это способ обмена информацией между процессами или между клиентом (устройством, инициирующем связь RPC) и сервером (устройством, которое с ним связывается) в сети или системе. Многие встроенные компоненты Windows используют RPC, который в качестве отправной точки для связи между системами применяет различные порты. При возникновении неполадок возникает сообщение «Сервер RPC недоступен».

Решение ошибки «Сервер RPC недоступен».
Причины появления ошибки
В типичном сеансе RPC клиент связывается с программой сопоставления конечных точек сервера по TCP-порту 135 и для указанной службы требует определённого номера динамического порта. Сервер отвечает, отправив IP-адрес и номер порта, для которого служба зарегистрирована в RPC после её запуска, а затем связывается с клиентом с указанным IP-адресом и номером порта. Возможные причины ошибки «Сервер RPC недоступен» следующие:
- Остановка службы RPC – когда служба RPC на сервере не запущена.
- Проблемы с разрешением имён – имя сервера RPC может быть связано с неправильным IP-адресом. Это значит, что клиент связывается с неправильным сервером или пытается связаться с IP-адресом, который в настоящее время не используется. Возможно, имя сервера не распознаётся вообще.
- Трафик заблокирован брандмауэром – брандмауэр или другое приложение безопасности на сервере или брандмауэр устройства между клиентом и сервером могут препятствовать доступу трафика к TCP-порту сервера 135.
- Проблемы с подключением – проблема с сетью может быть причиной отсутствия соединения между клиентом и сервером.

Способы решения
При запуске или установке некоторых программ вы можете получить сообщение «Сервер RPC недоступен». Это часто связано с синхронизацией времени, необходимой для запуска программы. Без этого некоторые приложения могут работать неправильно или не запускаться вообще. Что делать, чтобы сообщение больше не появлялось, рассмотрим далее.
Код ошибки 1722
Ошибка 1722 «Сервер PRC недоступен» может возникать при использовании сетевого принтера или звуковых устройств в седьмой версии Windows. Причиной может быть антивирусная программа, блокирующая коммуникационные порты – для её устранения нужно найти параметры управления доверенными программами в настройках антивируса.

Также ошибка может возникнуть из-за того, что в системе присутствует сам вирус – стоит проверить систему и диск с помощью другой антивирусной программы, чем в настоящее время. Для устранения нажмите Пуск/Настройки/Панель управления. Затем откройте Администрирование/Службы. Появится окно, в котором с правой стороны вы найдете «Сервер». На «Сервере» проверьте, включён ли автоматический тип запуска. Измените параметр при необходимости и перезагрузите компьютер.

Отключение брандмауэра Windows
Если при печати в Windows 7 появляется ошибка «Сервер RPC недоступен», проблема может крыться в брандмауэре. Он отвечает за блокировку доступа к компьютеру во внутренней или внешней сети посторонними лицами или приложениями, что исключает возможность контроля ПК. Ниже приведены некоторые советы, которые позволят вам отключить (в случае, если вы хотите использовать для этого другое приложение) и включить интегрированный брандмауэр Windows. Измените имя компьютера с помощью «Настроек»:
- Это один из самых простых способов отключения сетевого брандмауэра. Для этого используйте вкладку «Параметры системы».
- Из списка доступных опций выберите «Сеть и Интернет».
- Перейдите на вкладку Ethernet и выберите «Брандмауэр Windows» с правой стороны окна.
- Выберите включение и отключение брандмауэра.
- В списке доступных операций выберите параметр «Отключить брандмауэр Windows» (не рекомендуется).
- Нажмите «ОК». Брандмауэр выключен.

Следующий способ – редактор локальной групповой политики (GPO):
- Нажмите клавиши Win + R и введите «gpedit.msc». Откроется редактор локальной групповой политики.
- Параметр, ответственный за отключение брандмауэра, расположен по адресу
«Конфигурация компьютера» – «Административные шаблоны» – «Сеть» – «Сетевые подключения» – «Стандартный профиль» – «Брандмауэр Windows: защита всех сетевых подключений».
- Измените состояние настройки на «ВЫКЛ».
- После нажатия кнопки «ОК» или «Применить» брандмауэр Windows перестанет работать.

Для более опытных пользователей вышеупомянутый сценарий можно выполнить с помощью редактора реестра.
- нажмите пуск и введите «regedit», запустите приложение от имени администратора;
- в окне редактора найдите каталог
HKLMSYSTEMCurrentControlSetServicesSharedAccessParametersFirewallPolicyDomainProfile;
- найдите параметр EnableFirewall и измените его значение с 1 на 0;
- таким же образом отредактируйте ключ EnableFirewall в следующем каталоге
HKLMSYSTEMCurrentControlSetServicesSharedAccessParametersFirewallPolicyPublicProfile;
- и последний каталог с ключом EnableFirewall
HKLMSYSTEMCurrentControlSetServicesSharedAccessParametersFirewallPolicyStandardProfile.
Закройте редактор реестра и перезагрузите компьютер. С этого момента брандмауэр Windows отключается. Чтобы снова возобновить брандмауэр с помощью редактора реестра, просто измените указанные выше значения с названием EnableFirewall с 0 на 1, и перезапустите компьютер.
Ручной запуск задачи services.msc
При запуске или установке некоторых программ вы можете получить сообщение «Сервер RPC недоступен». Это часто связано с синхронизацией времени, необходимой для запуска программы. Без этого некоторые приложения могут работать неправильно или не запускаться вообще. При недоступности функции может произойти сбой, для исправления необходимо включить службу синхронизации:
- сначала нажмите меню «Пуск» и в строке поиска введите «Выполнить», нажмите «Enter»;
- в следующем окне введите services.msc и подтвердите кнопкой «OK»;
- найдите в списке элемент «Служба времени Windows»;
- дважды щёлкните эту службу. Откроется меню, в котором вы должны нажать кнопку «Выполнить».

С этого момента сообщение «RPC-сервер недоступен» появляться не должно.
Устранение неполадок Windows
Исправить ошибку в Windows 10 поможет встроенное средство устранения неполадок системы. Перезагрузите компьютер и после подачи звукового сигнала нажимайте кнопку F8 раз в секунду, пока не откроется меню выбора вариантов загрузки. Первым из них будет «Устранение неполадок компьютера». Выберите это действие и дождитесь окончания операции.
Ошибка в FineReader
Проблема может возникать в Windows 8 и выше и при попытке запуска службы ABBYY FineReader Licensing Service. Для проверки состояния в списке служб (как его найти, описано выше) выберите ABBYY FineReader Licensing Service. В окне свойств убедитесь, что параметр «Тип запуска» установлен на «Автоматический». При необходимости измените его, закройте редактор кнопкой «ОК» и перезагрузите компьютер.

Проверка на вирусы
В Windows XP и выше сообщение о неисправности может быть вызвано наличием вируса. Просканируйте свой ПК с помощью антивирусной программы, следуя указаниям мастера. В Windows 10 можно воспользоваться стандартным «Защитником». Для этого нажмите правой кнопкой мыши на значок «Щит» возле часов и выберите «Открыть». Запустите проверку на вирусы нажатием соответствующей кнопки в окне.

Как видите, избавиться от ошибки можно многими способами. В этом списке представлены наиболее вероятные варианты исправления ошибки. При необходимости придётся переустановить операционную систему, воспользовавшись установочным диском.
На чтение 3 мин Просмотров 253 Опубликовано 15.08.2022 Обновлено 13.10.2022
В последнее время многие пользователи жалуются на возникновение ошибки RPC в процессе авторизации в Xiaomi. Например, некоторые жалуются на то, что после «заморозки» Титаниум служб Xiaomi, по каким-то причинам они не вышли из Mi –аккаунта. Через некоторое время может появиться темный экран с уведомлением о том, что устройство было заблокировано. Могут появиться сообщения: «Данное устройство связано с существующим MI аккаунтом» или «Ошибка RPC».
Кроме того, может появиться уведомление о необходимости ввести пароль для проверки девайса. Несмотря на все попытки пользователя сделать что-либо, это не является возможным. Единственное, что доступно для владельца смартфона – это ввод пароля. Даже если ввести его верно, система выдаст сообщение о том, что выполнить вход не получилось. При этом система ссылается на ошибку RPC.
При авторизации устройства, система предложит перейти по адресу https://i.mi.com для разблокировки аппарата. Некоторые люди делают это или нажимают на «Sign In», вводят пароль от Mi – аккаунта, но при этом возможность разблокировать девайс все равно не появится.
Что это такое?
Суть в том, что производитель довольно часто предлагает пользователям установить обновления на устройства для повышения безопасности работы гаджета. Зачастую данная проблема дает о себе знать в момент смены китайского программного обеспечения на глобальную версию прошивки.
Есть несколько типов ошибок при входе в MI- профиль, например:
- Ошибка 4001.
- Сессия истекла. Попробуйте зайти еще раз.
- Нет кнопок «Отмена» или «ОК».
- Отсутствует подключение к сети.
Важно! Вина разработчика в этом отсутствует. Если владелец гаджета захочет перепрошить телефон, либо сделать откат до предыдущей версии, то следует уяснить, что в данном случае ответственность за проведение процедуры ляжет на его плечи.
Иногда владельцы смартфонов сталкиваются с неполадкой из-за того, что они не знают, была ли пройдена регистрация в Ми-аккаунте или нет.
Как исправить ошибку?
Для начала нужно будет установить на ПК специальную утилиту «Xiaomi Flash Tool», далее нужно будет открыть на компьютере папку «MI», там найти файл ехе и запустить его.
Операционная система запросит разрешение на открытие. Нужно подтвердить действие. В новом окне потребуется сменить язык (справа сверху). Программа закроется, ее нужно будет заново запустить. Она вновь станет доступной, но на английском языке.
Авторизацию выполнить через xiaomi id, электронную почту или номер мобильного телефона. Начнётся проверка, далее будет выслан код подтверждения для входа. Если возникнет ошибка «Unauthorized xiaomi account», можно сделать вывод, что регистрация пройдена не была.
Содержание
- 1 Краткое описание
- 1.1 Подключение к OLE объекту
- 1.2 Подготовительные операции
- 1.3 Вызов команд
- 1.4 Получение и обработка событий
Краткое описание
Подключение к 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 (в зависимости от формата обмена Json или XML). Данные функции возвращают все события которые поступили от плагина с момента последнего вызова этой функции (или запуска плагина если это первый вызов). Между вызовами ReadAllObject и ReadAllXml2 необходимо делать таймаут 100-500мс, для этого можно воспользоваться методом ole.Sleep
По мимо событий содержащих результат вызова команды, в OLE Объект могут приходить события содержащие прогресс выполнения длительной операции (например загрузки больших файлов) или события произошедшие в СБИС, например распознавание документа и т.п. В интеграционных модулях рекомендуется построить обработку событий на принципах регистрации и вызова обработчика обратного вызова. Интеграционный модуль должен игнорировать не интересующие или неожиданные события.
Кроме асинхронных вызовов, сами команды ExtSdk2 могут выполняться асинхронно. В основном это касается методов отправки. Такие методы в качестве ответа возвращают специальный тип ошибки Error #ASYNC. Результат выполнения приходит отдельным событием Event #ASYNC. Такой подход обусловлен тем, что изначально предполагалось исключительно синхронное выполнение методов внутри СБИС3 Плагин.
Более подробно о событиях
Рекомендуем ознакомиться с примером реализации подключения к ExtSdk2, аутентификации и вызова одного метода на python. Данный пример не следует использовать как образец. Приведен только для понимания работы с модулем.
import win32com.client
import json
import uuid
"""Шаг 1. Подключение к СБИС3.Плагин"""
ole = win32com.client.Dispatch("Tensor.SbisPluginClientCOM") # Получаем COM объект
# При получении COM объекта плагин генерирует событие типа 'Event' c eventName=connected,
# поэтому если среди полученных ответов от ReadAllObject() есть событие стаким eventName, то вам удалось подключиться
# к плагину, иначе стоит сделать таймаут 100 - 500мс и повторить вызов ReadAllObject().Пример цикла.
# состояние подключения = False
connect = False
while not connect:
events = json.loads(ole.ReadAllObject()) # получаем события от плагина и преобразуем в массив json объектов
# в цикле проходим по каждому событию и ищем нужное с eventName=connected
for event in events:
if event['type'] == 'Event' and event['data']['eventName'] == 'connected':
# если нужное событие пришло, то меняем состояние подключения на true и выходим из цикла
connect = True
break
# если ожидаемое событие не найдено, то делаем таймаут в 300мс
ole.Sleep(300)
# После подключения к плагину вы можете подключаться к ExtSdk2 и звать методы данного модуля
# Получаем uuid модуля ExtSdk2 через ole.GetModule. Если uuid получен, значит подключение к ExtSdk2 успешно и можно совершать запросы в модуль.
guid_module = ole.GetModule("ExtSdk2") # Получаем uuid модуля ExtSdk2
"""Шаг 2. Пример аутентификации по логину и паролю"""
query_id = str(uuid.uuid4()) # генерируем идентификатор запроса (UUID) по которому будем ожидать ответ
module_method = "ExtSdk2.AuthByPassword" # метод, который хотим позвать
parameters_module_method = json.dumps({"Login": "Ivanov", "Password": "Ivanov123"},
ensure_ascii=True) # формируем параметры метода ExtSdk2.AuthByPassword
host = "online.sbis.ru" # хост, на который хотим пойти online.sbis.ru.
# Вызов метода аутентификации без авторизаии, чтобы получить идентификатор сессии
ole.CallMethodWithoutAuth(query_id, guid_module, module_method, parameters_module_method, host)
# Ожидаем ответ через ReadAllObject в цикле по query_id
session_id = "" # Переменная для сохранения идентификатора сессии для вызов методов ExtSdk2 с пройденной аутентификацией
while not session_id:
events = json.loads(ole.ReadAllObject()) # получаем события от плагина и преобразуем в массив json объектов
# в цикле проходим по каждому событию и ищем нужное с ожидаемым query_id
for event in events:
if event['type'] == 'Message' and event['queryID'] == query_id:
# если нужное событие пришло, то записываем идентификатор сессии в переменную
session_id = event['data']['Result']
break
# если ожидаемое событие не найдено, то делаем таймаут в 300мс
ole.Sleep(300)
"""Шаг 3. Пример вызова метода с пройденной аутентификацией"""
query_id = str(uuid.uuid4()) # генерируем идентификатор запроса (UUID) по которому будем ожидать ответ
module_method = "ExtSdk2.ReadTasksList" # метод, который хотим позвать
# filter_task = # сформируем пустой фильтр для ExtSdk2.ReadTasksList
parameters_module_method = json.dumps({"Filter": {
"Навигация": {
"РазмерСтраницы": "15",
"Страница": "0"
}
}},
ensure_ascii=True) # формируем параметры метода ExtSdk2.ReadTasksList.
# Вызов метода ExtSdk2.ReadTasksList с пройденной аутентификацией
ole.CallMethod(query_id, guid_module, module_method, parameters_module_method, session_id)
# Ожидаем ответ через ReadAllObject в цикле по query_id
result = {} # Переменная для сохранения результата ExtSdk2.ReadTasksList
result_checked = False
while not result_checked:
events = json.loads(ole.ReadAllObject()) # получаем события от плагина и преобразуем в массив json объектов
# в цикле проходим по каждому событию и ищем нужное с ожидаемым query_id
for event in events:
if event['type'] == 'Message' and event['queryID'] == query_id:
# если нужное событие пришло, то записываем результат в нужную переменную
result = event['data']['Result']
result_checked = True
break
# если ожидаемое событие не найдено, то делаем таймаут в 300мс
ole.Sleep(300)
"""Шаг 4. Пример вызова методов с несколькими параметрами на примере CallSabyApi"""
query_id = str(uuid.uuid4()) # генерируем идентификатор запроса (UUID) по которому будем ожидать ответ
module_method = "ExtSdk2.CallSabyApi" # метод, который хотим позвать
parameters_module_method = json.dumps({
"Method": "СБИС.ПрочитатьДокумент",
"Params": {
"Идентификатор": "f2a7c885-269a-44e4-8781-cb928df94163",
"ДопПоля": "ДополнительныеПоля"
}},
ensure_ascii=True) # формируем параметры метода ExtSdk2.CallSabyApi.
# Вызов метода ExtSdk2.CallSabyApi с пройденной аутентификацией
ole.CallMethod(query_id, guid_module, module_method, parameters_module_method, session_id)
# Ожидаем ответ через ReadAllObject в цикле по query_id
result = {} # Переменная для сохранения результата ExtSdk2.CallSabyApi
result_checked = False
while not result_checked:
events = json.loads(ole.ReadAllObject()) # получаем события от плагина и преобразуем в массив json объектов
# в цикле проходим по каждому событию и ищем нужное с ожидаемым query_id
for event in events:
if event['type'] == 'Message' and event['queryID'] == query_id:
# если нужное событие пришло, то записываем результат в нужную переменную
result = event['data']['Result']
result_checked = True
break
# если ожидаемое событие не найдено, то делаем таймаут в 300мс
ole.Sleep(300)
Предложите, как улучшить StudyLib
(Для жалоб на нарушения авторских прав, используйте
другую форму
)
Ваш е-мэйл
Заполните, если хотите получить ответ
Оцените наш проект
1
2
3
4
5