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

Особенность работы с сеансами в заключается в многоуровневой архитектуре: клиентские подключения, серверные вызовы, фоновые задания — каждый тип требует своего подхода. Например, принудительное завершение сеанса через RAC может привести к потере несохранённых данных в открытых документах, в то время как «мягкое» закрытие через встроенный язык позволяет корректно завершить транзакции. Мы проанализируем плюсы и минусы каждого метода, а также дадим рекомендации по безопасности и логированию.

1. Закрытие сеансов через встроенный язык 1С

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

Пример кода для завершения всех сеансов текущего пользователя:

Процедура ЗакрытьСеансыПользователя(ИмяПользователя)

Пользователи = ПользователиИнформационнойБазы.НайтиПоИмени(ИмяПользователя);

Если Не Пользователи.Пустая() Тогда

Сеансы = Сеансы.ПолучитьСеансыПользователя(Пользователи[0]);

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

Попытка

Сеансы.ЗавершитьСеанс(Сеанс.УникальныйИдентификатор, Ложь); // Второй параметр - принудительно (Ложь = мягкое завершение)

Исключение

ЗаписатьЖурналРегистрации(УровеньЖурнала.Ошибка, , ОписаниеОшибки());

КонецПопытки;

КонецЦикла;

КонецЕсли;

КонецПроцедуры

  • 🔹 Плюсы: не требует прав администратора сервера, работает из любой конфигурации, поддерживает уведомления пользователям.
  • 🔹 Минусы: не завершает фоновые задания, не работает с «зависшими» сеансами, которые не отвечают на команды.
  • 🔹 Ограничения: в веб-клиенте и тонком клиенте некоторые методы могут быть заблокированы политиками безопасности.
⚠️ Внимание: При использовании параметра Истина в методе ЗавершитьСеанс() сеанс будет завершён принудительно, что эквивалентно «убийству» процесса. Это может привести к повреждению данных в открытых транзакциях. Всегда проверяйте наличие незавершённых операций через Сеанс.АктивныеТранзакции.
📊 Какой способ закрытия сеансов вы используете чаще?
Встроенный язык 1С
Команды rac
SQL-запросы к кластеру
Скрипты PowerShell
Другое

2. Команды RAC для управления кластером серверов 1С

Remote Administration Console (RAC) — стандартный инструмент для администрирования серверных кластеров 1С:Предприятие. Команды rac позволяют завершать сеансы по различным критериям: имя пользователя, ID сеанса, тип клиента (толстый/тонкий/веб). Этот метод подходит для автоматизации через bat-файлы или PowerShell-скрипты.

Базовые команды для работы с сеансами:

# Просмотр активных сеансов

rac session list --cluster=ИмяКластера

Завершение сеанса по ID

rac session terminate --cluster=ИмяКластера --session-id=12345

Завершение всех сеансов пользователя

rac session terminate --cluster=ИмяКластера --user-name=ИвановИИ --force

Команда Описание Пример
session list Выводит список активных сеансов с ID, именем пользователя и типом клиента rac session list --cluster=MainCluster --output=table
session terminate Завершает сеанс по ID или имени пользователя. Флаг --force принудительно убивает процесс rac session terminate --session-id=67890 --force
session disconnect Отключает клиента без завершения серверного сеанса (данные остаются в кэше) rac session disconnect --user-name=PetrovAA

Для автоматизации рекомендуется использовать rac в связке с schtasks (планировщик Windows) или cron (Linux). Например, следующий скрипт завершает все сеансы в 3:00 ночи:

@echo off

for /f "tokens=1" %%s in ('rac session list --cluster=MainCluster --output=table ^| findstr /r "[0-9]\{5\}"') do (

rac session terminate --cluster=MainCluster --session-id=%%s --force

)

⚠️ Внимание: Команды rac требуют прав администратора кластера. Принудительное завершение сеансов (--force) может привести к блокировкам в базе данных, если в момент выполнения команды происходили записи в транзакциях. Перед массовым завершением сеансов рекомендуется выполнить rac cluster healthcheck.

Создать резервную копию информационной базы|Уведомить пользователей о плановом отключении|Проверить отсутствие длинных транзакций|Запустить тестовый скрипт на одном сеансе|Настроить логирование результатов-->

3. Работа с сеансами через COM-соединение (внешнее управление)

Если необходимо управлять сеансами из внешних приложений (например, C#, Python или VBScript), можно использовать COM-соединение с 1С:Предприятием. Этот метод подходит для интеграции с системами мониторинга или автоматизированными панелями администрирования.

Пример на VBScript для завершения сеансов:

Set v83 = CreateObject("V83.ComConnector")

Set sessionManager = v83.Connect("File=""C:\Bases\Main"";Usr=""Администратор""")

Set sessions = sessionManager.GetSessions()

For Each session In sessions

If session.UserName = "ИвановИИ" Then

session.Terminate False ' False = мягкое завершение

End If

Next

  • 🔹 Преимущества: кроссплатформенность (работает и на Windows, и на Linux через Wine), возможность интеграции с другими системами.
  • 🔹 Недостатки: требует настройки прав доступа в 1cv81c.dll, может блокироваться антивирусами.
  • 🔹 Особенности: для работы с кластером необходимо указывать строку подключения вида "Srvr=""server_name"";Ref=""cluster_name"";".

Для Python можно использовать библиотеку pywin32:

import win32com.client

v83 = win32com.client.Dispatch("V83.ComConnector")

sessions = v83.Connect("Srvr=""localhost"";Ref=""MainCluster"";").GetSessions()

for session in sessions:

if session.UserName == "PetrovAA":

session.Terminate(True) # True = принудительное завершение

💡

Для отладки COM-соединений используйте утилиту OLEView из пакета Windows SDK. Она позволяет просматривать все доступные методы и свойства объектов 1С.

4. SQL-запросы к системной базе кластера (продвинутый метод)

Для опытных администраторов доступен метод прямого обращения к системной базе данных кластера (обычно PostgreSQL или Microsoft SQL Server). В таблицах sessions и processes хранятся данные о текущих подключениях, которые можно завершить через SQL-команды.

Пример запроса для PostgreSQL:

-- Просмотр активных сеансов

SELECT s.session_id, u.user_name, s.start_time, s.client_application

FROM sessions s

JOIN users u ON s.user_id = u.user_id

WHERE s.is_active = true;

-- Принудительное завершение сеанса по ID

SELECT pg_terminate_backend(pid)

FROM pg_stat_activity

WHERE pid = (

SELECT backend_pid FROM sessions WHERE session_id = 12345

);

⚠️ Внимание: Прямое вмешательство в системную базу кластера может нарушить её целостность. Этот метод следует использовать только в крайних случаях (например, когда сеанс «завис» и не реагирует на rac). Всегда делайте резервную копию перед выполнением SQL-команд.

Для Microsoft SQL Server аналогичный запрос будет выглядеть так:

-- Завершение сеанса по SPID

KILL 54; -- где 54 - SPID сеанса из sys.dm_exec_sessions

СУБД Таблица с сеансами Команда завершения
PostgreSQL sessions, pg_stat_activity pg_terminate_backend(pid)
Microsoft SQL Server sys.dm_exec_sessions KILL <SPID>
IBM DB2 SYSCAT.DBCONNECTIONS FORCE APPLICATION (application_id)

5. Автоматизация через PowerShell и планировщик задач

Для регулярного завершения сеансов (например, ночью для освобождения лицензий) удобно использовать PowerShell-скрипты. Ниже приведён пример скрипта, который завершает все сеансы старше 2 часов:

[CmdletBinding()]

param (

[string]$ClusterName = "MainCluster",

[int]$MaxSessionAgeHours = 2

)

$racPath = "C:\Program Files\1cv8\8.3.x.x\bin\rac.exe"

$sessions = & $racPath session list --cluster=$ClusterName --output=json | ConvertFrom-Json

foreach ($session in $sessions) {

$sessionAge = (Get-Date) - $session.start_time

if ($sessionAge.TotalHours -gt $MaxSessionAgeHours) {

& $racPath session terminate --cluster=$ClusterName --session-id=$session.id --force

Write-Host "Завершён сеанс $($session.id) пользователя $($session.user_name)"

}

}

Чтобы запускать скрипт по расписанию:

  1. Сохраните код в файл CloseOldSessions.ps1.
  2. Создайте задачу в Планировщике задач Windows с триггером по времени.
  3. В действии задачи укажите: powershell.exe -ExecutionPolicy Bypass -File "C:\Scripts\CloseOldSessions.ps1".
Как проверить права на выполнение RAC-команд?

Для проверки прав выполните команду rac cluster info --cluster=ИмяКластера. Если появится ошибка "Access denied", необходимо:

1. Добавить пользователя в группу "Администраторы 1С" на сервере.

2. Настроить права в консоли администрирования кластера (1C:Enterprise 8 Server Administrator).

3. Перезапустить службу "1C:Enterprise 8 Server Agent".

6. Особенности работы с веб-клиентом и мобильными сеансами

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

  • 📱 Мобильные клиенты: использовать метод Сеансы.ЗавершитьСеансыМобильногоПриложения() (доступен с версии 8.3.18).
  • 🌐 Веб-клиенты: завершать через rac с фильтром по типу клиента (--client-application=WebClient).
  • 🔄 Пул соединений: в веб-клиенте сеансы могут переиспользоваться. Для их сброса требуется рестарт службы Apache или IIS.

Пример команды для завершения веб-сеансов:

rac session terminate --cluster=MainCluster --client-application=WebClient --older-than=3600

где --older-than указывает время в секундах (здесь — сеансы старше 1 часа).

⚠️ Внимание: Принудительное завершение веб-сеансов может привести к ошибкам в браузере пользователя ("Connection lost"). Рекомендуется предварительно отправлять уведомление через WebSocket или Push-сервис.

7. Логирование и мониторинг завершённых сеансов

Важный аспект автоматизации — ведение логов. Без логирования невозможно отследить, какие сеансы были завершены и по какой причине. Минимальный набор данных для лога:

  • 📝 ID сеанса и имя пользователя.
  • ⏱️ Время начала и завершения сеанса.
  • 🛠️ Метод завершения (мягкий/принудительный).
  • ⚠️ Статус операции (успех/ошибка).

Пример кода для логирования во встроенном языке:

Процедура ЗаписатьЛогЗавершения(Сеанс, Результат, СообщениеОбОшибке = "")

Лог = Новый Структура();

Лог.Вставить("Время", ТекущаяДата());

Лог.Вставить("Пользователь", Сеанс.Пользователь.Имя);

Лог.Вставить("IDСеанса", Сеанс.УникальныйИдентификатор);

Лог.Вставить("Результат", Результат);

Лог.Вставить("Ошибка", СообщениеОбОшибке);

ЗаписьЖурнала = Новый ЗаписьЖурналаРегистрации();

ЗаписьЖурнала.Уровень = Если Результат Тогда УровеньЖурнала.Информация Иначе УровеньЖурнала.Ошибка;

ЗаписьЖурнала.Сообщение = Формат("Завершение сеанса: %1. Пользователь: %2", Лог.IDСеанса, Лог.Пользователь);

ЗаписьЖурнала.Дополнительно = Лог;

ЖурналРегистрации.Записать(ЗаписьЖурнала);

КонецПроцедуры

Для внешних скриптов (PowerShell, Bash) логи можно писать в файл или отправлять в системы мониторинга (Zabbix, Prometheus). Пример для PowerShell:

$logMessage = "[$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')] Сеанс $sessionId пользователя $userName завершён с кодом $exitCode"

Out-File -FilePath "C:\Logs\1C_Sessions.log" -Append -InputObject $logMessage

💡

Всегда настраивайте ротацию логов (например, через logrotate в Linux или Task Scheduler в Windows), чтобы файлы не занимали всё дисковое пространство.

FAQ: Частые вопросы по программному завершению сеансов

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

Да, если использовать «мягкое» завершение через встроенный язык (Сеансы.ЗавершитьСеанс(..., Ложь)). Система дождётся завершения текущей транзакции (или её отката) и только затем закроет сеанс. Однако если транзакция «зависла» (например, из-за блокировки), придётся использовать принудительное завершение.

Почему после завершения сеанса через RAC он снова появляется в списке?

Это типичная ситуация для фоновых заданий или реплицированных сеансов в кластере. Проверьте:

  1. Наличие фоновых задач в Администрирование → Фоновые задания.
  2. Настройки репликации в кластере (сеансы могут мигрировать между рабочими процессами).
  3. Кэш сеансов в веб-клиенте (иногда требуется очистка кэша браузера).

Как завершить сеансы на удалённом сервере без RDP?

Есть несколько способов:

  • Использовать rac через SSH (для Linux-серверов).
  • Настроить REST-сервис в 1С, который будет вызывать процедуру завершения сеансов.
  • Использовать 1С:EDT с подключением к удалённому репозиторию.

Пример вызова через SSH:

ssh admin@1c-server "rac session terminate --cluster=MainCluster --user-name=ИвановИИ"

Что делать, если сеанс «завис» и не реагирует ни на какие команды?

Последовательность действий:

  1. Попробуйте завершить сеанс через SQL (если используется СУБД).
  2. Перезапустите рабочий процесс кластера: rac cluster process restart --cluster=ИмяКластера --process-id=ID_Процесса.
  3. В крайнем случае перезапустите службу 1C:Enterprise 8 Server Agent.
⚠️ Внимание: Перезапуск службы приведёт к обрыву всех сеансов на сервере!

Как ограничить максимальное время сеанса?

Настройте параметр Сеансовая активность в конфигураторе:

  1. Откройте конфигуратор и перейдите в Администрирование → Настройки программы.
  2. Установите флаг Ограничивать время сеанса и укажите лимит (например, 8 часов).
  3. Для принудительного завершения по таймауту используйте обработчик события ПриПревышенииЛимитаСеанса.

Также можно настроить автоматическое завершение через rac с параметром --older-than.