При интеграции внешних систем, таких как СКУД (Система контроля и управления доступом), с платформой 1С часто возникает проблема «зависающих» соединений. Внешняя система подключается для обмена данными, но по ряду причин — сетевой сбой, некорректная обработка исключений или отсутствие команды на закрытие — сеанс остается активным на сервере 1С. Это приводит к тому, что лицензии заняты, а список активных пользователей переполнен «зомби-сеансами». Давайте разберем, как проанализировать эту ситуацию и какие способы решения существуют.
Первым делом важно проанализировать, почему сеанс остается Активным. Часто внешние системы не выполняют корректную процедуру завершения сеанса через метод ЗавершитьРаботуСистемы(). В результате сервер 1С считает, что соединение все еще живо, и продолжает удерживать его в памяти, блокируя лицензию.
Прежде чем приступать к принудительному завершению, рекомендуем проверить настройки таймаутов на сервере 1С. В консоли администрирования можно настроить параметры Безопасный расход памяти и Время жизни неактивного сеанса. Однако, если сеанс не переходит в состояние неактивного, а просто «висит», потребуются программные методы воздействия.
Одним из наиболее эффективных решений является внедрение механизма регламентного контроля. Мы можем создать регламентное задание, которое будет периодически проверять список активных пользователей и принудительно завершать те, которые превысили допустимое время бездействия.
Рассмотрим пример того, как можно получить список сеансов и проанализировать их:
// Пример получения списка сеансов
СписокСеансов = ПолучитьСписокАктивныхПользователей();
Для Каждого Сеанс Из СписокСеансов Цикл
Если Сеанс.ИмяПользователя = \"ПользовательСКУД\" И Сеанс.ВремяНачала < (ТекущаяДата() - 3600) Тогда
// Здесь мы можем инициировать завершение
КонецЕсли;
КонецЦикла;
Однако помните, что внутри встроенного языка 1С не всегда есть возможность «убить» чужой сеанс напрямую, если у пользователя нет прав администратора кластера. В таких случаях мы используем внешние инструменты управления.
Если прав внутри базы недостаточно, мы можем использовать штатную утилиту rac.exe (Remote Administration Console). Это стандартный инструмент платформы 1С для управления кластером серверов. Вы можете написать скрипт на PowerShell, который будет выполнять поиск «зависших» сеансов по имени приложения или имени пользователя и принудительно их завершать.
Логика работы скрипта будет выглядеть следующим образом:
rac session list.rac session terminate --session=... для тех сеансов, которые соответствуют критериям «зависания».Наиболее надежный метод решения проблемы — отказ от длительных соединений. Вместо того чтобы держать сеанс открытым все время работы СКУД, перестройте обмен на использование HTTP-сервисов или Web-сервисов.
Преимущества данного подхода:
Если сеансы продолжают «зависать», настоятельно советуем включить Технологический журнал. Настройте фильтрацию по событию CONN (соединения) и SESS (сеансы). Анализ логов позволит увидеть, получает ли сервер 1С сигнал о разрыве соединения от ОС, или соединение обрывается «молча».
Если вы видите, что СКУД перестает отвечать, а сеанс остается, значит, проблема на стороне сетевого взаимодействия или логики внешнего приложения. В таком случае, внедрение регламентного задания или переход на HTTP-сервисы станет для вас единственным способом стабилизировать работу системы. Проанализируйте возможности вашего СКУД: если он поддерживает отправку POST/GET запросов, то архитектурный переход на Web-сервисы будет самым профессиональным решением задачи.