При обслуживании систем на базе 1С:Предприятие 8, таких как "Управление торговлей 10.3", часто возникает необходимость принудительно завершить работу пользователей. Это может потребоваться для обновления конфигурации, выполнения регламентных операций или монопольного внесения изменений в данные. Использование стандартной консоли администрирования кластера серверов не всегда удобно, особенно если мы хотим автоматизировать этот процесс внутри самой программы. В данной статье мы подробно рассмотрим, как реализовать механизм «выкидывания» пользователей программными средствами.
Этот метод является наиболее прямым и эффективным для клиент-серверных версий 1С. Мы будем использовать программный интерфейс администрирования через COMConnector. Проанализируем базовый алгоритм работы этого кода.
Для начала нам необходимо создать объект соединения с сервером 1С. Обратите внимание, что в зависимости от версии установленной платформы имя объекта может отличаться (например, V81.COMConnector, V82.COMConnector или актуальный V83.COMConnector). Рекомендуем использовать версию 8.3, так как она наиболее стабильна и поддерживает современные методы работы с кластером.
Разберем пример кода для отключения всех пользователей в конкретной базе:
// Создаем соединение с COM-администратором платформы
Коннектор = Новый COMОбъект("V83.COMConnector");
// Подключаемся к рабочему процессу сервера.
// "TestServer" - имя вашего сервера 1С.
Сервер = Коннектор.ConnectWorkingProcess("TestServer");
// Проходим авторизацию администратора кластера
Сервер.AddAuthentication("Администратор", "ПарольАдмина");
// Определяем параметры информационной базы
ИнформационнаяБаза = Сервер.CreateInfoBaseInfo();
ИнформационнаяБаза.Name = "Test_Base"; // Имя базы в кластере
// Получаем массив всех активных соединений с базой
СоединенияБазы = Сервер.GetIBConnections(ИнформационнаяБаза);
// Итерируемся по списку и принудительно разрываем каждое соединение
Для Каждого Соединение Из СоединенияБазы Цикл
// Важно: здесь можно добавить проверку на имя пользователя,
// чтобы не выкинуть самого себя или системные службы.
Сервер.Disconnect(Соединение);
КонецЦикла;
Важное примечание: При выполнении этого кода на клиентском компьютере часто возникает ошибка «Определение принадлежности клиентского и серверного процессов одному компьютеру». Чтобы избежать этой проблемы, проанализируем рекомендации опытных разработчиков: данный код должен выполняться строго в серверном контексте (например, в модуле с установленным флагом «Сервер» или через фоновое задание). Это связано с настройками безопасности DCOM в операционной системе Windows.
Просто «выкинуть» пользователя бывает недостаточно, так как активный пользователь или регламентное задание могут попытаться войти в систему снова через несколько секунд. Чтобы полноценно подготовить базу к обслуживанию, мы должны программно установить флаг блокировки соединений. Это делается через свойства объекта InformationBaseInfo.
Рассмотрим, какие свойства нам помогут:
SessionsDenied — установив это свойство в значение Истина, мы запрещаем вход новым пользователям.LockMessage — текст, который увидит пользователь при попытке входа (например, "База закрыта на техническое обслуживание до 12:00").PermissionCode — так называемый "код разрешения". Если вы установите его, то сможете зайти в заблокированную базу, добавив в строку запуска параметр /UC КодРазрешения.Выясним причину, по которой это лучше делать программно: такой подход позволяет гибко управлять графиком обслуживания без ручного вмешательства в консоль администрирования каждые выходные. Для реализации такого сценария подойдёт регламентное задание для блокировки сеансов по расписанию.
Если прямое «убийство» сессии кажется вам слишком радикальным (что может привести к потере несохраненных данных пользователя), проанализируем ситуацию с использованием штатных средств конфигурации. В типовых решениях 1С (включая УТ 10.3) часто реализован механизм проверки флага завершения работы.
Принцип работы следующий:
ЗавершитьРаботуСистемы(Ложь).Посмотрим на пример логики внутри обработчика ожидания:
Процедура ПроверитьНеобходимостьВыхода() Экспорт
// Проверяем наличие установленной блокировки в константах
Если Константы.БлокировкаУстановлена.Получить() Тогда
ТекстСообщения = "Внимание! Проводятся технические работы. Приложение закроется автоматически.";
Предупреждение(ТекстСообщения, 60); // Ждем 60 секунд
ЗавершитьРаботуСистемы(Ложь);
КонецЕсли;
КонецПроцедуры
Если ваша конфигурация "Управление торговлей 10.3" работает на платформе 1С:Предприятие 8.3, мы можем использовать современный способ администрирования — сервер администрирования ras и утилиту командной строки rac. Это позволяет управлять сеансами без написания громоздкого кода на языке 1С, используя системные вызовы КомандаСистемы.
Алгоритм действий:
ras (по умолчанию порт 1545).Пример команды для удаления конкретного сеанса через командную строку:
rac session --cluster=ID_КЛАСТЕРА --base=ID_БАЗЫ terminate --session=ID_СЕССИИ
Этот метод считается более надежным, так как он не зависит от настроек DCOM и корректно работает в любых сетевых топологиях.
Проанализируем важный технический момент: иногда после выполнения метода Disconnect сессия пользователя пропадает из списка активных, но на сервере СУБД (например, MS SQL Server) продолжают висеть активные процессы или транзакции. Также стоит помнить о фоновых заданиях. Принудительное отключение сеанса пользователя не всегда мгновенно останавливает порожденное им фоновое задание. Для полной очистки ресурсов мы рекомендуем также программно перебирать объект BackgroundJobs и отменять активные задания, если их номер сеанса совпадает с тем, который вы отключаете.
Подводя итог, можно сказать, что для оперативного решения задачи в УТ 10.3 лучше всего комбинировать "мягкий" способ (предупреждение пользователей) с "жестким" программным отключением через COMConnector для тех, кто проигнорировал просьбу выйти из системы. Для упрощения этой задачи можно использовать готовую обработку для блокировки пользователей в УТ 10.3.