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

Администрирование · 10 мин

Как программно завершить сеанс пользователя в 1С

Как программно завершить сеанс пользователя в 1С: GetInfoDBSessions, УдалитьСеанс, прерывание через регламентное задание и кластер. Примеры кода и типичные ошибки.

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

В 1С:Предприятии 8.3 есть несколько программных механизмов завершения сеансов: через объектную модель кластера серверов (V83.COMConnector / административная библиотека), через регламентное задание «Контроль режима работы» в типовых конфигурациях на базе БСП, а также через прерывание текущего сеанса изнутри — методами встроенного языка. Выбор зависит от режима работы базы (файловая или клиент-серверная), наличия прав администратора кластера и того, чей сеанс нужно завершить — свой или чужой.

Ниже разобраны рабочие способы с примерами кода, условиями применения и ограничениями каждого подхода.

Какие сеансы бывают и что можно завершить

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

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

Способ 1. Завершение сеансов через кластер серверов

Основной способ для клиент-серверного режима — подключение к агенту кластера через COM-объект V83.COMConnector или внешнюю административную библиотеку. Логика: подключаемся к агенту, получаем список рабочих процессов и сеансов, фильтруем по пользователю или номеру, вызываем метод завершения.

Примерный порядок кода на встроенном языке (выполняется на компьютере, где зарегистрирован COM-коннектор той же версии платформы):

Коннектор = Новый COMОбъект("V83.COMConnector");

Агент = Коннектор.ConnectAgent("srv1c:1540");

// Аутентификация администратора кластера

Агент.Authenticate("", "");

Кластеры = Агент.GetClusters();

Кластер = Кластеры[0];

Агент.Authenticate(Кластер, "АдминКластера", "Пароль");

РабочиеПроцессы = Агент.GetWorkingProcesses(Кластер);

Для Каждого Процесс Из РабочиеПроцессы Цикл

Соединение = Коннектор.ConnectWorkingProcess("srv1c:" + Процесс.MainPort);

Соединение.AddAuthentication(Соединение, "АдминБД", "ПарольБД");

Сеансы = Соединение.GetInfoBaseSessions(ИнфБаза);

Для Каждого Сеанс Из Сеансы Цикл

Если Сеанс.UserName = "ИвановИИ" Тогда

Соединение.TerminateSession(ИнфБаза, Сеанс);

КонецЕсли;

КонецЦикла;

КонецЦикла;

Обращайте внимание на версию COM-коннектора: она должна совпадать с версией сервера 1С, иначе подключение завершится ошибкой. На 64-разрядном сервере регистрируется соответствующая библиотека comcntr.dll.

Способ 2. Блокировка сеансов и завершение через БСП

В конфигурациях на базе Библиотеки стандартных подсистем (УТ, ERP, Бухгалтерия, ЗУП) встроен штатный механизм «Блокировка работы пользователей». Он не «убивает» сеансы мгновенно, а корректно просит пользователей завершить работу: при установке блокировки активным пользователям показывается сообщение с таймером, по истечении которого клиентское приложение закрывается автоматически.

Программно блокировку можно установить через процедуры общего модуля СоединенияИБ:

Блокировка = Новый Структура;

Блокировка.Вставить("Установлена", Истина);

Блокировка.Вставить("Начало", ТекущаяДатаСеанса());

Блокировка.Вставить("Конец", ТекущаяДатаСеанса() + 3600);

Блокировка.Вставить("Сообщение", "Проводится обновление. Завершите работу.");

Блокировка.Вставить("КодРазрешения", "ПарольДляВхода");

СоединенияИБ.УстановитьБлокировкуСоединений(Блокировка);

Через несколько минут (интервал проверки задаётся параметром блокировки) активные клиенты получат уведомление и завершат работу. Оставшиеся «зависшие» сеансы, которые не реагируют, придётся снимать через кластер способом из предыдущего раздела.

Способ 3. Завершение собственного сеанса из кода

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

// На клиенте, с подтверждением

ЗавершитьРаботуСистемы(Истина);

// Без подтверждения, принудительно

ЗавершитьРаботуСистемы(Ложь);

// С перезапуском после завершения

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

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

Способ 4. Завершение через RAS и консольные утилиты

Для автоматизации вне 1С удобен сервер администрирования RAS в связке с утилитой rac. Команда завершения сеанса выглядит так:

bash
rac session --cluster=<ID_кластера> terminate --session=<ID_сеанса>

Сначала запрашивается список сеансов командой rac session list, из вывода берётся идентификатор нужного сеанса, затем выполняется terminate. Этот вариант удобно оборачивать в скрипты PowerShell или bat и запускать по расписанию — например, для ночного отключения всех сеансов перед резервным копированием.

RAS должен быть запущен как служба, а версия утилиты rac должна соответствовать версии кластера. Аутентификация администратора кластера передаётся параметрами --cluster-user и --cluster-pwd.

Ограничения файлового режима

В файловой базе нет кластера серверов, поэтому TerminateSession и rac недоступны. Программно завершить чужой сеанс штатными средствами невозможно — платформа не предоставляет такого API. Рабочие варианты: блокировка соединений через БСП с ожиданием выхода пользователей, либо внешние средства — например, принудительное завершение процессов 1cv8.exe на компьютерах пользователей через PsExec или групповые политики. Последний способ грубый: несохранённые данные будут потеряны, а файл базы при аварийном разрыве может потребовать проверки целостности.

Типичные ошибки
01
Попытка завершить сеанс через ПолучитьСеансыИнформационнойБазы — функция только возвращает список, метода завершения у неё нет
02
Несовпадение версии V83.COMConnector с версией сервера — подключение падает с ошибкой
03
Массовый TerminateSession без фильтра по типу сеанса — отключаются фоновые задания обмена и служебные сеансы
04
Ожидание мгновенного выхода пользователей после блокировки БСП — клиенты проверяют блокировку с интервалом, а не сразу

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

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

Дополнительный признак — отсутствие активных соединений с СУБД: в MS SQL Server это видно в Activity Monitor или запросом к sys.dm_exec_sessions по имени базы. Если соединения остаются после завершения всех сеансов, вероятно, есть «зависшие» рабочие процессы кластера, которые иногда требуют перезапуска службы агента.

Итог

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

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

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

Можно ли завершить сеанс пользователя, не имея прав администратора кластера?

Напрямую через TerminateSession — нет, метод требует аутентификации администратора кластера или информационной базы. Альтернатива — механизм блокировки соединений БСП, который доступен пользователю с правами администратора внутри самой базы.

Почему после TerminateSession сеанс снова появляется в списке?

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

Как завершить только сеансы определённого пользователя?

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

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

ЗавершитьРаботуСистемы выполняет штатное закрытие с возможностью подтверждения и перезапуска. Принудительный разрыв соединения (TerminateSession со стороны сервера) не даёт клиенту сохранить данные и обработать закрытие форм.

Можно ли завершить сеанс по расписанию?

Да. Создайте регламентное задание или внешний скрипт (rac + планировщик Windows), который получает список сеансов и завершает их в заданное время. Предварительно установите блокировку соединений и оповестите пользователей.

Опасно ли завершать сеансы во время обмена данными?

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