Как с помощью скрипта определить запущенный сеанс 1С и автоматически перезапустить его?

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

В процессе администрирования систем на базе 1С:Предприятие часто возникает задача обеспечения непрерывной работы определенных сеансов. Это могут быть роботы для обмена данными, службы выгрузки заказов из интернет-магазина или процессы автоматического формирования отчетности. Обычного контроля через диспетчер задач Windows бывает недостаточно, так как под одним процессом 1cv8.exe могут работать разные пользователи 1С. Разберем подробно, как реализовать автоматический мониторинг сеансов с помощью скриптов.

Проблема идентификации сеанса в терминальной среде

Проанализируем ситуацию: на терминальном сервере или сервере приложений одновременно запущено множество экземпляров 1С. Если мы просто воспользуемся командой tasklist, мы увидим список процессов, но не сможем определить, кто именно авторизован внутри программы. Стандартный фильтр по пользователю операционной системы не дает ответа на вопрос, запущен ли сеанс конкретного пользователя 1С (например, "Админ_1" или "Robot_Vipusk"). Для решения этой задачи нам потребуется обратиться к внутренним механизмам платформы через COM-соединение или специализированные утилиты администрирования.

Решение для клиент-серверного варианта (SQL) на языке VBScript

Рассмотрим наиболее надежный способ для баз данных, работающих в клиент-серверном режиме. Мы будем использовать объект V83.COMConnector, который позволяет подключиться к агенту сервера 1С, получить список кластеров и детальную информацию обо всех активных соединениях.

Разберем по шагам логику работы скрипта:

  1. Инициализация соединения: Создаем объект COMConnector и подключаемся к агенту сервера по его имени или IP-адресу.
  2. Аутентификация в кластере: Получаем список кластеров (обычно он один) и проходим авторизацию.
  3. Перебор рабочих процессов: Проходим циклом по всем рабочим процессам кластера, чтобы собрать информацию о текущих сеансах в конкретной информационной базе.
  4. Поиск целевого пользователя: Внутри списка соединений проверяем свойство userName. Если находим искомого пользователя, помечаем флаг как "Истина".
  5. Запуск приложения: Если после завершения проверки флаг остался "Ложь", инициируем запуск 1С с нужными параметрами.

Посмотрим на пример реализации такого скрипта:


' Настройка параметров подключения
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-соединения для проверки файловой базы требует наличия свободной лицензии в момент проверки. Однако, как отмечают специалисты, такой метод позволяет избежать ложных срабатываний, которые случаются при анализе только лишь процессов в ОС.

Альтернативный современный подход: использование утилиты RAC

Разберем ситуацию, когда использование COM-объектов затруднено (например, из-за конфликтов 32-битных и 64-битных приложений). В платформе 8.3 существует утилита RAC (Remote Administration Client), которая работает через службу RAS.

Преимущество этого метода в том, что мы можем получить текстовый список всех сеансов командой:

rac session --cluster=<ID кластера> list

Этот вывод легко обрабатывается любым современным языком сценариев, например PowerShell. Это позволяет строить более гибкие системы мониторинга без необходимости регистрации V83.COMConnector в реестре Windows.

Борьба с "зависшими" сеансами

Проанализируем еще одну проблему: сеанс в списке 1С может отображаться, но само приложение может "зависнуть" (например, из-за критической ошибки или модального окна). В этом случае проверка наличия сеанса вернет "Истина", но робот фактически не работает.

Для предотвращения таких ситуаций рекомендуем внедрить механизм "Heartbeat" (сердцебиение):

Рекомендации по настройке планировщика задач

Чтобы автоматизация работала бесперебойно, при настройке Task Scheduler Windows придерживайтесь следующих правил:

  1. Используйте опцию "Run whether user is logged on or not" (Выполнять вне зависимости от регистрации пользователя).
  2. Установите повторение задачи (например, каждые 15 минут) в параметрах триггера.
  3. В параметрах запуска 1С используйте ключ /AllowExecuteScheduledJobs, если в данном сеансе должны выполняться регламентные задания.
  4. Всегда указывайте полные пути к исполняемым файлам 1С и файлам скриптов.

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

← На главную