Автоматический перезапуск 1С:Предприятия: от кода конфигурации до службы сервера

· 9 мин

Содержание

Перезапустить 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.

Перезапуск из кода конфигурации

Самый мягкий способ — программа перезапускает себя сама. Метод глобального контекста ЗавершитьРаботуСистемы принимает три параметра:

  1. ЗапрашиватьВозможность — вызывать ли обработчики перед завершением (вопрос о несохранённых данных).
  2. ПерезапуститьПриЗавершении — при Истина клиент откроется снова.
  3. ДополнительныеПараметрыКоманднойСтроки — строка ключей для нового запуска.
&НаКлиенте
Процедура ПерезапуститьПрограмму(Команда)
	// Спросить о несохранённых данных и открыть программу заново
	ЗавершитьРаботуСистемы(Истина, Истина, "/C ПослеПерезапуска");
КонецПроцедуры

При старте параметр доступен в переменной ПараметрЗапуска. По нему удобно, например, открыть нужную форму или показать сообщение «Обновление применено».

Второй метод — ПрекратитьРаботуСистемы(Перезапустить, ДополнительныеПараметры). Он закрывает приложение без вопросов к пользователю. Применяйте его только там, где несохранённых данных точно нет, например в служебной обработке, запущенной роботом.

Оба метода работают только на клиенте. Из фонового задания или серверной процедуры перезапустить клиент нельзя: там нужен внешний скрипт или завершение сеанса через кластер.

Скрипт VBS для перезапуска 1С через WSH

Когда программу нужно перезапустить снаружи — по расписанию на терминальном сервере или по сигналу мониторинга — удобен VBScript. Он есть в любой Windows и не требует установки.

Сценарий скрипта:

  1. Найти процессы клиента через WMI.
  2. Завершить их.
  3. Подождать, пока процессы выгрузятся.
  4. Запустить клиент с нужными ключами.
  5. Записать результат в лог.
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 objectcomcntr.dll не зарегистрирована или разрядность не совпадаетЗарегистрировать нужную версию, запустить подходящий cscript.exe
Нет связи с агентомСлужба остановлена, закрыт порт 1540Проверить службу и брандмауэр
Ошибка аутентификацииЗадан администратор кластераПередать имя и пароль в Authenticate
Клиент не запустилсяНеверный путь к версии платформыПерейти на 1cestart.exe

Ещё один полезный источник — журнал регистрации базы. После перезапуска в нём видно, какие сеансы были завершены и когда пользователи вошли снова.

Частые вопросы

Можно ли перезапустить 1С из фонового задания?
Нет. Фоновое задание выполняется на сервере и не управляет клиентским приложением. Оно может только завершить сеансы через COMConnector или вызвать внешний скрипт.
Освобождается ли лицензия после завершения процесса клиента?
В файловом варианте — сразу. В клиент-серверном сеанс на сервере может повисеть до истечения таймаута, поэтому надёжнее завершить его через кластер.
Чем перезапуск рабочего процесса отличается от перезапуска службы?
Завершение одного rphost обрывает только сеансы, которые он обслуживал. Рестарт службы агента затрагивает все базы на сервере и все рабочие процессы.
Нужен ли перезапуск сервера 1С после обновления конфигурации?
Обычно нет. Достаточно, чтобы пользователи перезапустили клиент. Службу перезапускают после обновления самой платформы на сервере.
Как перезапустить 1С у всех пользователей терминального сервера одним скриптом?
VBS через WMI завершает процессы 1cv8c.exe всех пользователей. Запустить клиент заново за каждого пользователя из одного скрипта нельзя: каждый откроет программу сам.