В процессе администрирования систем на базе 1С:Предприятие часто возникает задача обеспечения непрерывной работы определенных сеансов. Это могут быть роботы для обмена данными, службы выгрузки заказов из интернет-магазина или процессы автоматического формирования отчетности. Обычного контроля через диспетчер задач Windows бывает недостаточно, так как под одним процессом 1cv8.exe могут работать разные пользователи 1С. Разберем подробно, как реализовать автоматический мониторинг сеансов с помощью скриптов.
Проанализируем ситуацию: на терминальном сервере или сервере приложений одновременно запущено множество экземпляров 1С. Если мы просто воспользуемся командой tasklist, мы увидим список процессов, но не сможем определить, кто именно авторизован внутри программы. Стандартный фильтр по пользователю операционной системы не дает ответа на вопрос, запущен ли сеанс конкретного пользователя 1С (например, "Админ_1" или "Robot_Vipusk"). Для решения этой задачи нам потребуется обратиться к внутренним механизмам платформы через COM-соединение или специализированные утилиты администрирования.
Рассмотрим наиболее надежный способ для баз данных, работающих в клиент-серверном режиме. Мы будем использовать объект V83.COMConnector, который позволяет подключиться к агенту сервера 1С, получить список кластеров и детальную информацию обо всех активных соединениях.
Разберем по шагам логику работы скрипта:
COMConnector и подключаемся к агенту сервера по его имени или IP-адресу.userName. Если находим искомого пользователя, помечаем флаг как "Истина".Посмотрим на пример реализации такого скрипта:
' Настройка параметров подключения
UserName = "Admin_Service" ' Пользователь с правами администратора 1С
UserPass = "P@ssw0rd"
ServerName = "1C-Main-Server"
BaseName = "Accounting_Base"
RobotUser = "Robot_Vipusk" ' Имя пользователя, которого проверяем
RobotPass = "Robot_Password"
Dim Connector, AgentConnection, Cluster, WorkingProcess, WorkingProcessConnection
Dim ibDesc, connections, Connection, bIsRunning
Set Connector = CreateObject("V83.COMConnector")
Set AgentConnection = Connector.ConnectAgent(ServerName)
Set Cluster = AgentConnection.GetClusters()(0) ' Работаем с первым кластером
AgentConnection.Authenticate Cluster, "", ""
bIsRunning = False
Set WorkingProcesses = AgentConnection.GetWorkingProcesses(Cluster)
' Проанализируем каждый рабочий процесс
For Each WorkingProcess In WorkingProcesses
ConnectString = WorkingProcess.HostName & ":" & WorkingProcess.MainPort
Set WorkingProcessConnection = Connector.ConnectWorkingProcess(ConnectString)
WorkingProcessConnection.AddAuthentication UserName, UserPass
Set ibDesc = WorkingProcessConnection.CreateInfoBaseInfo
ibDesc.Name = BaseName
' Получаем список всех соединений с базой
connections = WorkingProcessConnection.GetInfoBaseConnections(ibDesc)
For Each Connection In connections
' Исключаем консоль администрирования из проверки
If (Connection.AppID <> "COMConsole") Then
If Connection.userName = RobotUser Then
bIsRunning = True
Exit For
End If
End If
Next
If bIsRunning Then Exit For
Next
' Если сеанс не найден, запускаем 1С
If Not bIsRunning Then
Set WshShell = CreateObject("WScript.Shell")
' Путь к исполняемому файлу и параметры запуска
LaunchCmd = """C:\Program Files\1cv8\8.3.22.1709\bin\1cv8.exe"" ENTERPRISE /S " & ServerName & "\" & BaseName & " /N " & RobotUser & " /P " & RobotPass
WshShell.Run LaunchCmd
End If
Выясним, как обстоят дела с файловыми базами. Здесь мы не можем подключиться к агенту сервера, так как его не существует. В этом случае эффективным методом будет попытка создания COM-соединения напрямую к базе под администратором и выполнение функции, проверяющей активных пользователей информационной базы.
Рассмотрим пример функции внутри 1С (в общем модуле с признаком "Внешнее соединение"), которая возвращает статус работы пользователя:
Функция ПроверитьСеансПользователя(ИмяПользователя) Экспорт
Сеансы = ПолучитьСеансыИнформационнойБазы();
Для Каждого Сеанс Из Сеансы Цикл
Если Сеанс.Пользователь.Имя = ИмяПользователя Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
Возврат Ложь;
КонецФункции
Скрипт проверки на VBScript в этом случае будет выглядеть лаконичнее, так как он просто вызывает готовую функцию из базы:
Dim Connector, Connection, ConnectString, IsActive
Set Connector = CreateObject("V83.COMConnector")
' Путь к файловой базе
ConnectString = "File=""D:\1C_Bases\Production"";usr=""Admin"";pwd=""123"";"
Set Connection = Connector.Connect(ConnectString)
' Вызываем нашу экспортную функцию
IsActive = Connection.МойОбщийМодуль.ПроверитьСеансПользователя("Робот_Обмена")
If Not IsActive Then
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run """C:\Program Files\1cv8\common\1cestart.exe"" ENTERPRISE /F ""D:\1C_Bases\Production"" /N ""Робот_Обмена"" /P ""Pass"""
End If
Важное примечание: Использование COM-соединения для проверки файловой базы требует наличия свободной лицензии в момент проверки. Однако, как отмечают специалисты, такой метод позволяет избежать ложных срабатываний, которые случаются при анализе только лишь процессов в ОС.
Разберем ситуацию, когда использование COM-объектов затруднено (например, из-за конфликтов 32-битных и 64-битных приложений). В платформе 8.3 существует утилита RAC (Remote Administration Client), которая работает через службу RAS.
Преимущество этого метода в том, что мы можем получить текстовый список всех сеансов командой:
rac session --cluster=<ID кластера> list
Этот вывод легко обрабатывается любым современным языком сценариев, например PowerShell. Это позволяет строить более гибкие системы мониторинга без необходимости регистрации V83.COMConnector в реестре Windows.
Проанализируем еще одну проблему: сеанс в списке 1С может отображаться, но само приложение может "зависнуть" (например, из-за критической ошибки или модального окна). В этом случае проверка наличия сеанса вернет "Истина", но робот фактически не работает.
Для предотвращения таких ситуаций рекомендуем внедрить механизм "Heartbeat" (сердцебиение):
1cv8.exe через taskkill и запускает сеанс заново.Чтобы автоматизация работала бесперебойно, при настройке Task Scheduler Windows придерживайтесь следующих правил:
/AllowExecuteScheduledJobs, если в данном сеансе должны выполняться регламентные задания.Используя предложенные методы, вы сможете обеспечить стабильную работу критически важных узлов вашей системы 1С и минимизировать время простоя автоматизированных процессов.