При совместной работе с базами данных 1С:Предприятие 7.7 периодически возникает ситуация, когда один из сотрудников запускает программу в монопольном режиме (например, для проведения документов, восстановления последовательности или обновления конфигурации). Все последующие пользователи при попытке входа получают стандартное системное сообщение об ошибке, сообщающее о невозможности открыть базу, однако платформа по умолчанию не указывает, кто именно занял информационную базу.
Рассмотрим, почему стандартный диалог нельзя перехватить встроенным языком 1С, как устроена блокировка на уровне платформы и какими способами можно реализовать вывод собственного информационного окна с подробными данными о пользователе.
Разберем внутренний механизм проверки монопольного режима в 1С 7.7. Когда пользователь запускает исполняемый файл 1cv7.exe (или 1cv7s.exe), ядро платформы выполняет следующие действия:
bkend.dll, seven.dll, dbeng32.dll) обращаются к каталогу информационной базы еще до инициализации конфигурации.1Cv7.MD, файлы таблиц *.DBF и маркерные файлы 1Cv7.LCK.SINGLE_USER), платформа мгновенно прерывает дальнейшую инициализацию и вызывает системный диалог операционной системы.Важно понимать: процедура ПриНачалеРаботыСистемы() в глобальном модуле на этом этапе даже не начинает выполняться. Следовательно, перехватить ошибку и вывести диалоговое окно встроенными средствами языка 1С 7.7 невозможно.
Наиболее надежный и практичный способ решения задачи — запуск 1С через внешний скрипт или лаунчер (написанный на VBScript, PowerShell, C# или AutoHotkey). Скрипт перед вызовом 1cv7.exe выполняет проверку доступности базы и, если база заблокирована, отображает информационное окно с подробностями.
Выясним, где хранятся сведения о текущих подключениях в файловой версии 1С 7.7. При старте платформы в подкаталоге базы SYSLOG создается и динамически обновляется временный файл links.tmp. В нем в текстовом виде содержится список активных сеансов, сетевые имена компьютеров, логины пользователей и признак монопольного режима.
Посмотрим на пример VBScript-загрузчика, который анализирует файл links.tmp перед стартом 1С:
Dim fso, basePath, sysLogFile, fileStream, lineData
Dim isExclusive, lockedUser, lockedComp
basePath = "C:\Bases\Trade"
sysLogFile = basePath & "\SYSLOG\links.tmp"
isExclusive = False
Set fso = CreateObject("Scripting.FileSystemObject")
If fso.FileExists(sysLogFile) Then
On Error Resume Next
Set fileStream = fso.OpenTextFile(sysLogFile, 1, False)
If Err.Number = 0 Then
Do While Not fileStream.AtEndOfStream
lineData = fileStream.ReadLine
' Анализируем строки на признак монопольного входа
If InStr(lineData, "EXCLUSIVE") > 0 Or InStr(lineData, "MONO") > 0 Then
isExclusive = True
lockedUser = lineData
Exit Do
End If
Loop
fileStream.Close
End If
On Error GoTo 0
End If
If isExclusive Then
MsgBox "База данных заблокирована для монопольных работ!" & vbCrLf & _
"Информация о сеансе: " & lockedUser & vbCrLf & _
"Пожалуйста, свяжитесь с сотрудником или системным администратором.", _
vbCritical, "Вход временно невозможен"
Else
' Запускаем 1С в обычном режиме
Dim wshShell
Set wshShell = CreateObject("WScript.Shell")
wshShell.Run """" & basePath & "\1cv7.exe"" enterprise /D""" & basePath & """", 1, False
End If
Проанализируем ситуацию, когда база завершилась аварийно или файл links.tmp оказался заблокирован дескриптором операционной системы. В корпоративной сети под управлением Windows Server для точного выявления пользователя можно использовать системные средства мониторинга открытых файлов SMB.
openfiles.exe или командлета PowerShell Get-SmbOpenFile анализируются дескрипторы файла 1Cv7.MD или корневого каталога базы.В конфигурациях 1С 7.7 для Microsoft SQL Server монопольный вход переводит базу данных в однопользовательский режим (SINGLE_USER). Если требуется централизованно отслеживать монопольный сеанс на сервере СУБД, проанализируем запрос к системным динамическим представлениям:
SELECT
des.session_id,
des.login_name,
des.host_name,
des.program_name,
des.login_time
FROM sys.dm_exec_sessions des
JOIN sys.databases db ON des.database_id = db.database_id
WHERE db.name = 'TradeBase'
AND db.user_access_desc = 'SINGLE_USER';
Такой запрос позволяет внешнему порталу или монитору пользователей мгновенно получить имя пользователя Windows, хост и точное время монопольного захвата базы.
Часто требуется вывести в окне ошибки не только имя сотрудника, но и его контактный телефон, должность или отдел. Если файлы *.DBF захвачены монопольно, прямое чтение таблиц средствами 1С или ODBC будет заблокировано на уровне файловой системы.
Для решения этой задачи применяются следующие подходы:
Использование внешнего лаунчера в сочетании с парсингом системных файлов сеансов позволяет полностью контролировать процедуру запуска и исключить путаницу среди пользователей при монопольной блокировке базы.