Как программно отключить пользователя в 1С:Управление торговлей 10.3 без использования консоли администрирования?

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

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

Способ 1: Использование COM-соединителя для управления сеансами

Этот метод является наиболее прямым и эффективным для клиент-серверных версий 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.

Способ 2: Установка блокировки новых соединений

Просто «выкинуть» пользователя бывает недостаточно, так как активный пользователь или регламентное задание могут попытаться войти в систему снова через несколько секунд. Чтобы полноценно подготовить базу к обслуживанию, мы должны программно установить флаг блокировки соединений. Это делается через свойства объекта InformationBaseInfo.

Рассмотрим, какие свойства нам помогут:

  1. SessionsDenied — установив это свойство в значение Истина, мы запрещаем вход новым пользователям.
  2. LockMessage — текст, который увидит пользователь при попытке входа (например, "База закрыта на техническое обслуживание до 12:00").
  3. PermissionCode — так называемый "код разрешения". Если вы установите его, то сможете зайти в заблокированную базу, добавив в строку запуска параметр /UC КодРазрешения.

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

Способ 3: «Мягкое» завершение через встроенные механизмы УТ 10.3

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

Принцип работы следующий:

Посмотрим на пример логики внутри обработчика ожидания:


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

Способ 4: Использование утилиты RAC (для платформы 8.3)

Если ваша конфигурация "Управление торговлей 10.3" работает на платформе 1С:Предприятие 8.3, мы можем использовать современный способ администрирования — сервер администрирования ras и утилиту командной строки rac. Это позволяет управлять сеансами без написания громоздкого кода на языке 1С, используя системные вызовы КомандаСистемы.

Алгоритм действий:

  1. Убеждаемся, что на сервере запущена служба ras (по умолчанию порт 1545).
  2. Используем команду для получения списка сессий и их последующего удаления.

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

rac session --cluster=ID_КЛАСТЕРА --base=ID_БАЗЫ terminate --session=ID_СЕССИИ

Этот метод считается более надежным, так как он не зависит от настроек DCOM и корректно работает в любых сетевых топологиях.

Нюансы работы с фоновыми заданиями и зависшими сессиями

Проанализируем важный технический момент: иногда после выполнения метода Disconnect сессия пользователя пропадает из списка активных, но на сервере СУБД (например, MS SQL Server) продолжают висеть активные процессы или транзакции. Также стоит помнить о фоновых заданиях. Принудительное отключение сеанса пользователя не всегда мгновенно останавливает порожденное им фоновое задание. Для полной очистки ресурсов мы рекомендуем также программно перебирать объект BackgroundJobs и отменять активные задания, если их номер сеанса совпадает с тем, который вы отключаете.

Подводя итог, можно сказать, что для оперативного решения задачи в УТ 10.3 лучше всего комбинировать "мягкий" способ (предупреждение пользователей) с "жестким" программным отключением через COMConnector для тех, кто проигнорировал просьбу выйти из системы. Для упрощения этой задачи можно использовать готовую обработку для блокировки пользователей в УТ 10.3.

← На главную