Администрирование · 10 мин
Как закрыть программу 1С программно
Как закрыть программу 1С программно: методы ЗавершитьРаботуСистемы, ПрекратитьРаботуСистемы, завершение сеансов через консоль кластера и COM, примеры кода и типичные ошибки.
Программное закрытие 1С требуется в разных сценариях: автоматическое завершение работы пользователей перед регламентным обслуживанием базы, закрытие клиентского приложения из встроенного кода по условию, принудительное снятие зависших сеансов на сервере. У каждой задачи свой инструмент, и ошибка в выборе метода приводит либо к потере несохранённых данных, либо к тому, что сеанс продолжает висеть и блокирует базу.
Встроенный язык 1С предоставляет несколько методов завершения работы, отличающихся поведением при наличии несохранённых данных и модальности. Для серверных баз дополнительно доступны административные инструменты: консоль кластера серверов, утилита rac и COM-коннектор V83.COMConnector. Ниже разобраны все рабочие способы с примерами кода и ограничениями.
Перед применением любого принудительного способа убедитесь, что в базе нет активных длительных операций — проведения больших документов, закрытия месяца, обмена данными. Принудительное завершение таких операций может оставить транзакции в незавершённом состоянии и потребовать последующего восстановления данных.
Завершение работы из встроенного кода 1С
Основной метод для штатного закрытия клиентского приложения — ЗавершитьРаботуСистемы(). Он инициирует стандартную процедуру выхода: если есть несохранённые данные или открытые модифицированные формы, пользователь получит вопрос о сохранении. Метод принимает два параметра: запрашивать ли подтверждение и перезапускать ли приложение после завершения.
Пример вызова из формы:
ЗавершитьРаботуСистемы(Истина, Ложь);
// Истина — задать вопрос пользователю при наличии несохранённых данных
// Ложь — не перезапускать приложение после закрытия
Если требуется закрыть программу без вопросов, используется ПрекратитьРаботуСистемы(). Этот метод завершает работу немедленно, без сохранения данных в открытых формах. Его применяют в автоматизированных сценариях, где вмешательство пользователя нежелательно — например, при завершении регламентного сеанса обмена.
// Принудительное завершение без вопросов
ПрекратитьРаботуСистемы();
// Завершение с перезапуском (например, после обновления конфигурации)
ЗавершитьРаботуСистемы(Ложь, Истина);
Закрытие по таймеру и по условию
Типовая задача — закрыть программу автоматически через заданное время или после выполнения операции. Для этого используют обработчики ожидания, которые подключаются на клиенте через ПодключитьОбработчикОжидания().
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Проверка условия каждые 60 секунд
ПодключитьОбработчикОжидания("ПроверитьУсловиеЗавершения", 60);
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьУсловиеЗавершения()
Если РаботаЗавершена() Тогда
ОтключитьОбработчикОжидания("ПроверитьУсловиеЗавершения");
ЗавершитьРаботуСистемы(Ложь);
КонецЕсли;
КонецПроцедуры
Обратите внимание: обработчики ожидания работают только в клиентском контексте и только пока приложение активно. В фоновом задании на сервере закрыть чужой клиентский сеанс этим способом нельзя — для этого нужны механизмы администрирования, описанные ниже.
Завершение сеансов пользователей через консоль кластера
Для серверных баз администратор может принудительно завершить любой сеанс через оснастку «Администрирование серверов 1С:Предприятия». Откройте консоль, раскройте нужный кластер, перейдите в ветку «Сеансы», найдите сеанс пользователя по имени или компьютеру и выберите в контекстном меню «Удалить». Сеанс будет разорван немедленно, клиентское приложение пользователя закроется с сообщением о разрыве соединения.
Этот способ подходит для точечного снятия зависших сеансов. Признак зависшего сеанса — отсутствие активности (колонка «Последний вызов» не обновляется) при том, что пользователь фактически не работает. Прежде чем удалять сеанс активного пользователя, убедитесь, что он не выполняет длительную операцию: в консоли видно время текущего вызова СУБД.
- 1Откройте оснастку «Администрирование серверов 1С:Предприятия»
- 2Раскройте кластер и перейдите в раздел «Сеансы»
- 3Найдите сеанс по имени пользователя или компьютеру
- 4Проверьте время последнего вызова, чтобы не снять активную работу
- 5Контекстное меню — «Удалить», подтвердите действие
- 6Убедитесь, что сеанс исчез из списка
Завершение сеансов через утилиту rac
Для автоматизации администрирования удобнее командная утилита rac из состава сервера 1С. Она позволяет получить список сеансов и завершить их скриптом, что удобно для ночного обслуживания базы.
rem Получить список сеансов кластера
rac session --cluster=<ID-кластера> list
rem Завершить конкретный сеанс
rac session --cluster=<ID-кластера> terminate --session=<ID-сеанса>
Типовой сценарий ночного обслуживания включает три шага: установка блокировки сеансов, ожидание завершения активных операций, принудительное снятие оставшихся сеансов. Блокировку также устанавливают через rac (команда infobase update с параметром запрета подключений) или через консоль кластера в свойствах информационной базы.
rac infobase --cluster=<ID> update --infobase=<ID-базы> --sessions-deny=on --denied-message="Идёт обслуживание базы"Программное завершение через COM и внешнее подключение
Когда сеансы нужно закрыть из внешнего скрипта или другой базы 1С, используют COM-соединитель V83.COMConnector совместно с объектом агента сервера. Через него можно перебрать сеансы кластера и вызвать метод завершения. Этот подход требует установленного COM-коннектора соответствующей версии платформы и прав учётной записи, от имени которой выполняется скрипт.
Альтернатива для файловых баз — запуск 1С в пакетном режиме с параметром /C (передача команды конфигурации) и обработчиком, который выполняет завершение работы. Однако для файловых баз чаще достаточно завершить процесс операционной системы, если приложение зависло.
Завершение зависшего процесса на уровне ОС
Если клиент 1С не отвечает и не реагирует на программные методы, на локальной машине процесс завершают через диспетчер задач (процессы 1cv8.exe, 1cv8c.exe для тонкого клиента) или командой taskkill. Это крайняя мера: транзакция, выполнявшаяся в момент завершения, будет откачена, а в файловой базе при активной записи есть риск повреждения данных.
taskkill /F /IM 1cv8.exe
Проверка результата и штатный сценарий обслуживания
После любого способа завершения проверьте результат. В консоли кластера список сеансов должен быть пуст (кроме, возможно, фоновых заданий и системных соединений). Для клиентского приложения признак успешного закрытия — отсутствие процесса 1cv8 в диспетчере задач. Если сеанс остался после удаления, проверьте, не является ли он спящим соединением СУБД — такие соединения снимаются по таймауту или отдельно на стороне СУБД.
Штатный порядок подготовки серверной базы к обслуживанию выглядит так: установить блокировку новых сеансов с сообщением пользователям, дождаться завершения активных операций (обычно 10–30 минут в зависимости от регламентов), принудительно снять оставшиеся сеансы, выполнить обслуживание, снять блокировку. Такой порядок исключает и потерю данных, и ситуацию, когда пользователи возвращаются в базу раньше времени.
Как проверить результат
Сеансов пользователей нет
Сеанс остался после удаления — проверьте спящие соединения СУБД
1cv8.exe отсутствует в диспетчере задач
Процесс висит — завершите через taskkill
В свойствах базы установлен запрет сеансов
База открыта — пользователи переподключатся
Что важно запомнить
Из кода клиента используйте ЗавершитьРаботуСистемы (с вопросом) или ПрекратитьРаботуСистемы (принудительно). Чужие сеансы на сервере снимают через консоль кластера или rac, предварительно заблокировав новые подключения. Завершение процесса ОС — крайняя мера с риском для данных.
Частые вопросы
Чем отличается ЗавершитьРаботуСистемы от ПрекратитьРаботуСистемы?
Первый метод инициирует штатное закрытие с возможностью вопроса о сохранении несохранённых данных, второй закрывает приложение немедленно и без вопросов. Для интерактивных сценариев безопаснее первый, для автоматических регламентных — второй.
Можно ли закрыть 1С у конкретного пользователя из кода другой базы?
Да, через COM-коннектор и объекты агента сервера: подключитесь к агенту, получите список сеансов кластера, найдите нужный и вызовите завершение. Потребуются права администратора кластера и установленный COM-коннектор той же версии платформы.
Почему после удаления сеанса пользователь сразу возвращается в базу?
Потому что не установлена блокировка новых подключений. Удаление сеанса разрывает текущее соединение, но не запрещает новое. Установите блокировку в свойствах информационной базы через консоль кластера или rac, затем снимайте сеансы.
Опасно ли завершать процесс 1cv8.exe через диспетчер задач?
Для клиентского приложения, подключённого к серверной базе, риск минимален: незавершённая транзакция откатится на сервере. Для файловой базы принудительное завершение во время записи может повредить файл данных, поэтому перед этим убедитесь, что приложение действительно зависло, а не выполняет длительную операцию.
Как закрыть 1С автоматически в заданное время всем пользователям?
Стандартный подход — плановое задание на сервере (скрипт с rac или PowerShell), которое в назначенное время устанавливает блокировку сеансов и завершает активные. В файловых базах централизованного механизма нет — используют встроенные в конфигурацию напоминания с автозавершением по таймеру.
Работает ли ЗавершитьРаботуСистемы в веб-клиенте?
Да, метод поддерживается в веб-клиенте и закрывает текущий сеанс работы с приложением. Однако поведение при наличии несохранённых данных и перезапуске может отличаться от тонкого клиента, поэтому сценарий стоит проверить именно в том клиенте, который используется в работе.