Проблема «зависших» или забытых сессий в 1С знакома каждому администратору. Пользователи уходят на обед или домой, оставляя программу открытой, что приводит к нецелевому расходу лицензий, блокировкам при обновлении конфигурации и замедлению работы системы. В этой статье мы подробно разберем, как автоматизировать процесс завершения работы неактивных пользователей, используя как внутренние инструменты платформы, так и внешние системные средства.
Начнем с самого современного и надежного способа, который появился в платформе 8.3. Если вы работаете в клиент-серверном режиме, нам не нужно писать сложные скрипты — достаточно правильно настроить параметры информационной базы в консоли администрирования кластера серверов 1С.
Разберем основные параметры, которые помогут нам управлять «спящими» сессиями:
Для настройки откроем Консоль администрирования кластера серверов, перейдем в свойства нужной информационной базы и установим значения, например, 3600 (1 час) для засыпания и 600 (10 минут) для завершения. Это позволит системе автоматически «прибирать» за забывчивыми сотрудниками.
Если ваша конфигурация построена на базе БСП (например, 1C:Бухгалтерия 3.0, Управление торговлей 11 или ЗУП 3.1), в ней уже заложен функционал автоматического завершения работы. Проанализируем, как его включить:
Перейдем в раздел Администрирование — Обслуживание — Завершение работы пользователей. Здесь можно настроить параметры блокировки соединений. Однако для автоматического выгона при простое в современных типовых решениях часто используется механизм «Автозавершение сеансов при бездействии».
Этот механизм работает через ОбработчикОжидания. Программа периодически проверяет время последнего обращения к серверу. Если время превышает заданный порог, система выводит предупреждение пользователю и через некоторое время закрывает приложение. Главный плюс этого метода — корректное закрытие всех форм и завершение транзакций.
В файловом варианте работы всё сложнее, так как консоли сервера нет. Рассмотрим классический метод с использованием «флага» в базе данных. Идея заключается в том, что программа периодически проверяет значение определенной константы, и если она установлена в «Истина», инициирует закрытие.
Разберем пример кода, который можно разместить в модуле управляемого приложения:
Процедура ПриНачалеРаботыСистемы()
// Подключаем проверку раз в минуту (60 секунд)
ПодключитьОбработчикОжидания("ПроверитьНеобходимостьВыхода", 60);
КонецПроцедуры
Процедура ПроверитьНеобходимостьВыхода() Экспорт
// Предположим, у нас есть константа ЗавершитьРаботуПользователей
Если Константы.ЗавершитьРаботуПользователей.Получить() Тогда
ПоказатьПредупреждение(, "Внимание! Работа системы завершается администратором через 2 минуты.", 120);
ЗавершитьРаботуСистемы(Ложь);
КонецЕсли;
КонецПроцедуры
Важный нюанс: как отмечалось в обсуждении на форуме, этот метод может не сработать, если у пользователя открыто модальное окно (например, окно выбора файла или предупреждение). В этом случае обработчик ожидания просто не запустится, пока окно не будет закрыто. Это «слабое место» чистого кода на 1С.
Если «мягкие» методы не помогают, рассмотрим более радикальный подход — использование утилиты PsKill или встроенной команды taskkill. Этот метод эффективен, когда нужно очистить базу для проведения ночного бэкапа или обновления индекса в файловом режиме.
Выясним, как это работает на практике. Мы можем создать .bat или .cmd файл, который будет запускаться по расписанию через планировщик Windows:
taskkill /F /IM 1cv8.exe /T
Параметр /F означает принудительное завершение, /IM задает имя образа процесса, а /T завершает также и все дочерние процессы. Предупреждение: такой метод является «жестким». Принудительное «убивание» процесса может привести к повреждению файловой базы (индексов .cdx или самого файла .1cd). Используйте этот метод только в крайнем случае и после того, как был дан шанс на «мягкий» выход.
Если ваши пользователи работают в терминальном режиме, то эффективнее всего настраивать ограничения на уровне операционной системы. Рассмотрим настройку параметров сеансов удаленных рабочих столов:
Конфигурация компьютера -> Административные шаблоны -> Компоненты Windows -> Службы удаленных рабочих столов -> Узел сеансов удаленных рабочих столов -> Ограничение сеансов по времени.Это гарантированно закроет 1С вместе с сессией пользователя, независимо от того, какие окна у него открыты в программе.
Иногда нужно быстро отключить всех от конкретной базы на уровне MS SQL Server. Посмотрим на логику такого решения. Мы можем перевести базу в режим SINGLE_USER с немедленным разрывом всех соединений, а затем вернуть в MULTI_USER.
USE master;
ALTER DATABASE [Имя_Вашей_Базы]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE;
ALTER DATABASE [Имя_Вашей_Базы]
SET MULTI_USER;
Этот скрипт мгновенно обрывает все активные транзакции и подключения. Пользователи в 1С увидят сообщение «Сеанс отсутствует или завершен администратором». Это гораздо безопаснее для структуры данных, чем taskkill, так как SQL Server сам заботится о целостности транзакций при откате (rollback).
Проанализировав все способы, мы рекомендуем комбинированный подход:
net session /delete /y (для отключения сетевых подключений к файлам базы).Помните, что перед внедрением «жестких» методов выгона необходимо уведомить пользователей. Как показывает практика, пара потерянных из-за автозавершения несохраненных документов лучше всего дисциплинирует сотрудников и приучает их закрывать 1С в конце рабочего дня.