Как организовать автоматическое отключение неактивных пользователей в 1С:Предприятие

Системный администратор 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Штатные механизмы платформы 1С 8.3 (Клиент-серверный вариант)

Начнем с самого современного и надежного способа, который появился в платформе 8.3. Если вы работаете в клиент-серверном режиме, нам не нужно писать сложные скрипты — достаточно правильно настроить параметры информационной базы в консоли администрирования кластера серверов 1С.

Разберем основные параметры, которые помогут нам управлять «спящими» сессиями:

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

Для настройки откроем Консоль администрирования кластера серверов, перейдем в свойства нужной информационной базы и установим значения, например, 3600 (1 час) для засыпания и 600 (10 минут) для завершения. Это позволит системе автоматически «прибирать» за забывчивыми сотрудниками.

Использование Библиотеки стандартных подсистем (БСП)

Если ваша конфигурация построена на базе БСП (например, 1C:Бухгалтерия 3.0, Управление торговлей 11 или ЗУП 3.1), в ней уже заложен функционал автоматического завершения работы. Проанализируем, как его включить:

Перейдем в раздел Администрирование — Обслуживание — Завершение работы пользователей. Здесь можно настроить параметры блокировки соединений. Однако для автоматического выгона при простое в современных типовых решениях часто используется механизм «Автозавершение сеансов при бездействии».

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

Программная реализация для файлового режима (через константу)

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

Разберем пример кода, который можно разместить в модуле управляемого приложения:


Процедура ПриНачалеРаботыСистемы()
    // Подключаем проверку раз в минуту (60 секунд)
    ПодключитьОбработчикОжидания("ПроверитьНеобходимостьВыхода", 60);
КонецПроцедуры

Процедура ПроверитьНеобходимостьВыхода() Экспорт
    // Предположим, у нас есть константа ЗавершитьРаботуПользователей
    Если Константы.ЗавершитьРаботуПользователей.Получить() Тогда
        ПоказатьПредупреждение(, "Внимание! Работа системы завершается администратором через 2 минуты.", 120);
        ЗавершитьРаботуСистемы(Ложь);
    КонецЕсли;
КонецПроцедуры

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

Принудительное завершение через системные утилиты (PsKill)

Если «мягкие» методы не помогают, рассмотрим более радикальный подход — использование утилиты PsKill или встроенной команды taskkill. Этот метод эффективен, когда нужно очистить базу для проведения ночного бэкапа или обновления индекса в файловом режиме.

Выясним, как это работает на практике. Мы можем создать .bat или .cmd файл, который будет запускаться по расписанию через планировщик Windows:

taskkill /F /IM 1cv8.exe /T

Параметр /F означает принудительное завершение, /IM задает имя образа процесса, а /T завершает также и все дочерние процессы. Предупреждение: такой метод является «жестким». Принудительное «убивание» процесса может привести к повреждению файловой базы (индексов .cdx или самого файла .1cd). Используйте этот метод только в крайнем случае и после того, как был дан шанс на «мягкий» выход.

Настройка терминального сервера (RDP)

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

  1. Откроем Редактор локальной групповой политики (gpedit.msc).
  2. Перейдем в раздел: Конфигурация компьютера -> Административные шаблоны -> Компоненты Windows -> Службы удаленных рабочих столов -> Узел сеансов удаленных рабочих столов -> Ограничение сеансов по времени.
  3. Настроим параметр «Задайте предел времени для активных, но бездействующих сеансов служб удаленных рабочих столов». Например, установим 2 часа.
  4. Также полезно настроить «Завершать сеанс при достижении предела времени», чтобы после дисконнекта ресурсы сервера освобождались полностью.

Это гарантированно закроет 1С вместе с сессией пользователя, независимо от того, какие окна у него открыты в программе.

Использование SQL-скриптов для клиент-серверного варианта

Иногда нужно быстро отключить всех от конкретной базы на уровне 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).

Подведем итоги и выберем стратегию

Проанализировав все способы, мы рекомендуем комбинированный подход:

  1. Для 1С 8.3 на сервере: в первую очередь используйте штатные настройки консоли кластера («Время засыпания»). Это самый правильный метод с точки зрения лицензирования.
  2. Для файловых баз: используйте встроенные средства БСП или самописный обработчик ожидания с предупреждением, а в ночное время — планировщик задач с командой net session /delete /y (для отключения сетевых подключений к файлам базы).
  3. Для терминальных серверов: обязательно настраивайте политики простоя RDP, так как это экономит не только лицензии 1С, но и оперативную память сервера.

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

← На главную