При попытке автоматизировать обмен данными между внешними офисными приложениями (например, Microsoft Excel через VBA) и базой 1С, расположенной в облаке с доступом по RemoteApp или RDP, разработчики часто сталкиваются с ошибками инициализации COM-соединения. Проанализируем, почему стандартный код подключения не работает в терминальной среде и какие архитектурные альтернативы существуют для решения этой задачи.
Рассмотрим типовую ситуацию. В коде VBA используется вызов объекта V83.Comconnector с указанием адреса сервера из параметров подключения RDP-клиента:
Set Connector = CreateObject("V83.Comconnector")
Set База = Connector.Connect("Srvr=""ustk-idc-1capp-1.elram.kz"";Ref=""RD_TOO_AitasMD_AMD"";Usr="""";Pwd=""""")
Такое обращение завершается ошибкой. Выясним причину этой проблемы. Протокол RDP (Remote Desktop Protocol) и шлюзы RemoteApp предназначены исключительно для передачи графического интерфейса пользователя и ввода данных (клавиатуры и мыши) с удаленного сервера на клиентский компьютер. Сервер шлюза не принимает команды внешнего программного интерфейса 1С.
Для успешного выполнения вызова Connector.Connect технологическая платформа 1С предъявляет строгие требования к окружению:
comcntr.dll.1540 для агента кластера, 1541 для главного менеджера и диапазон 1560–1591 для рабочих процессов). В облачной инфраструктуре при доступе через RemoteApp открыт только терминальный порт (обычно 3389 или 443), а порты кластера изолированы межсетевым экраном.comcntr.dll, либо связь настраивается через системный компонент Windows COM+.Если доступ к облаку организован исключительно через аренду терминального рабочего места, самым простым решением является перенос среды исполнения скрипта на сервер.
Разберем по шагам, как это реализовать:
V83.Comconnector успешно инициализирует подключение к базе.Если облачный провайдер публикует базу данных 1С на веб-сервере (IIS или Apache), мы можем взаимодействовать с ней по стандартному протоколу HTTPS через OData. Это исключает зависимость от установленной локально платформы 1С и библиотек COM.
Рассмотрим подробнее пример обращения к данным 1С через HTTP-запрос в коде VBA с использованием объекта MSXML2.ServerXMLHTTP:
Dim Http As Object
Dim URL As String
Dim ResponseText As String
Set Http = CreateObject("MSXML2.ServerXMLHTTP.6.0")
URL = "https://ustk-idc-1capp-1.elram.kz/RD_TOO_AitasMD_AMD/odata/standard.odata/Catalog_Номенклатура?$format=json"
Http.Open "GET", URL, False, "ИмяПользователя", "Пароль"
Http.setRequestHeader "Content-Type", "application/json; charset=utf-8"
Http.Send
If Http.Status = 200 Then
ResponseText = Http.responseText
' Обработка полученного JSON-ответа
Else
MsgBox "Ошибка запроса: " & Http.Status & " " & Http.statusText
End If
Для работы этого способа требуется, чтобы в базе 1С была включена поддержка стандартного интерфейса OData для требуемых объектов метаданных, а пользователю были назначены права на удаленный доступ.
Если стандартный интерфейс OData отключен или необходимо выполнять сложную бизнес-логику на стороне сервера, создадим собственный HTTP-сервис в конфигурации или расширении 1С.
Посмотрим на пример структуры запроса. В 1С создается объект метаданных HTTPСервис с шаблоном URL и методом (например, GET). Сервер формирует готовый ответ в формате JSON. Со стороны VBA обращение происходит по защищенному каналу HTTPS через порт 443, что полностью снимает ограничения изоляции портов 1С:Предприятия.
Если переписать алгоритм на HTTP-сервисы невозможно и требуется именно прямое COM-подключение с локального компьютера, согласуем с системным администратором облачного провайдера настройку защищенного VPN-соединения (IPsec, OpenVPN, WireGuard).
После поднятия туннеля локальный компьютер окажется в одной подсети с сервером 1С. В этом случае выполним следующие действия:
comcntr.dll с помощью утилиты командной строки regsvr32.