В условиях современного промышленного предприятия или крупного складского комплекса интерактивные табло и мониторы отображения информации играют критически важную роль. На них выводятся оперативные данные: очереди автотранспорта на погрузку, статус выполнения производственных заданий, показатели эффективности работы смен. Однако стабильная работа таких информационных панелей часто нарушается из-за различных технических факторов: падения рабочих процессов сервера 1С (rphost), сетевых сбоев, блокировок базы данных при обновлении конфигурации или банального зависания интерфейса клиентского приложения. В результате экран «застывает», сотрудники видят неактуальные данные, а рабочий процесс может замедлиться.
В этой статье мы подробно рассмотрим и проанализируем различные способы автоматического контроля жизнедеятельности (heartbeat) сеансов 1С, разберем методы автоматического закрытия окон об ошибках и научимся принудительно перезапускать «зависшие» процессы с помощью скриптов и систем мониторинга.
Этот подход базируется на реальном практическом опыте системных администраторов и 1С-разработчиков. Суть метода заключается в том, что само клиентское приложение 1С регулярно сообщает внешней системе мониторинга (Zabbix) о том, что оно запущено и функционирует нормально. Если сигналы прекращаются на определенное время, система мониторинга автоматически инициирует скрипт перезапуска процесса на конкретном АРМ.
Разберем данный алгоритм по шагам:
/C), который сигнализирует системе, что сеанс открыт именно в режиме информационного табло. Например: 1cestart.exe enterprise /F "ПутьКБазе" /N "ИмяПользователяТабло" /P "Пароль" /C"РежимТабло".1cv8c.exe и запускает его заново.Рассмотрим пример кода 1С, который инициализирует отправку сигналов жизнедеятельности:
Процедура ПриНачалеРаботыСистемы()
#Если ТонкийКлиент Или ТолстыйКлиентОбычноеПриложение Или ТолстыйКлиентУправляемоеПриложение Тогда
ПараметрыЗапускаСистемы = ПараметрыЗапуска;
Если Найти(ПараметрыЗапускаСистемы, "РежимТабло") > 0 Тогда
// Подключаем ежеминутную отправку пинга в систему мониторинга
ПодключитьОбработчикОжидания("ОтправитьСигналВZabbix", 60);
КонецЕсли;
#КонецЕсли;
КонецПроцедуры
Процедура ОтправитьСигналВZabbix() Экспорт
ИмяКомпьютераСтенда = ИмяКомпьютера();
СерверМониторинга = "zabbix.yourcompany.ru";
Ресурс = "/api/v1/heartbeat?host=" + ИмяКомпьютераСтенда;
// Установим короткий таймаут, чтобы зависание сети не подвешивало саму 1С
Соединение = Новый HTTPСоединение(СерверМониторинга, , , , , 10);
Запрос = Новый HTTPЗапрос(Ресурс);
Попытка
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния <> 200 Тогда
ЗаписьЖурналаРегистрации("МониторингТабло.Ошибка", УровеньЖурналаРегистрации.Предупреждение, , ,
"Сервер мониторинга вернул код: " + Ответ.КодСостояния);
КонецЕсли;
Исключение
ЗаписьЖурналаРегистрации("МониторингТабло.ОшибкаСвязи", УровеньЖурналаРегистрации.Ошибка, , ,
ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Часто платформа 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. Он работает незаметно для пользователя и мгновенно устраняет зависшие модальные окна.
Что делать, если сеанс 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 минут под учетной записью пользователя, в сессии которого отображается информационное табло.
Для простых конфигураций без развертывания сложных систем мониторинга можно организовать контроль работоспособности через локальный маркерный файл. В этом случае логика работы выглядит следующим образом:
C:\Temp\monitor_heartbeat.txt текущую дату и время.Рассмотрим пример 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
}
}
Для информационных мониторов отображения данных использование полноценного тонкого клиента 1С часто является избыточным и снижает общую стабильность системы. Гораздо более устойчивым решением является публикация базы 1С на веб-сервере (IIS или Apache) и вывод данных через веб-браузер в режиме киоска (Kiosk Mode).
Рассмотрим неоспоримые преимущества этого подхода:
"C:\Program Files\Google\Chrome\Application\chrome.exe" --kiosk http://your-1c-web-server/base_name/.Для того чтобы зависшие сеансы на цеховых мониторах не «пожирали» ценные клиентские лицензии и не блокировали базу данных при плановом обновлении конфигурации, крайне важно правильно настроить параметры кластера серверов 1С:
1200 секундам (20 минут).600 секундам (10 минут).Благодаря этим настройкам сервер 1С будет автоматически определять неактивные («спящие») сеансы со стороны зависших АРМ и корректно уничтожать их со своей стороны, освобождая лицензии для повторного автоматического запуска клиентских приложений.
Подводя итог, можно сказать: наиболее отказоустойчивым решением для цеховых табло является использование веб-клиента в режиме киоска с плагином автообновления страниц. Если же специфика вывода данных требует использования тонкого клиента, отличные результаты показывает связка фонового скрипта на PowerShell (контролирующего свойство Responding) и утилиты AutoIt для автоматического закрытия всплывающих окон с ошибками.