Зависание сеансов пользователей в списке активных подключений 1С — распространенная проблема при работе как в файловом, так и в клиент-серверном вариантах. Пользователь уже фактически отключился от программы или закрыл терминальную сессию, однако информационная база продолжает считать сеанс активным. При попытке повторного входа клиент либо наглухо зависает, либо не может войти в монопольном режиме для выполнения регламентных процедур и обновления конфигурации.
Проанализируем ключевые причины возникновения этой проблемы и разберем по шагам действенные способы ее решения.
Рассмотрим основные факторы, приводящие к удержанию фантомных сессий:
*.cfl, *.lck), а оппортунистические блокировки Windows (SMB Oplocks) препятствуют их быстрому освобождению._SYSTEMSETTINGS) вызывают бесконечный цикл зависания при авторизации конкретной учетной записи.Для регулярного отключения зависших пользователей (например, перед выполнением ночного резервного копирования) применим сценарий 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"
Рассмотрим вариант завершения сеансов клиентских приложений непосредственно из кода внешней обработки или регламентного задания:
Коннектор = Новый COMОбъект("v82.COMConnector");
Агент = Коннектор.ConnectAgent(ИмяСервера);
Кластеры = Агент.GetClusters();
Для Каждого Кластер Из Кластеры Цикл
Агент.Authenticate(Кластер, ИмяПользователяКластера, ПарольКластера);
Процессы = Агент.GetWorkingProcesses(Кластер);
Для Каждого Процесс Из Процессы Цикл
Порт = Процесс.MainPort;
Попытка
РабПроц = Коннектор.ConnectWorkingProcess(ИмяСервера + ":" + СтрЗаменить(Формат(Порт, "ЧГ=0"), " ", ""));
РабПроц.AuthenticateAdmin(ИмяПользователяКластера, ПарольКластера);
РабПроц.AddAuthentication(ИмяПользователяБазы, ПарольБазы);
ИнформационнаяБаза = РабПроц.CreateInfoBaseInfo();
ИнформационнаяБаза.Name = ИмяБазы;
СоединенияБазы = РабПроц.GetInfoBaseConnections(ИнформационнаяБаза);
Для Каждого Соединение Из СоединенияБазы Цикл
// Отключаем только пользовательские сеансы Предприятия
Если НРег(Соединение.AppID) = "1cv8" Тогда
РабПроц.Disconnect(Соединение);
КонецЕсли;
КонецЦикла;
Исключение
ЗаписьЖурналаРегистрации("СбросСеансов", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
КонецЦикла;
При использовании терминального доступа под управлением 64-разрядных версий Windows Server после закрытия 1С терминальная сессия часто не завершается. Причиной является фоновый процесс трансляции печати SplWOW64.exe, который операционная система удерживает активным.
Выполним настройку системного реестра для корректного сброса сессий:
regedit от имени администратора.HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print и создадим параметр SplWOW64TimeOut типа DWORD (32 бита) со значением 1. Это снизит тайм-аут ожидания процесса.HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\SysProcs и создадим параметр SPLWOW64.EXE типа DWORD (32 бита) со значением 0. Это принудительно включит процесс в список завершаемых при выходе пользователя.Если зависание происходит при входе конкретного пользователя в файловую базу данных, разберем по шагам процедуру восстановления:
chdbfl.exe, расположенную в каталоге bin платформы (например, C:\Program Files (x86)\1cv82\8.2.15.294\bin\chdbfl.exe). Отметим флаг «Исправлять обнаруженные ошибки» и запустим анализ файла 1Cv8.1CD.%LocalAppData%\1C\1Cv82\
%AppData%\1C\1Cv82\*.cfl.ХранилищеСистемныхНастроек.Удалить(,, ИмяПользователя).В клиент-серверном режиме разовое зависание сеанса оперативно устраняется через утилиту «Администрирование серверов 1С Предприятия»: переходим в ветку Кластеры -> Информационные базы -> Сеансы (или Соединения), выбираем зависшую строку и нажимаем клавишу Delete.
В ранних релизах платформы (в частности, 8.2.14) присутствовала внутренняя ошибка платформы, приводящая к аварийному завершению и зависанию сеансов при старте программы. Обновление платформы до актуальных стабильных релизов полностью исключает эту проблему.