При автоматизации администрирования «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 принимает исключительно сетевой адрес агента кластера в виде строки "<Хост>:<Порт>" или "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.
Само по себе получение объекта агента кластера — это только первый шаг. Для решения прикладных задач (получение списка сеансов, отключение пользователей, блокировка регламентных заданий) необходимо пройти цепочку авторизаций. Рассмотрим по шагам стандартный сценарий работы:
AuthenticateAgent.GetClusters().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}")
Чтобы сценарии на Python работали стабильно и без системных ошибок COM, обратим внимание на следующие технические ограничения:
comcntr.dll обязаны совпадать. 64-битный Python не сможет загрузить 32-битный COM-коннектор напрямую через вызов Dispatch. Если изменить разрядность Python невозможно, библиотеку comcntr.dll необходимо обернуть в отдельное COM+ приложение Windows (служба Component Services) в режиме Server application.comcntr.dll должна в точности до последнего знака соответствовать версии сервера 1С, к которому выполняется подключение. Несовпадение подверсий приведет к ошибкам десериализации сетевых пакетов.ras (сервер администрирования 1С) и утилиты командной строки rac либо специализированное Java API.