Как определить и перезапустить зависший сеанс 1С на цеховых мониторах?

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

В условиях современного промышленного предприятия или крупного складского комплекса интерактивные табло и мониторы отображения информации играют критически важную роль. На них выводятся оперативные данные: очереди автотранспорта на погрузку, статус выполнения производственных заданий, показатели эффективности работы смен. Однако стабильная работа таких информационных панелей часто нарушается из-за различных технических факторов: падения рабочих процессов сервера 1С (rphost), сетевых сбоев, блокировок базы данных при обновлении конфигурации или банального зависания интерфейса клиентского приложения. В результате экран «застывает», сотрудники видят неактуальные данные, а рабочий процесс может замедлиться.

В этой статье мы подробно рассмотрим и проанализируем различные способы автоматического контроля жизнедеятельности (heartbeat) сеансов 1С, разберем методы автоматического закрытия окон об ошибках и научимся принудительно перезапускать «зависшие» процессы с помощью скриптов и систем мониторинга.

Вариант 1. Мониторинг активности через HTTP-запросы и Zabbix (Решение с форума)

Этот подход базируется на реальном практическом опыте системных администраторов и 1С-разработчиков. Суть метода заключается в том, что само клиентское приложение 1С регулярно сообщает внешней системе мониторинга (Zabbix) о том, что оно запущено и функционирует нормально. Если сигналы прекращаются на определенное время, система мониторинга автоматически инициирует скрипт перезапуска процесса на конкретном АРМ.

Разберем данный алгоритм по шагам:

  1. Запуск 1С с ключом запуска: На целевом компьютере настраивается автоматический запуск тонкого или толстого клиента 1С. В ярлыке или планировщике задач прописываются параметры авторизации и специальный ключ запуска (параметр /C), который сигнализирует системе, что сеанс открыт именно в режиме информационного табло. Например: 1cestart.exe enterprise /F "ПутьКБазе" /N "ИмяПользователяТабло" /P "Пароль" /C"РежимТабло".
  2. Отправка сигналов «жизни» (Heartbeat): В модуле управляемого приложения 1С или в специализированной обработке настраивается обработчик ожидания, который с определенной периодичностью (например, каждые 30 секунд) отправляет HTTP-запрос в Zabbix.
  3. Контроль со стороны Zabbix: В системе Zabbix создается специальный элемент данных и триггер. Если в течение 5–10 минут от АРМ не поступали HTTP-сигналы, триггер переходит в состояние «Авария».
  4. Действие при аварии: Zabbix запускает удаленную команду (скрипт) на целевом компьютере, который принудительно завершает процесс 1cv8c.exe и запускает его заново.

Рассмотрим пример кода 1С, который инициализирует отправку сигналов жизнедеятельности:


Процедура ПриНачалеРаботыСистемы()
    #Если ТонкийКлиент Или ТолстыйКлиентОбычноеПриложение Или ТолстыйКлиентУправляемоеПриложение Тогда
        ПараметрыЗапускаСистемы = ПараметрыЗапуска;
        Если Найти(ПараметрыЗапускаСистемы, "РежимТабло") > 0 Тогда
            // Подключаем ежеминутную отправку пинга в систему мониторинга
            ПодключитьОбработчикОжидания("ОтправитьСигналВZabbix", 60);
        КонецЕсли;
    #КонецЕсли;
КонецПроцедуры

Процедура ОтправитьСигналВZabbix() Экспорт
    ИмяКомпьютераСтенда = ИмяКомпьютера();
    СерверМониторинга = "zabbix.yourcompany.ru";
    Ресурс = "/api/v1/heartbeat?host=" + ИмяКомпьютераСтенда;
    
    // Установим короткий таймаут, чтобы зависание сети не подвешивало саму 1С
    Соединение = Новый HTTPСоединение(СерверМониторинга, , , , , 10);
    Запрос = Новый HTTPЗапрос(Ресурс);
    
    Попытка
        Ответ = Соединение.Получить(Запрос);
        Если Ответ.КодСостояния <> 200 Тогда
            ЗаписьЖурналаРегистрации("МониторингТабло.Ошибка", УровеньЖурналаРегистрации.Предупреждение, , , 
                "Сервер мониторинга вернул код: " + Ответ.КодСостояния);
        КонецЕсли;
    Исключение
        ЗаписьЖурналаРегистрации("МониторингТабло.ОшибкаСвязи", УровеньЖурналаРегистрации.Ошибка, , , 
            ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

Вариант 2. Автоматическое нажатие кнопки «Перезапустить» через скрипт AutoIt

Часто платформа 1С аварийно завершает работу и выводит на экран штатное модальное диалоговое окно с сообщением об ошибке и кнопками «Завершить работу» и «Перезапустить». Процесс 1С при этом формально не закрылся — он «висит» в ожидании реакции пользователя. Это делает невозможным автоматический запуск нового сеанса, так как старый процесс все еще удерживает лицензию и открытые файлы.

Решить эту задачу на уровне «высшего пилотажа» можно с помощью утилиты автоматизации интерфейса AutoIt. Специальный скрипт будет постоянно работать в фоновом режиме в операционной системе Windows на целевом ПК, отслеживать появление окон ошибок 1С и программно имитировать нажатие кнопки перезапуска.

Рассмотрим пример скрипта AutoIt, решающего эту задачу:


Opt("TrayIconDebug", 1) ; Включаем отладку в трее
$WindowTitle = "1С:Предприятие" ; Заголовок целевого окна

While 1
    ; Ожидаем появление окна с заголовком "1С:Предприятие" и текстом "Перезапустить"
    If WinExists($WindowTitle, "Перезапустить") Then
        ; Активируем найденное окно ошибки
        WinActivate($WindowTitle, "Перезапустить")
        WinWaitActive($WindowTitle, "Перезапустить", 3)
        
        ; Имитируем клик по кнопке "Перезапустить"
        ; Класс и экземпляр кнопки (INSTANCE) можно уточнить через утилиту AutoIt Window Info
        ControlClick($WindowTitle, "Перезапустить", "[CLASS:Button; INSTANCE:2]")
        
        ; Делаем паузу для предотвращения зацикливания при постоянных падениях
        Sleep(10000)
    EndIf
    
    ; Задержка основного цикла в 3 секунды для снижения нагрузки на процессор
    Sleep(3000)
WEnd

Этот скрипт компилируется в облегченный файл .exe и помещается в автозагрузку пользователя операционной системы Windows. Он работает незаметно для пользователя и мгновенно устраняет зависшие модальные окна.

Вариант 3. Использование PowerShell для анализа свойства Responding

Что делать, если сеанс 1С завис «намертво», превратился в «белый экран», не реагирует на клики, но при этом никаких диалоговых окон с ошибками не выводит? В этот момент встроенные обработчики ожидания 1С уже не работают, следовательно, «пинг» в Zabbix отправлен не будет. Нам на помощь приходит операционная система Windows, у которой для каждого GUI-процесса есть статус отзывчивости приложения.

Выясним причину зависания с помощью скрипта на PowerShell, который проверяет свойство Responding у процессов тонкого клиента. Если процесс не отвечает на запросы операционной системы, скрипт принудительно завершит его по PID и запустит заново.

Проанализируем структуру PowerShell-скрипта:


# Название процесса тонкого клиента 1С:Предприятие
$ProcessName = "1cv8c"
# Путь к стартеру платформы
$LauncherPath = "C:\Program Files\1cv8\common\1cestart.exe"
# Аргументы запуска для автоматического входа на табло
$AppArgs = 'enterprise /F "C:\Bases\Trade" /N "MonitorUser" /P "StrongPassword"'

# Получаем все запущенные процессы тонкого клиента
$Processes = Get-Process -Name $ProcessName -ErrorAction SilentlyContinue

if ($Processes) {
    foreach ($Proc in $Processes) {
        # Проверяем свойство Responding (отвечает ли окно процесса)
        if (-not $Proc.Responding) {
            Write-Host "Обнаружен зависший процесс PID: $($Proc.Id). Выполняется принудительное завершение..."
            Stop-Process -Id $Proc.Id -Force
            Start-Sleep -Seconds 5
            # Запускаем новый сеанс
            Start-Process -FilePath $LauncherPath -ArgumentList $AppArgs
        } else {
            Write-Host "Процесс PID: $($Proc.Id) работает в штатном режиме."
        }
    }
} else {
    # Если процесс 1С вообще не запущен, выполняем запуск
    Write-Host "Процесс 1С не обнаружен. Выполняется холодный запуск..."
    Start-Process -FilePath $LauncherPath -ArgumentList $AppArgs
}

Этот скрипт рекомендуется запускать через встроенный Планировщик задач Windows (Task Scheduler) каждые 2–5 минут под учетной записью пользователя, в сессии которого отображается информационное табло.

Вариант 4. Локальный файловый маркер (Heartbeat File)

Для простых конфигураций без развертывания сложных систем мониторинга можно организовать контроль работоспособности через локальный маркерный файл. В этом случае логика работы выглядит следующим образом:

  1. Внутри сеанса 1С обработчик ожидания раз в минуту записывает в текстовый файл C:\Temp\monitor_heartbeat.txt текущую дату и время.
  2. Внешний PowerShell-скрипт проверяет время последней перезаписи (модификации) этого файла.
  3. Если разница между текущим временем и временем изменения файла превышает 3 минуты, делается вывод о зависании 1С. Процесс убивается и стартует заново.

Рассмотрим пример PowerShell-скрипта для контроля времени изменения файла:


$FilePath = "C:\Temp\monitor_heartbeat.txt"
$ProcessName = "1cv8c"
$LauncherPath = "C:\Program Files\1cv8\common\1cestart.exe"
$AppArgs = 'enterprise /F "C:\Bases\Trade" /N "MonitorUser" /P "StrongPassword"'
$MaxIdleMinutes = 3

if (Test-Path $FilePath) {
    $LastWriteTime = (Get-Item $FilePath).LastWriteTime
    $IdleTime = (Get-Date) - $LastWriteTime

    if ($IdleTime.TotalMinutes -gt $MaxIdleMinutes) {
        Write-Host "Маркерный файл не обновлялся более $MaxIdleMinutes минут. Перезапуск 1С..."
        Stop-Process -Name $ProcessName -Force -ErrorAction SilentlyContinue
        Remove-Item $FilePath -Force -ErrorAction SilentlyContinue
        Start-Sleep -Seconds 3
        Start-Process -FilePath $LauncherPath -ArgumentList $AppArgs
    }
} else {
    # Если файла нет вообще, возможно, 1С еще не создала его или закрыта
    if (-not (Get-Process -Name $ProcessName -ErrorAction SilentlyContinue)) {
        Start-Process -FilePath $LauncherPath -ArgumentList $AppArgs
    }
}

Вариант 5. Использование веб-клиента в режиме Kiosk (Альтернативное решение)

Для информационных мониторов отображения данных использование полноценного тонкого клиента 1С часто является избыточным и снижает общую стабильность системы. Гораздо более устойчивым решением является публикация базы 1С на веб-сервере (IIS или Apache) и вывод данных через веб-браузер в режиме киоска (Kiosk Mode).

Рассмотрим неоспоримые преимущества этого подхода:

Вариант 6. Очистка зависших сессий на уровне сервера 1С

Для того чтобы зависшие сеансы на цеховых мониторах не «пожирали» ценные клиентские лицензии и не блокировали базу данных при плановом обновлении конфигурации, крайне важно правильно настроить параметры кластера серверов 1С:

  1. Откройте консоль администрирования кластера серверов 1С:Предприятия.
  2. Перейдите в свойства вашей информационной базы.
  3. Установите значение параметра «Время засыпания пассивных сеансов» равным 1200 секундам (20 минут).
  4. Установите значение параметра «Время завершения спящих сеансов» равным 600 секундам (10 минут).

Благодаря этим настройкам сервер 1С будет автоматически определять неактивные («спящие») сеансы со стороны зависших АРМ и корректно уничтожать их со своей стороны, освобождая лицензии для повторного автоматического запуска клиентских приложений.

Подводя итог, можно сказать: наиболее отказоустойчивым решением для цеховых табло является использование веб-клиента в режиме киоска с плагином автообновления страниц. Если же специфика вывода данных требует использования тонкого клиента, отличные результаты показывает связка фонового скрипта на PowerShell (контролирующего свойство Responding) и утилиты AutoIt для автоматического закрытия всплывающих окон с ошибками.

← На главную