Как подключиться к облачной базе 1С через VBA, если доступ открыт только по RemoteApp?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При попытке автоматизировать обмен данными между внешними офисными приложениями (например, Microsoft Excel через VBA) и базой 1С, расположенной в облаке с доступом по RemoteApp или RDP, разработчики часто сталкиваются с ошибками инициализации COM-соединения. Проанализируем, почему стандартный код подключения не работает в терминальной среде и какие архитектурные альтернативы существуют для решения этой задачи.

Анализ проблемы: почему COM-соединение не работает через RDP

Рассмотрим типовую ситуацию. В коде 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С предъявляет строгие требования к окружению:

  1. Наличие установленной локальной платформы: на компьютере, где запускается код VBA, должен быть установлен технологический дистрибутив 1С:Предприятие той же версии и сборки (релиза), что и на сервере.
  2. Регистрация библиотеки: в операционной системе клиентской машины должна быть зарегистрирована внешняя библиотека comcntr.dll.
  3. Сетевая доступность кластера: клиентский компьютер должен иметь прямой доступ по протоколу TCP к портам кластера серверов 1С (по умолчанию порт 1540 для агента кластера, 1541 для главного менеджера и диапазон 1560–1591 для рабочих процессов). В облачной инфраструктуре при доступе через RemoteApp открыт только терминальный порт (обычно 3389 или 443), а порты кластера изолированы межсетевым экраном.
  4. Совпадение разрядности: разрядность приложения Microsoft Excel (32-bit или 64-bit) должна совпадать с разрядностью зарегистрированной библиотеки comcntr.dll, либо связь настраивается через системный компонент Windows COM+.

Решение 1. Перенос выполнения VBA-кода внутрь терминальной сессии

Если доступ к облаку организован исключительно через аренду терминального рабочего места, самым простым решением является перенос среды исполнения скрипта на сервер.

Разберем по шагам, как это реализовать:

  1. Откроем удаленный рабочий стол или RemoteApp-сессию в облаке.
  2. Проверим наличие офисного пакета или среды выполнения скриптов (Microsoft Excel, VBScript или PowerShell) внутри удаленной сессии.
  3. Запустим макрос непосредственно внутри облачной среды. Так как на терминальном сервере платформа 1С уже установлена и порты локального кластера открыты, объект V83.Comconnector успешно инициализирует подключение к базе.

Решение 2. Использование стандартного интерфейса OData (REST API)

Если облачный провайдер публикует базу данных 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 для требуемых объектов метаданных, а пользователю были назначены права на удаленный доступ.

Решение 3. Разработка собственного HTTP-сервиса в 1С

Если стандартный интерфейс OData отключен или необходимо выполнять сложную бизнес-логику на стороне сервера, создадим собственный HTTP-сервис в конфигурации или расширении 1С.

Посмотрим на пример структуры запроса. В 1С создается объект метаданных HTTPСервис с шаблоном URL и методом (например, GET). Сервер формирует готовый ответ в формате JSON. Со стороны VBA обращение происходит по защищенному каналу HTTPS через порт 443, что полностью снимает ограничения изоляции портов 1С:Предприятия.

Решение 4. Организация прямого доступа через VPN

Если переписать алгоритм на HTTP-сервисы невозможно и требуется именно прямое COM-подключение с локального компьютера, согласуем с системным администратором облачного провайдера настройку защищенного VPN-соединения (IPsec, OpenVPN, WireGuard).

После поднятия туннеля локальный компьютер окажется в одной подсети с сервером 1С. В этом случае выполним следующие действия:

  1. Установим на локальный компьютер платформу 1С:Предприятие той же версии, что и на сервере.
  2. Зарегистрируем библиотеку comcntr.dll с помощью утилиты командной строки regsvr32.
  3. В строке соединения укажем локальный IP-адрес или внутреннее сетевое имя сервера кластера 1С вместо внешнего адреса шлюза.
← На главную