Как перехватить сообщение о монопольном запуске базы 1С 7.7 и показать заблокировавшего пользователя?

Системный администратор 1С v7.7 IT и автоматизация бизнеса
← На главную

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

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

Архитектурные ограничения платформы 1С 7.7

Разберем внутренний механизм проверки монопольного режима в 1С 7.7. Когда пользователь запускает исполняемый файл 1cv7.exe (или 1cv7s.exe), ядро платформы выполняет следующие действия:

  1. Системные библиотеки ядра (bkend.dll, seven.dll, dbeng32.dll) обращаются к каталогу информационной базы еще до инициализации конфигурации.
  2. Платформа пытается наложить файловые блокировки на файл структуры метаданных 1Cv7.MD, файлы таблиц *.DBF и маркерные файлы 1Cv7.LCK.
  3. Если обнаружена исключительная блокировка (или в случае SQL-версии база находится в режиме SINGLE_USER), платформа мгновенно прерывает дальнейшую инициализацию и вызывает системный диалог операционной системы.

Важно понимать: процедура ПриНачалеРаботыСистемы() в глобальном модуле на этом этапе даже не начинает выполняться. Следовательно, перехватить ошибку и вывести диалоговое окно встроенными средствами языка 1С 7.7 невозможно.

Способ 1. Использование предпускового загрузчика (лаунчера)

Наиболее надежный и практичный способ решения задачи — запуск 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

Способ 2. Определение блокировки через сетевые сессии файлового сервера

Проанализируем ситуацию, когда база завершилась аварийно или файл links.tmp оказался заблокирован дескриптором операционной системы. В корпоративной сети под управлением Windows Server для точного выявления пользователя можно использовать системные средства мониторинга открытых файлов SMB.

  1. На файловом сервере с помощью утилиты openfiles.exe или командлета PowerShell Get-SmbOpenFile анализируются дескрипторы файла 1Cv7.MD или корневого каталога базы.
  2. Скрипт определяет сетевой логин пользователя и IP-адрес рабочей станции, удерживающей исключительный дескриптор.
  3. Лаунчер на клиенте опрашивает серверную службу и выдает персонализированное предупреждение: «Базу занял пользователь Ivanov на компьютере WS-BUH03».

Способ 3. Особенности работы и мониторинга в среде SQL

В конфигурациях 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 будет заблокировано на уровне файловой системы.

Для решения этой задачи применяются следующие подходы:

  1. Внешний справочник контактов: Хранение таблицы соответствий «Логин 1С — ФИО — Телефон» в отдельном внешнем файле (JSON, XML, SQLite) или реестре, доступном всем пользователям только для чтения.
  2. Использование теневых копий тома (VSS): Чтение заблокированных таблиц через службу теневого копирования Windows (Volume Shadow Copy), что позволяет получить слепок данных без нарушения блокировки.

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

← На главную