К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как завершить работу 1С программно

Способы программного завершения работы 1С: ЗавершитьРаботуСистемы, командная строка, taskkill, COM-соединение. Примеры кода, риски потери данных и проверка результата.

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

Ключевой принцип выбора способа прост: сначала всегда пытаются завершить работу штатно, дав платформе корректно закрыть транзакции и записать данные, и только при невозможности этого прибегают к принудительному снятию процессов. Принудительное завершение — это крайняя мера, которая в клиент-серверном режиме может оставить «висячие» сеансы на сервере, а в файловом — повредить файл базы при обрыве записи.

Завершение работы из встроенного языка 1С

Основной инструмент внутри самого сеанса — глобальный метод ЗавершитьРаботуСистемы(). Он инициирует штатное закрытие приложения: платформа вызывает обработчики завершения, закрывает открытые формы, завершает фоновые задания и разрывает соединение с базой корректно. Синтаксис метода: ЗавершитьРаботуСистемы(ЗапрашиватьВозможность, ПерезапуститьПриЗавершении, ДополнительныеПараметрыКоманднойСтроки).

Параметр ЗапрашиватьВозможность определяет, будет ли пользователю показан диалог подтверждения. Значение Ложь завершает работу без вопросов — это стандарт для автоматических сценариев. Параметр ПерезапуститьПриЗавершении позволяет сразу перезапустить клиент, что удобно при смене настроек, требующих перезапуска. Третий параметр задаёт дополнительные ключи командной строки для нового запуска.

bsl
// Завершить работу без запроса подтверждения
ЗавершитьРаботуСистемы(Ложь);

// Завершить с перезапуском
ЗавершитьРаботуСистемы(Ложь, Истина);

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

Завершение по таймеру или после обработки

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

Завершение сеансов через командную строку и пакетный режим

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

Первый подход: запуск с параметром /Execute (исполнение обработки) или /C (передача строки в конфигурацию), внутри которой код сам завершит работу. Например, пакетный файл для ночной выгрузки запускает тонкий клиент, выполняет внешнюю обработку, а та в конце вызывает ЗавершитьРаботуСистемы(Ложь). Признак успеха — код возврата процесса и наличие файла результата.

batch
"C:\Program Files\1cv8\8.3.22.1750\bin\1cv8.exe" ENTERPRISE /F"D:\Bases\Trade" /NАдминистратор /P*** /Execute"D:\Scripts\NightUnload.epf" /DisableStartupDialogs

Второй подход — завершение сеансов на уровне сервера 1С. Через консоль администрирования сервера или утилиту RAC администратор может принудительно завершить конкретные сеансы по их номерам. Команда RAC вида rac session --cluster=<id> terminate --session=<id> корректно с точки зрения сервера разрывает сеанс, хотя на стороне клиента несохранённые данные формы будут потеряны.

Принудительное завершение процессов операционной системой

Когда клиент завис и не отвечает, остаётся снятие процесса средствами ОС. В Windows это команда taskkill или диспетчер задач. Процессы клиента 1С называются 1cv8.exe (толстый и тонкий клиенты) и 1cv8c.exe (тонкий клиент). Команда taskkill /F /IM 1cv8.exe завершает все процессы платформы на машине, поэтому на компьютере, где работают несколько пользователей или несколько баз, она опасна — завершатся все сеансы сразу.

batch
:: Завершить все процессы 1С текущего пользователя
taskkill /F /IM 1cv8.exe /FI "USERNAME eq %USERNAME%"

:: Посмотреть процессы перед завершением
tasklist /FI "IMAGENAME eq 1cv8.exe"

Более точечный вариант — завершение по PID. Сначала через tasklist находят идентификатор нужного процесса, затем выполняют taskkill /PID <номер> /F. В PowerShell аналог — Stop-Process -Id <номер> -Force. Для сценариев автоматизации рекомендуется перед снятием процесса сделать паузу и повторную попытку штатного закрытия: часто «зависший» клиент просто выполняет тяжёлую операцию.

Типичные ошибки
01
Применение taskkill /F /IM 1cv8.exe на терминальном сервере — завершаются сеансы всех пользователей сразу
02
Завершение файловой базы во время записи — риск повреждения файла 1Cv8.1CD и необходимость восстановления
03
Вызов ЗавершитьРаботуСистемы до окончания фонового задания — задание обрывается, данные остаются частично записанными
04
Отсутствие проверки кода возврата в пакетном сценарии — скрипт считает операцию успешной, хотя клиент завершился с ошибкой

Завершение работы через COM-соединение и внешние приложения

При управлении 1С извне через COM-объект V83.COMConnector сеанс завершается освобождением соединения: в коде внешнего приложения объект соединения обнуляется (Nothing в VBScript, сборка мусора в .NET). Однако на практике COM-соединения нередко «зависают» на сервере, если внешнее приложение аварийно завершилось. Такие сеансы видны в консоли кластера и снимаются административно.

Для веб-сервисов и HTTP-сервисов 1С понятие «завершения работы» неприменимо — сеанс живёт только на время вызова. А вот для сценариев, где внешняя программа управляет толстым клиентом через автоматизацию (OLE), корректное завершение выполняется вызовом метода завершения работы системы через объектную модель, а не убийством процесса.

Как выбрать способ завершения под свою задачу

Выбор механизма определяется тем, кто инициирует завершение и какие гарантии нужны. Внутри прикладного кода всегда используйте ЗавершитьРаботуСистемы() — это единственный способ, при котором платформа гарантирует корректное закрытие. Административные задачи (освобождение базы перед обновлением) решаются через RAC или консоль кластера с предварительной блокировкой новых соединений. Снятие процессов через ОС — только для зависших клиентов.

Маршрут решения

Как выбрать действие

Код выполняется внутри сеанса 1С и нужно закрыть приложениеИспользуйте ЗавершитьРаботуСистемы(Ложь) после завершения всех фоновых заданий
Нужно освободить серверную базу перед обновлением конфигурацииУстановите блокировку соединений и завершите сеансы через RAC или консоль кластера
Клиент завис и не отвечает на действия пользователяСнимите конкретный процесс по PID через taskkill или Stop-Process
Внешнее приложение работает с базой через COMЗавершайте работу освобождением объекта соединения, а не снятием процесса

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

Порядок действий перед обновлением
  1. 1
    Установите блокировку соединений с базой через консоль кластера или RAC
  2. 2
    Получите список активных сеансов и уведомите пользователей
  3. 3
    Дождитесь завершения сеансов или завершите их командой RAC session terminate
  4. 4
    Выполните обновление конфигурации или обслуживание
  5. 5
    Снимите блокировку и проверьте, что пользователи могут войти

Проверка результата и контрольные точки

После программного завершения работы нужно убедиться, что оно действительно произошло и не оставило следов. Для локального клиента признак успеха — отсутствие процесса 1cv8.exe в списке задач. Для серверной базы — пустой список сеансов в консоли кластера (кроме служебных). Для пакетных сценариев — код возврата процесса и наличие ожидаемых файлов результата.

Контрольные точки

Как проверить результат

Процессы 1С на машине
Норма

1cv8.exe отсутствует в tasklist после завершения

Тревожный признак

Процесс остался — клиент завис или завершение не сработало

Сеансы в консоли кластера
Норма

Список сеансов пуст или только служебные

Тревожный признак

Активные сеансы пользователей — база не освобождена

Файл базы (файловый режим)
Норма

База открывается без ошибок после завершения

Тревожный признак

Ошибка открытия — требуется тестирование и исправление chdbfl

Код возврата пакетного запуска
Норма

Код 0 и создан файл результата

Тревожный признак

Ненулевой код — смотрите журнал регистрации

Если после принудительного завершения файловой базы при следующем входе появляются ошибки, базу проверяют утилитой chdbfl.exe из каталога платформы и штатным тестированием и исправлением конфигуратора. Это стандартная реакция на обрыв записи — паниковать не нужно, но и игнорировать проверку нельзя.

Итог

Что важно запомнить

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

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

Чем отличается ЗавершитьРаботуСистемы от ПрекратитьРаботуСистемы?

Первый метод инициирует штатное завершение с вызовом обработчиков ПередЗавершениемРаботыСистемы, которые могут отменить выход. Второй прекращает работу безусловно, минуя часть проверок. В прикладном коде почти всегда используют первый вариант.

Можно ли завершить работу 1С через планировщик задач Windows?

Да, но правильнее не убивать процесс, а запускать по расписанию пакетный сценарий, который либо выполняет обработку с автозавершением, либо завершает сеансы через RAC. Прямой taskkill по расписанию оправдан только для зависших фоновых клиентов.

Что происходит с несохранёнными данными при завершении сеанса через RAC?

Сеанс разрывается на стороне сервера, и все несохранённые данные открытых форм теряются. Уже записанные в базу данные не пострадают — сервер корректно завершает транзакции сеанса.

Почему после taskkill файловая база не открывается?

Если процесс был снят в момент записи в файл 1Cv8.1CD, структура файла могла повредиться. Запустите утилиту chdbfl.exe из каталога bin платформы, укажите файл базы и выполните проверку с исправлением ошибок, затем штатное тестирование в конфигураторе.

Как завершить работу всех пользователей перед обновлением, не бегая по кабинетам?

Установите блокировку соединений с информационной базой в консоли кластера с сообщением пользователям, затем завершите оставшиеся сеансы командой RAC session terminate. Пользователи увидят текст блокировки и не смогут войти до её снятия.

Можно ли из кода 1С завершить сеанс другого пользователя?

Да, в серверном режиме через ПолучитьСеансыИнформационнойБазы() можно найти нужный сеанс и вызвать у него метод ПрерватьСеанс(). Для этого у текущего пользователя должны быть административные права на кластер или соответствующие права в конфигурации.