Как принудительно завершить работу всех пользователей информационной базы 1С?

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

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

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

Решение 1: Программное отключение пользователей через COM-соединение (клиент-серверный вариант)

Если ваша база данных работает в клиент-серверном режиме под управлением сервера 1С:Предприятия, мы можем использовать механизм программного доступа к серверу приложений. Для этого создается специальный COM-объект, который подключается к рабочему процессу сервера, авторизуется с правами администратора, получает список активных соединений и принудительно разрывает их.

Разберем детально этот программный код:


// Создаем COM-объект для связи с сервером 1С. 
// Для платформы 8.3 используется класс V83.COMConnector (для 8.1 - V81.COMConnector)
Коннектор = Новый COMОбъект("V83.COMConnector");

// Подключаемся к рабочему процессу конкретного сервера приложений
Сервер = Коннектор.ConnectWorkingProcess("TestServer");

// Аутентифицируемся с административными правами в целевой информационной базе
Сервер.AddAuthentication("Администратор", "ПарольАдминистратора");

// Создаем объект описания информационной базы
ИнформационнаяБаза = Сервер.CreateInfoBaseInfo();
ИнформационнаяБаза.Name = "Test_Base";

// Получаем массив всех активных соединений с данной базой
СоединенияБазы = Сервер.GetIBConnections(ИнформационнаяБаза);

// Циклически обходим соединения и принудительно закрываем каждое из них
Для Каждого Соединение Из СоединенияБазы Цикл
    Сервер.Disconnect(Соединение);
КонецЦикла;

Этот способ крайне эффективен для серверных баз, так как команда закрытия сессии выполняется непосредственно на стороне сервера приложений 1С. Сеансы пользователей завершаются мгновенно. Однако стоит помнить, что при использовании COM-соединений в современных ОС Windows могут возникать проблемы с разрядностью (например, при попытке запустить 32-битный COM-класс из-под 64-битного процесса сервера 1С), что потребует дополнительной настройки утилиты dcomcnfg.

Решение 2: Использование обработчика ожидания для файлового режима работы

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

Для реализации этого метода выполним следующие шаги в конфигураторе:

1. Откроем модуль управляемого (или обычного) приложения и пропишем инициализацию обработчика ожидания при запуске системы:


Процедура ПриНачалеРаботыСистемы()
    // Подключаем обработчик, который будет срабатывать каждые 5 минут (300 секунд)
    ПодключитьОбработчикОжидания("ЗавершитьПриНеобходимостиРаботуСистемы", 300);
КонецПроцедуры

2. В этом же модуле опишем саму процедуру проверки блокировки:


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

Когда администратору потребуется выгнать пользователей, ему достаточно установить блокировку установки соединений через стандартные инструменты 1С или программно с помощью объекта БлокировкаУстановкиСоединений. В течение 5 минут все открытые клиентские приложения автоматически завершат свою работу. Для решения этой задачи также можно применить расширение для принудительного завершения работы пользователей в назначенное время.

Решение 3: Автоматизация «выгона» через внешний VBS-скрипт и внешнюю обработку

Если вам не хочется вносить изменения в саму конфигурацию (например, если она находится на стандартной поддержке), можно воспользоваться связкой из командного файла Windows, скрипта VBScript и внешней обработки 1С (файла .epf).

Алгоритм действий выглядит следующим образом:

1. Создается файл внешней обработки, например LockBase.epf. В его модуле создается экспортная процедура, которая программно устанавливает блокировку соединений:


Процедура RunBlock() Экспорт
    ОбработкаБлокировки = Обработки.БлокировкаСоединенийСИнформационнойБазой.Создать();
    ОбработкаБлокировки.НачалоБлокировки = ТекущаяДата();
    // Устанавливаем длительность блокировки, например, на 15 минут
    ОбработкаБлокировки.ОкончаниеБлокировки = ТекущаяДата() + 60 * 15;
    ОбработкаБлокировки.Сообщение = "База закрывается на техническое обслуживание. Просьба освободить программу.";
    ОбработкаБлокировки.УстановитьБлокировкуСоединений = Истина;
    // Секретный код разрешения, позволяющий администратору войти в заблокированную базу
    ОбработкаБлокировки.КодРазрешения = "admin_access_key";
    ОбработкаБлокировки.УстановитьБлокировку();
    
    // Завершаем текущий сеанс скрипта
    ЗавершитьРаботуСистемы(Ложь);
КонецПроцедуры

2. Создается VBS-скрипт (например, start_lock.vbs), который запускает 1С в режиме Automation, подключается к нужной базе данных, открывает внешнюю обработку и запускает её процедуру:


Set v83 = CreateObject("V83.Application")
' Подключаемся к файловой базе данных
is_connected = v83.Connect("File=""D:\Bases1C\WorkBase"";Usr=""Администратор"";Pwd=""ПарольАдмина""")

If is_connected Then
    ' Создаем объект внешней обработки по ее физическому пути
    Set external_proc = v83.ExternalDataProcessors.Create("D:\Bases1C\Scripts\LockBase.epf")
    ' Вызываем экспортный метод
    external_proc.RunBlock()
End If

3. Запуск этого VBS-скрипта можно настроить по расписанию через стандартный Планировщик задач Windows с помощью простого BAT-файла:

wscript.exe "D:\Bases1C\Scripts\start_lock.vbs"

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

Решение 4: Современный штатный метод через параметры командной строки (1С 8.3)

Разработчики платформы 1С:Предприятие 8.3 значительно упростили жизнь администраторам, добавив встроенный механизм завершения работы пользователей непосредственно через параметры командной строки при запуске исполняемого файла 1cv8.exe. Больше нет необходимости использовать сторонние COM-объекты или кастомные VBS-скрипты.

Для того чтобы завершить сеансы и установить блокировку в файловой базе данных, достаточно запустить исполняемый файл платформы со специальным ключом /C ЗавершитьРаботуПользователей:


"C:\Program Files\1cv8\bin\1cv8.exe" ENTERPRISE /F "D:\Bases1C\WorkBase" /N "Администратор" /P "Пароль" /WA- /AU- /DisableStartupMessages /C ЗавершитьРаботуПользователей

Аналогично команда выглядит для клиент-серверной базы данных:


"C:\Program Files\1cv8\bin\1cv8.exe" ENTERPRISE /S "ServerName\BaseName" /N "Администратор" /P "Пароль" /WA- /AU- /DisableStartupMessages /C ЗавершитьРаботуПользователей

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


"C:\Program Files\1cv8\bin\1cv8.exe" ENTERPRISE /F "D:\Bases1C\WorkBase" /N "Администратор" /P "Пароль" /WA- /AU- /DisableStartupMessages /C РазрешитьРаботуПользователей /UC КодРазрешения

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

Если вы работаете в современных типовых конфигурациях (например, "1С:Бухгалтерия 3.0", "1С:Управление торговлей 11", "1С:ERP Управление предприятием" или "1С:Зарплата и управление персоналом 3"), в них уже предопределен удобный графический интерфейс для управления сеансами. За него отвечает встроенная подсистема БСП.

Давайте разберем, как воспользоваться этим механизмом:

  1. Перейдите в раздел меню Администрирование, далее выберите пункт Обслуживание.
  2. В открывшемся окне найдите подраздел Блокировка работы пользователей.
  3. Заполните предложенные поля:
    • Сообщение для пользователей: текст, который увидят люди перед тем, как система закроется. Например: "База закрывается на обновление до 21:00".
    • Сроки блокировки: укажите точное время начала и окончания блокировочного интервала.
    • Код разрешения: придумайте секретную комбинацию (например, пароль), которая позволит вам зайти в базу во время действия блокировки для проведения отладки.
  4. Нажмите кнопку Установить блокировку.

Для клиент-серверного варианта система дополнительно предложит вам ввести имя и пароль администратора кластера серверов 1С, чтобы самостоятельно выполнить принудительный разрыв всех сетевых сеансов на уровне СУБД и сервера приложений.

Решение 6: Использование консольной утилиты RAC (без COM-объектов)

Начиная с версии 1С 8.3, для администрирования серверов 1С можно использовать кроссплатформенную консольную утилиту RAC, которая общается со специальной службой RAS (Remote Administration Server). Этот инструмент полностью заменяет нестабильный COM-коннектор и отлично работает в гетерогенных сетях (включая Linux-серверы).

С помощью утилиты RAC можно быстро автоматизировать завершение сеансов из командной строки ОС или PowerShell-скриптов. Посмотрим на пример команды для отключения конкретного сеанса:


rac session terminate --cluster=ID_Вашего_Кластера --session=ID_Завершаемого_Сеанса

Чтобы автоматизировать этот процесс, системные администраторы пишут скрипты, которые запрашивают утилитой rac session list список всех активных соединений, фильтруют их по имени базы данных и в цикле отправляют команду на их закрытие.

Решение 7: Борьба со «спящими» сеансами на сервере 1С

Очень часто сеансы пользователей зависают в базе не потому, что они продолжают активно работать, а из-за некорректного выхода: например, пользователь закрыл крышку ноутбука, пропал сигнал Wi-Fi, или сессия терминального сервера ушла в дисконнект. Такие «спящие» сеансы продолжают удерживать лицензии и блокировать таблицы БД.

Для решения этой проблемы в платформе 1С (начиная с версии 8.3.5) предусмотрен штатный инструмент автоматической очистки:

  1. Откройте Конфигуратор и перейдите в меню: Администрирование -> Параметры информационной базы.
  2. Установите значение для параметра Время засыпания пассивного сеанса (например, 1200 секунд, что равно 20 минутам неактивности пользователя). Спустя это время неактивный сеанс будет помечен сервером как спящий.
  3. Установите значение для параметра Время завершения спящего сеанса (например, 3600 секунд - 1 час). По истечении этого времени сервер 1С полностью удалит данный сеанс и освободит лицензию.

Эта простая профилактическая настройка существенно снижает количество "зависших" пользователей к концу рабочего дня. Для автоматизации этого процесса можно использовать обработку для удаления спящих сеансов на кластере 1С.

Решение 8: Принудительное закрытие файлов и процессов на уровне ОС Windows (файловая база)

Если в файловой базе сеансы зависли настолько глубоко, что сама 1С уже "не видит" активного пользователя в списке активных соединений, но файлы базы данных 1Cv8.1CD остаются заблокированными на сервере, приходится использовать методы операционной системы.

Важное предупреждение: Использование данных методов является крайней мерой! Резкое прекращение доступа к файлу базы данных без штатного завершения транзакций 1С может привести к повреждению структуры файлов базы данных. Перед выполнением этих команд обязательно сделайте архивную копию папки с базой данных!

1. Для разрыва сетевых подключений пользователей к общему сетевому ресурсу (расшаренной папке с базой данных 1С) выполните на сервере команду:

net session /delete /y

Эта команда мгновенно разрывает все открытые сетевые сессии к данному серверу, освобождая захваченные файлы 1Cv8.1CD и временные файлы блокировок 1Cv8.cfl.

2. Для точечного закрытия зависших клиентских приложений 1С непосредственно на самом сервере терминалов можно запустить принудительное завершение всех процессов 1cv8.exe через командную строку Windows:

taskkill /IM 1cv8.exe /f

Параметр /f указывает системе завершить процессы принудительно (сигнал SIGKILL), что гарантирует очистку оперативной памяти сервера от зависших сессий.

Подведем итоги

Мы рассмотрели множество способов принудительного отключения пользователей от базы данных 1С. В зависимости от условий использования (файловый или клиент-серверный режим, наличие БСП или необходимость автоматизации процессов через планировщик) вы можете выбрать оптимальный путь. Рекомендуется отдавать предпочтение штатным методам платформы (БСП, параметры командной строки, настройка спящих сеансов), так как они гарантируют целостность данных и корректное завершение открытых транзакций пользователей.

← На главную