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

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

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

Способы программного завершения сеансов 1С: консоль кластера, RAC, встроенный язык, регламентные задания. Готовые примеры кода, риски и проверка результата.

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

Программно завершить сеансы можно несколькими путями: через утилиту администрирования кластера RAC, через COM-соединение с агентом сервера, штатными средствами встроенного языка (методы объекта «СоединенияИБ» и административные обработки), а также через стандартную подсистему «Завершение работы пользователей» из Библиотеки стандартных подсистем. Выбор зависит от того, где выполняется код — внутри базы или снаружи, — и от того, есть ли доступ к серверу администрирования.

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

Что нужно знать о сеансах и соединениях перед отключением

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

Перед массовым отключением полезно получить список активных сеансов и понять, кто есть кто. Это делается через консоль кластера, через RAC командой session list или программно. Обращайте внимание на поля: имя пользователя, приложение (1CV8, 1CV8C, WebServer, BackgroundJob), время начала сеанса и время последнего обращения. Фоновые задания и сеансы веб-сервисов часто не имеют «живого» пользователя, и их завершение безопаснее, чем разрыв работающего клиента.

Приложение сеанса1CV8 / 1CV8C / WebServer / BackgroundJob

Толстый и тонкий клиенты — живые пользователи; фоновые задания и веб-сервисы — программные сеансы

Время последнего обращенияДавно не обращался

Сеанс, вероятно, завис или оставлен без присмотра — кандидат на завершение

БлокировкиЕсть управляемые блокировки

Сеанс держит данные; отключение прервёт транзакцию других пользователей

Режим блокировки сеансовУстановлена / не установлена

Проверьте, не включена ли уже блокировка начала сеансов, иначе пользователи переподключатся

Завершение сеансов через утилиту RAC

Утилита командной строки RAC (rac.exe) входит в состав сервера 1С и позволяет администрировать кластер без запуска графической консоли. Это основной инструмент для скриптов: её можно вызывать из bat-файлов, PowerShell, планировщика заданий Windows или cron через SSH. Утилита находится в каталоге установки сервера, например в папке bin соответствующей версии платформы.

Типовой сценарий состоит из трёх шагов: получить идентификатор кластера, получить список сеансов нужной информационной базы, завершить каждый сеанс командой session terminate. Ниже пример последовательности команд.

rem 1. Список кластеров

rac cluster list

rem 2. Список сеансов по кластеру

rac session list --cluster=<ID_кластера>

rem 3. Завершение конкретного сеанса

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

Для массового завершения список сеансов разбирают в скрипте и вызывают terminate в цикле, фильтруя по имени информационной базы и исключая сеанс самого администратора. В PowerShell удобно парсить вывод rac session list и пропускать сеансы с пустым именем пользователя и фоновые задания, которые завершатся сами.

powershell
$cluster = "<ID_кластера>"
$sessions = rac session list --cluster=$cluster
# отфильтровать сеансы нужной базы и завершить каждый:
rac session terminate --cluster=$cluster --session=<ID_сеанса>

Если на агенте сервера включена аутентификация администраторов, к каждой команде добавляйте параметры --cluster-user и --cluster-pwd. Без них RAC вернёт ошибку доступа, и скрипт молча ничего не сделает — проверяйте код возврата и вывод утилиты.

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

Получение списка соединений и сеансов

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

Соединения = ПолучитьСоединенияИнформационнойБазы();

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

Если Соединение.ИмяПриложения = "1CV8"

И Соединение.Пользователь <> Неопределено

И Соединение.Пользователь.Имя <> "Администратор" Тогда

// фиксируем кандидата на отключение

КонецЕсли;

КонецЦикла;

Блокировка установки соединений

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

Блокировка = ПолучитьБлокировкуСоединенийИнформационнойБазы();

Блокировка.Установлена = Истина;

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

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

Блокировка.Сообщение = "Идёт обновление, вход временно закрыт";

Блокировка.КодРазрешения = "Обслуживание123";

УстановитьБлокировкуСоединенийИнформационнойБазы(Блокировка);

Параметр «Код разрешения» позволяет администратору войти в базу во время блокировки, указав код в параметре запуска /UC. Не забудьте снять блокировку после завершения работ — забытая блокировка с пустой датой окончания оставит базу закрытой для всех, кто не знает код.

Подсистема «Завершение работы пользователей» в БСП

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

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

Порядок мягкого отключения через БСП
  1. 1
    Открыть Администрирование — Обслуживание — Блокировка работы пользователей
  2. 2
    Установить время начала блокировки и текст сообщения пользователям
  3. 3
    Задать код разрешения для входа администратора
  4. 4
    Дождаться истечения таймаута — сеансы завершатся автоматически
  5. 5
    Проверить отсутствие сеансов в консоли кластера или через ПолучитьСоединенияИнформационнойБазы
  6. 6
    После работ снять блокировку соединений

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

Файловые базы: особенности и ограничения

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

Грубый, но иногда единственный вариант — завершить процессы 1cv8.exe на компьютерах пользователей или перезапустить сервер, раздающий файловую базу по сети. Это равносильно выдергиванию питания: риск повреждения файла 1Cv8.1CD при активной записи невелик, но существует, поэтому такой способ применяйте только при полном зависании и после копии файла базы.

Сравнение способов отключения

RAC / консоль кластера

Подходит для клиент-серверных баз и скриптов; требует доступа к серверу администрирования и прав администратора кластера

БСП «Блокировка работы пользователей»

Мягкое отключение с предупреждением; работает только внутри одной базы на БСП

ПолучитьСоединенияИнформационнойБазы + блокировка

Гибкий код изнутри базы; соединения разрывать придётся косвенно или через административную обработку

Завершение процессов / перезапуск службы

Аварийный вариант при зависшем кластере или файловой базе; риск потери несохранённых данных

Автоматизация: регламентные задания и внешние скрипты

Для регулярных задач (ночная выгрузка, обновление по расписанию) удобно связать внешний скрипт и внутреннюю блокировку. Схема: планировщик Windows запускает PowerShell-скрипт, который через RAC устанавливает для базы блокировку сеансов (infobase session deny set), ждёт несколько минут, завершает оставшиеся сеансы и только потом запускает обновление конфигурации пакетным режимом конфигуратора.

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

Типичные ошибки
01
Завершить сеансы, но не установить блокировку — пользователи переподключатся через минуту и сорвут обновление
02
Отключить собственный сеанс администратора в цикле — скрипт оборвётся на середине, оставив часть сеансов активными
03
Забыть снять блокировку соединений после работ — утром никто не сможет войти в базу
04
Разорвать соединения во время обмена данными — получить рассинхронизацию узлов и повторную полную выгрузку
05
Не исключить фоновые регламентные задания — отключение в середине загрузки курсов или расчёта оставит неполные данные

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

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

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

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

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

Сеансов базы нет или только спящие, исчезающие по таймауту

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

Активные сеансы переподключаются — блокировка не установлена

Фоновые задания
Норма

Нет выполняющихся регламентных заданий

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

Задания стартуют заново — нужно отключить их расписание

Блокировка соединений
Норма

Установлена с кодом разрешения и датой окончания

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

Блокировка забыта после работ — пользователи не могут войти

Если сеансы «не умирают» после terminate, чаще всего причина в том, что разорвано соединение, а сеанс остался спящим, либо пользовательский клиент настроен на автоматическое переподключение. В первом случае дождитесь таймаута сеанса (по умолчанию задаётся в свойствах информационной базы), во втором — установите блокировку сеансов до начала отключения.

Итог

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

Снаружи сеансы завершают через RAC (session terminate), изнутри — через блокировку соединений и подсистему БСП. Перед массовым отключением установите блокировку новых сеансов, предупредите пользователей, исключите свой сеанс и фоновые задания, а после работ снимите блокировку и проверьте результат.

FAQ

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

Да. В RAC найдите его сеанс командой session list с фильтром по базе, определите идентификатор сеанса по имени пользователя и выполните session terminate только для него. В консоли кластера то же делается выделением нужной строки в списке сеансов.

Чем завершение сеанса отличается от разрыва соединения?

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

Как не дать пользователям сразу переподключиться после отключения?

Перед завершением сеансов установите блокировку начала сеансов: через RAC (infobase session deny set), программно методом УстановитьБлокировкуСоединенийИнформационнойБазы или через «Блокировку работы пользователей» в БСП. Задайте код разрешения, чтобы администратор мог войти.

Потеряют ли пользователи данные при принудительном завершении?

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

Как завершить сеансы в файловой базе без сервера 1С?

Изнутри — через блокировку соединений и подсистему БСП с рассылкой предупреждений. Снаружи программного API нет; аварийный вариант — завершение процессов 1cv8.exe на рабочих станциях, но делайте это только после создания копии файла базы.

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

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