Почему V83.COMConnector.ConnectAgent завершается ошибкой подключения и как правильно передать параметры?

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

При автоматизации администрирования «1С:Предприятия» с помощью внешних скриптов (например, на Python через интерфейс COM) разработчики часто сталкиваются с ситуацией: метод Connect успешно открывает сеанс с информационной базой, а вызов метода ConnectAgent завершается критическим исключением с кодом ошибки 10061 (0x0000274D): Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение.

Разберем подробнее, почему возникает такое поведение, чем отличаются параметры этих методов и как корректно работать с агентом кластера серверов 1С.

Выясним причину ошибки

Проанализируем фрагмент кода, приводящий к сбою:


import win32com.client

com_obj = win32com.client.Dispatch("V83.COMConnector")
connection_string = 'Srvr="localhost";Ref="TEST_UT";Usr="user";Pwd="password"'

conn = com_obj.Connect(connection_string) # Успешно
agent = com_obj.ConnectAgent(connection_string) # Ошибка 10061

Метод Connect предназначен для прямого подключения к конкретной информационной базе. Он ожидает на вход стандартную строку соединения формата Srvr="...";Ref="...";.

Метод ConnectAgent служит совершенно для другой цели: он устанавливает соединение со службой агента кластера серверов (процесс ragent) и возвращает интерфейс управления IServerAgentConnection. Этот метод не принимает строку подключения к базе данных с именами пользователей и базами. Если передать ему строку от Connect, коннектор пытается интерпретировать всю строку как имя хоста, что приводит к формированию некорректного адреса вида tcp://Srvr=localhost;Ref=TEST_UT;:1540 и мгновенному отказу в сетевом соединении.

Правильный вызов ConnectAgent

Метод ConnectAgent принимает исключительно сетевой адрес агента кластера в виде строки "<Хост>:<Порт>" или "tcp://<Хост>:<Порт>".

Посмотрим на исправленный вариант вызова:


import win32com.client

com_obj = win32com.client.Dispatch("V83.COMConnector")

# Подключение к агенту кластера
agent_address = "tcp://127.0.0.1:1540"
agent = com_obj.ConnectAgent(agent_address)

Обратим внимание на указание IP-адреса. Рекомендуется использовать именно IPv4-адрес 127.0.0.1 вместо localhost. В современных операционных системах имя localhost в первую очередь транслируется в IPv6-адрес ::1. Если служба агента кластера слушает только IPv4-интерфейс, стек протоколов TCP/IP выдаст ошибку 10061 из-за попытки обратиться к закрытому порту по протоколу IPv6.

Также важно учитывать используемый порт: стандартный порт службы агента — 1540. Если на машине развернуто несколько версий платформы или при установке задавалось смещение портов (например, 2540 или 3540), необходимо указывать фактический порт, заданный при регистрации службы ragent.

Разберем последовательность администрирования через ConnectAgent

Само по себе получение объекта агента кластера — это только первый шаг. Для решения прикладных задач (получение списка сеансов, отключение пользователей, блокировка регламентных заданий) необходимо пройти цепочку авторизаций. Рассмотрим по шагам стандартный сценарий работы:

  1. Аутентификация на уровне агента: если на уровне центрального сервера настроен администратор агента, вызываем метод AuthenticateAgent.
  2. Получение кластеров: получаем список зарегистрированных кластеров с помощью вызова GetClusters().
  3. Аутентификация в кластере: для доступа к сеансам и базам конкретного кластера вызываем метод Authenticate.

Посмотрим на практический пример кода на Python:


import win32com.client

com_obj = win32com.client.Dispatch("V83.COMConnector")

# 1. Подключаемся к агенту
agent = com_obj.ConnectAgent("tcp://127.0.0.1:1540")

# Если задан администратор агента (главный администратор кластера):
# agent.AuthenticateAgent("AgentAdmin", "AgentPassword")

# 2. Получаем список кластеров
clusters = agent.GetClusters()

for cluster in clusters:
    # 3. Аутентифицируемся в кластере
    agent.Authenticate(cluster, "ClusterAdmin", "ClusterPassword")
    
    # Получаем список рабочих процессов или информационных баз
    infobases = agent.GetInfoBases(cluster)
    for ib in infobases:
        print(f"Информационная база: {ib.Name}")

Важные системные требования при работе с COMConnector

Чтобы сценарии на Python работали стабильно и без системных ошибок COM, обратим внимание на следующие технические ограничения:

  1. Разрядность приложений: разрядность интерпретатора Python и зарегистрированной библиотеки comcntr.dll обязаны совпадать. 64-битный Python не сможет загрузить 32-битный COM-коннектор напрямую через вызов Dispatch. Если изменить разрядность Python невозможно, библиотеку comcntr.dll необходимо обернуть в отдельное COM+ приложение Windows (служба Component Services) в режиме Server application.
  2. Версионность: сборка зарегистрированной библиотеки comcntr.dll должна в точности до последнего знака соответствовать версии сервера 1С, к которому выполняется подключение. Несовпадение подверсий приведет к ошибкам десериализации сетевых пакетов.
  3. Альтернативы для кроссплатформенных сред: COM-технология работает исключительно под управлением Windows. Если скрипты должны выполняться на серверах под управлением Linux, вместо COM-коннектора рекомендуется использовать связку из службы ras (сервер администрирования 1С) и утилиты командной строки rac либо специализированное Java API.
← На главную