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

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

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

Проанализируем ключевые причины возникновения этой проблемы и разберем по шагам действенные способы ее решения.

Выясняем причины появления «зависших» сеансов

Рассмотрим основные факторы, приводящие к удержанию фантомных сессий:

  1. Удержание процессов в терминальных службах (RDP / RemoteApp): завершение интерфейса 1С не приводит к выходу из терминальной сессии, если в фоновом режиме продолжают работать вспомогательные системные процессы (например, подсистема печати).
  2. Блокировки файлов в файловой базе: при аварийном завершении работы клиента в каталоге базы данных остаются открытыми дескрипторы и временные файлы блокировок (*.cfl, *.lck), а оппортунистические блокировки Windows (SMB Oplocks) препятствуют их быстрому освобождению.
  3. Повреждение пользовательских настроек и кэша: сбои в локальном кэше или внутренних таблицах базы данных (_SYSTEMSETTINGS) вызывают бесконечный цикл зависания при авторизации конкретной учетной записи.
  4. Сетевые разрывы без TCP-уведомления: клиент-серверная база ожидает отклика от разорванного сокета в течение системного таймаута Keep-Alive операционной системы, удерживая соединение в памяти сервера.

Решение 1. Автоматический сброс сеансов с помощью скрипта VBScript через COM-коннектор

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


' VBScript для принудительного отключения соединений с базой 1С
UserName = "Администратор"
UserPass = "Пароль"
ServerName = "Server1C"
BaseName = "TradeBase"
pn = 0 ' Количество рабочих процессов минус 1

Dim Connector, AgentConnection, Cluster, WorkingProcess
Dim WorkingProcessConnection, ibDesc, Connections, Connection, i, p

Set Connector = CreateObject("V82.COMConnector")
Set AgentConnection = Connector.ConnectAgent(ServerName)
Set Cluster = AgentConnection.GetClusters(0)
AgentConnection.Authenticate Cluster, "", ""

For p = 0 To pn
    Set WorkingProcess = AgentConnection.GetWorkingProcesses(Cluster)(p)
    ConnectString = WorkingProcess.HostName & ":" & WorkingProcess.MainPort
    Set WorkingProcessConnection = Connector.ConnectWorkingProcess(ConnectString)
    WorkingProcessConnection.AddAuthentication UserName, UserPass
    
    Set ibDesc = WorkingProcessConnection.CreateInfoBaseInfo
    ibDesc.Name = BaseName
    Connections = WorkingProcessConnection.GetInfoBaseConnections(ibDesc)
    
    For i = LBound(Connections) To UBound(Connections)
        Set Connection = Connections(i)
        If (Connection.AppID <> "COMConsole") Then
            WorkingProcessConnection.Disconnect Connection
        End If
    Next
Next

Обратите внимание: если при создании объекта V82.COMConnector возникает ошибка «ActiveX component can't create object», выполним повторную регистрацию библиотеки в командной строке от имени администратора:

regsvr32 "C:\Program Files (x86)\1cv82\8.2.14.540\bin\comcntr.dll"

Решение 2. Программное отключение сеансов средствами встроенного языка 1С

Рассмотрим вариант завершения сеансов клиентских приложений непосредственно из кода внешней обработки или регламентного задания:


Коннектор = Новый COMОбъект("v82.COMConnector");
Агент = Коннектор.ConnectAgent(ИмяСервера);
Кластеры = Агент.GetClusters();

Для Каждого Кластер Из Кластеры Цикл
    Агент.Authenticate(Кластер, ИмяПользователяКластера, ПарольКластера);
    Процессы = Агент.GetWorkingProcesses(Кластер);
    
    Для Каждого Процесс Из Процессы Цикл
        Порт = Процесс.MainPort;
        Попытка
            РабПроц = Коннектор.ConnectWorkingProcess(ИмяСервера + ":" + СтрЗаменить(Формат(Порт, "ЧГ=0"), " ", ""));
            РабПроц.AuthenticateAdmin(ИмяПользователяКластера, ПарольКластера);
            РабПроц.AddAuthentication(ИмяПользователяБазы, ПарольБазы);
            
            ИнформационнаяБаза = РабПроц.CreateInfoBaseInfo();
            ИнформационнаяБаза.Name = ИмяБазы;
            СоединенияБазы = РабПроц.GetInfoBaseConnections(ИнформационнаяБаза);
            
            Для Каждого Соединение Из СоединенияБазы Цикл
                // Отключаем только пользовательские сеансы Предприятия
                Если НРег(Соединение.AppID) = "1cv8" Тогда
                    РабПроц.Disconnect(Соединение);
                КонецЕсли;
            КонецЦикла;
        Исключение
            ЗаписьЖурналаРегистрации("СбросСеансов", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
        КонецПопытки;
    КонецЦикла;
КонецЦикла;

Решение 3. Устранение зависания сессий RemoteApp из-за процесса печати SplWOW64.exe

При использовании терминального доступа под управлением 64-разрядных версий Windows Server после закрытия 1С терминальная сессия часто не завершается. Причиной является фоновый процесс трансляции печати SplWOW64.exe, который операционная система удерживает активным.

Выполним настройку системного реестра для корректного сброса сессий:

  1. Откроем редактор реестра regedit от имени администратора.
  2. Перейдем в ветку HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print и создадим параметр SplWOW64TimeOut типа DWORD (32 бита) со значением 1. Это снизит тайм-аут ожидания процесса.
  3. Перейдем в ветку HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\SysProcs и создадим параметр SPLWOW64.EXE типа DWORD (32 бита) со значением 0. Это принудительно включит процесс в список завершаемых при выходе пользователя.

Решение 4. Диагностика файловой базы и очистка пользовательского кэша

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

  1. Проверка физической целостности: запустим утилиту тестирования файла базы chdbfl.exe, расположенную в каталоге bin платформы (например, C:\Program Files (x86)\1cv82\8.2.15.294\bin\chdbfl.exe). Отметим флаг «Исправлять обнаруженные ошибки» и запустим анализ файла 1Cv8.1CD.
  2. Очистка каталогов кэша пользователя: на клиентском ПК или терминальном сервере удалим временные папки конфигураций по путям:
    %LocalAppData%\1C\1Cv82\
    %AppData%\1C\1Cv82\
  3. Сброс зависших дескрипторов файлов Windows: в оснастке «Управление компьютером» откроем раздел «Общие папки» -> «Открытые файлы» и принудительно закроем все блокировки к каталогу с базой 1С, после чего удалим оставшиеся временные файлы блокировок *.cfl.
  4. Сброс системных настроек интерфейса: если зависание стартовой формы сохраняется, выполним программную очистку сохраненных настроек конкретного пользователя с помощью метода ХранилищеСистемныхНастроек.Удалить(,, ИмяПользователя).

Решение 5. Ручное управление через консоль и обновление платформы

В клиент-серверном режиме разовое зависание сеанса оперативно устраняется через утилиту «Администрирование серверов 1С Предприятия»: переходим в ветку Кластеры -> Информационные базы -> Сеансы (или Соединения), выбираем зависшую строку и нажимаем клавишу Delete.

В ранних релизах платформы (в частности, 8.2.14) присутствовала внутренняя ошибка платформы, приводящая к аварийному завершению и зависанию сеансов при старте программы. Обновление платформы до актуальных стабильных релизов полностью исключает эту проблему.

← На главную