Автоматический перезапуск 1С:Предприятия: от кода конфигурации до службы сервера
Содержание
Перезапустить 1С программно можно на трёх уровнях. Из кода конфигурации — вызовом ЗавершитьРаботуСистемы(Ложь, Истина): клиент закроется и сразу откроется снова. Снаружи — скриптом (bat, VBS, PowerShell), который завершает процесс 1cv8c.exe или 1cv8.exe и запускает его заново с ключами командной строки. В клиент-серверном варианте — через кластер: сеансы обрывают через V83.COMConnector или утилиту rac, а при зависании сервера перезапускают службу агента.
Выбор зависит от того, что именно «зависло» или требует рестарта. Перезапуск клиента нужен после обновления конфигурации или смены настроек. Завершение сеансов — перед регламентными работами. Рестарт службы — когда рабочие процессы rphost съели память или перестали отвечать.
Что перезапускать: клиент, сеанс или сервер
Прежде чем писать скрипт, определите вариант работы базы и точку отказа. Ошибка на этом шаге — самая дорогая: убили службу ради одного зависшего клиента, и полсотни пользователей потеряли несохранённые документы.
| Ситуация | Что перезапускать | Инструмент |
|---|---|---|
| Пользователю нужно применить новую версию конфигурации | Клиентское приложение | ЗавершитьРаботуСистемы(Ложь, Истина) в коде |
| Терминальный сервер, зависший клиент у одного пользователя | Процесс клиента | taskkill, VBS через WMI |
| Перед обновлением базы нужно выгнать всех | Сеансы информационной базы | COMConnector, rac session terminate |
Сервер 1С не отвечает, rphost занял всю память | Служба агента сервера | net stop/net start, Restart-Service, systemctl |
Файловая база по сети, блокировки файла 1Cv8.1CD | Процессы клиентов на всех машинах | Скрипт на каждой машине или перезагрузка служб общего доступа |
Для файловой базы понятия «кластер» и «сеанс на сервере» не существует. Там управляют только клиентскими процессами. Для клиент-серверной — есть все три уровня.
Если задача — регулярно выгонять пользователей на ночь, сначала проверьте, не решает ли её встроенная блокировка. В конфигурациях на БСП (БП 3.0, ЗУП 3.1, УТ 11) она открывается из раздела Администрирование → Обслуживание командой «Блокировка работы пользователей»: программа сама предупредит людей и завершит их сеансы к заданному времени.
Ключи командной строки для запуска 1С без диалогов
Любой скрипт перезапуска в итоге вызывает исполняемый файл платформы. Чтобы запуск прошёл без окна выбора базы и без вопросов, базу и пользователя передают ключами.
Где лежат файлы:
- 📁
C:\Program Files\1cv8\<номер версии>\bin\1cv8.exe— толстый клиент и Конфигуратор; - 📁
C:\Program Files\1cv8\<номер версии>\bin\1cv8c.exe— тонкий клиент; - 📁
C:\Program Files\1cv8\common\1cestart.exe— стартер, сам выбирает версию платформы.
Основные ключи:
| Ключ | Назначение |
|---|---|
ENTERPRISE / DESIGNER | Режим: пользовательский или Конфигуратор |
/F"путь" | Файловая база, путь к каталогу |
/S"сервер\база" | Клиент-серверная база |
/N"имя" /P"пароль" | Пользователь и пароль 1С |
/WA+ | Вход через аутентификацию Windows |
/DisableStartupMessages | Не показывать стартовые сообщения |
/DisableStartupDialogs | Не показывать диалоги при запуске |
/UC код | Код разрешения входа в заблокированную базу |
/C строка | Параметр запуска, читается в коде через ПараметрЗапуска |
/Out"файл" | Файл служебных сообщений (для логов) |
Пример запуска тонкого клиента на серверную базу:
"C:\Program Files\1cv8\8.3.24.1548\bin\1cv8c.exe" ENTERPRISE /S"srv1c\buh" /N"Робот" /P"пароль" /DisableStartupMessages /DisableStartupDialogs
Номер версии в пути подставьте свой. Чтобы скрипт не ломался после обновления платформы, вызывайте 1cestart.exe — он подберёт нужную версию сам.
Пароль в открытом виде в bat-файле прочитает любой, у кого есть доступ к папке. Для служебных скриптов заведите отдельного пользователя 1С с минимальными правами или используйте /WA+ под служебной учётной записью Windows.
Перезапуск из кода конфигурации
Самый мягкий способ — программа перезапускает себя сама. Метод глобального контекста ЗавершитьРаботуСистемы принимает три параметра:
ЗапрашиватьВозможность— вызывать ли обработчики перед завершением (вопрос о несохранённых данных).ПерезапуститьПриЗавершении— приИстинаклиент откроется снова.ДополнительныеПараметрыКоманднойСтроки— строка ключей для нового запуска.
&НаКлиенте
Процедура ПерезапуститьПрограмму(Команда)
// Спросить о несохранённых данных и открыть программу заново
ЗавершитьРаботуСистемы(Истина, Истина, "/C ПослеПерезапуска");
КонецПроцедуры
При старте параметр доступен в переменной ПараметрЗапуска. По нему удобно, например, открыть нужную форму или показать сообщение «Обновление применено».
Второй метод — ПрекратитьРаботуСистемы(Перезапустить, ДополнительныеПараметры). Он закрывает приложение без вопросов к пользователю. Применяйте его только там, где несохранённых данных точно нет, например в служебной обработке, запущенной роботом.
Оба метода работают только на клиенте. Из фонового задания или серверной процедуры перезапустить клиент нельзя: там нужен внешний скрипт или завершение сеанса через кластер.
Скрипт VBS для перезапуска 1С через WSH
Когда программу нужно перезапустить снаружи — по расписанию на терминальном сервере или по сигналу мониторинга — удобен VBScript. Он есть в любой Windows и не требует установки.
Сценарий скрипта:
- Найти процессы клиента через WMI.
- Завершить их.
- Подождать, пока процессы выгрузятся.
- Запустить клиент с нужными ключами.
- Записать результат в лог.
Option Explicit
Dim wmi, procs, p, shell, cmd, killed
Const LOG = "C:\Scripts\restart1c.log"
Set wmi = GetObject("winmgmts:\\.\root\cimv2")
Set procs = wmi.ExecQuery("Select * From Win32_Process Where Name='1cv8c.exe' Or Name='1cv8.exe'")
killed = 0
For Each p In procs
p.Terminate()
killed = killed + 1
Next
WriteLog "Завершено процессов: " & killed
WScript.Sleep 5000
Set shell = CreateObject("WScript.Shell")
cmd = """C:\Program Files\1cv8\common\1cestart.exe"" ENTERPRISE /S""srv1c\buh"" /WA+ /DisableStartupMessages"
shell.Run cmd, 1, False
WriteLog "Клиент запущен"
Sub WriteLog(text)
Dim fso, f
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.OpenTextFile(LOG, 8, True)
f.WriteLine Now & " " & text
f.Close
End Sub
На терминальном сервере такой скрипт закроет 1С у всех пользователей сразу. Чтобы затронуть только одного, добавьте в запрос фильтр по владельцу процесса: у объекта Win32_Process есть метод GetOwner, он возвращает имя пользователя Windows.
Завершение процесса — это аварийное закрытие: всё, что пользователь не записал, пропадёт. Запускайте скрипт в нерабочее время или после предупреждения.
Тот же результат в одну строку даёт bat-файл с taskkill /IM 1cv8c.exe /F, но в VBS проще добавить условия, паузы и журнал.
Управление сеансами через COM-соединение и rac
В клиент-серверном варианте процесс на машине пользователя — лишь половина картины. Сеанс живёт на сервере, и если клиент «умер» некорректно, сеанс может остаться и держать лицензию. Обрывать его нужно через кластер.
COMConnector
Компонента comcntr.dll ставится вместе с платформой. Если она не зарегистрирована, зарегистрируйте её от имени администратора:
regsvr32 "C:\Program Files\1cv8\8.3.24.1548\bin\comcntr.dll"
Разрядность важна. 64-битная компонента видна только 64-битному cscript.exe из C:\Windows\System32. Для 32-битной платформы скрипт запускают через C:\Windows\SysWOW64\cscript.exe.
Скрипт завершает все сеансы одной базы, кроме консоли администрирования:
Dim connector, agent, clusters, cluster, sessions, s
Set connector = CreateObject("V83.COMConnector")
Set agent = connector.ConnectAgent("tcp://srv1c:1540")
clusters = agent.GetClusters()
For Each cluster In clusters
agent.Authenticate cluster, "", "" ' администратор кластера и пароль, если заданы
sessions = agent.GetSessions(cluster)
For Each s In sessions
If LCase(s.infoBase.Name) = "buh" And s.AppID <> "SrvrConsole" Then
agent.TerminateSession cluster, s
End If
Next
Next
Подключение идёт к агенту сервера на порт 1540. По полю AppID можно оставить нужные сеансы: например, не трогать фоновые задания (BackgroundJob) или Конфигуратор (Designer).
Утилита rac
Начиная с 8.3 то же самое делает консольная утилита rac. Ей нужен запущенный сервер администрирования ras (по умолчанию порт 1545).
rac cluster list
rac session list --cluster=<id кластера>
rac session terminate --cluster=<id кластера> --session=<id сеанса>
Если на кластере задан администратор, добавьте --cluster-user и --cluster-pwd. Чтобы новые пользователи не заходили, пока вы работаете, включите блокировку сеансов у информационной базы — состав параметров для rac infobase update смотрите в rac help infobase.
rac удобнее для PowerShell и Linux: вывод текстовый, его легко разбирать. COMConnector хорош там, где уже есть VBS-обвязка.
Рестарт службы сервера 1С
Если сервер перестал отвечать, а рабочие процессы rphost.exe раздулись до десятков гигабайт, сеансами не обойтись — перезапускают службу агента.
Перезапуск службы обрывает все сеансы всех баз на этом сервере. Делайте его ночью или после рассылки предупреждения. Если на сервере крутятся регламентные задания (обмены, загрузка банковских выписок), проверьте, что они не выполняются в этот момент.
Windows
Имя службы зависит от версии и разрядности. Узнайте его командой:
Get-Service | Where-Object { $_.DisplayName -like "*1C:Enterprise*" }
Перезапуск в PowerShell:
Get-Service | Where-Object { $_.DisplayName -like "*1C:Enterprise 8.3 Server Agent*" } | Restart-Service -Force
То же в bat-файле через net stop "<имя службы>" и net start "<имя службы>". Сервер администрирования ras, если он установлен как служба, перезапускайте отдельно.
После остановки проверьте, что процессы действительно выгрузились: tasklist /FI "IMAGENAME eq rphost.exe". Если rphost висит дольше минуты, его завершают через taskkill /F.
Linux
systemctl list-units --all | grep srv1cv8
sudo systemctl restart <имя юнита>
В последних версиях платформы имя юнита содержит номер версии, поэтому сначала найдите его через list-units.
Перезапуск по расписанию
Скрипт удобно повесить на Планировщик заданий Windows:
schtasks /Create /TN "Restart1C" /TR "C:\Windows\System32\cscript.exe //nologo C:\Scripts\restart1c.vbs" /SC DAILY /ST 03:00 /RU SYSTEM
Учётная запись SYSTEM не видит сетевые диски и не имеет пользовательского профиля. Если скрипт запускает клиент 1С, задайте в задании конкретного служебного пользователя.
Ночной рестарт по расписанию лечит симптом, а не причину. Если без него сервер не доживает до утра, ищите утечку: тяжёлые регламентные задания, разросшийся журнал регистрации, настройки перезапуска рабочих процессов в свойствах рабочего сервера.
Логирование и обработка ошибок
Скрипт, который ночью молча упал, хуже, чем его отсутствие: утром все уверены, что перезапуск был. Минимальный набор защиты:
- 📝 Журнал в файл. Каждое действие с датой и временем, как в процедуре
WriteLogвыше. - 🔍 Перехват ошибок. В VBS —
On Error Resume Nextперед рискованной операцией и проверкаErr.Numberсразу после неё. - 📄 Сообщения платформы. Ключ
/Out"C:\Scripts\1c_out.txt"запишет то, что 1С показала бы в окне. С-NoTruncateфайл дописывается, а не перезаписывается. - 🔢 Код возврата.
shell.Run cmd, 0, Trueждёт завершения и возвращает код процесса: ноль — успех. - 🔔 Оповещение. При ошибке — письмо или сообщение в мессенджер, а не только запись в файл.
Пример обработки ошибки подключения к кластеру:
On Error Resume Next
Set agent = connector.ConnectAgent("tcp://srv1c:1540")
If Err.Number <> 0 Then
WriteLog "Нет связи с агентом: " & Err.Description
WScript.Quit 1
End If
On Error GoTo 0
Частые причины сбоев в таких скриптах:
| Ошибка в логе | Причина | Что делать |
|---|---|---|
ActiveX component can't create object | comcntr.dll не зарегистрирована или разрядность не совпадает | Зарегистрировать нужную версию, запустить подходящий cscript.exe |
| Нет связи с агентом | Служба остановлена, закрыт порт 1540 | Проверить службу и брандмауэр |
| Ошибка аутентификации | Задан администратор кластера | Передать имя и пароль в Authenticate |
| Клиент не запустился | Неверный путь к версии платформы | Перейти на 1cestart.exe |
Ещё один полезный источник — журнал регистрации базы. После перезапуска в нём видно, какие сеансы были завершены и когда пользователи вошли снова.
Частые вопросы
Можно ли перезапустить 1С из фонового задания?
Освобождается ли лицензия после завершения процесса клиента?
Чем перезапуск рабочего процесса отличается от перезапуска службы?
rphost обрывает только сеансы, которые он обслуживал. Рестарт службы агента затрагивает все базы на сервере и все рабочие процессы.Нужен ли перезапуск сервера 1С после обновления конфигурации?
Как перезапустить 1С у всех пользователей терминального сервера одним скриптом?
1cv8c.exe всех пользователей. Запустить клиент заново за каждого пользователя из одного скрипта нельзя: каждый откроет программу сам.