Как предотвратить зависание 1С 7.7 в пакетном режиме при ошибке блокировки данных

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

При автоматизации ночных задач в 1С:Предприятии 7.7 администраторы часто сталкиваются с проблемой: если база занята другим пользователем или открыта монопольно, пакетный режим не просто завершается с ошибкой, а выводит модальное окно «Ошибка блокировки данных. Возможно, данные используются другой задачей». Это окно блокирует выполнение сценария, и сеанс 1cv7.exe остается «висеть» в памяти до вмешательства человека. Рассмотрим подробно, как автоматизировать этот процесс и сделать работу пакетного режима более надежной.

Причина возникновения проблемы

Разберем ситуацию: 1С 7.7 при запуске в пакетном режиме (особенно с ключом /m для монопольного доступа) проверяет возможность входа. Если в этот момент в базе находится хотя бы один пользователь или зависший сеанс, программа инициирует стандартный диалог Windows. Поскольку пакетный режим запускается планировщиком без участия пользователя, нажать кнопку «ОК» некому. Мы проанализируем несколько стратегий решения этой задачи: от превентивной проверки базы до принудительного закрытия зависших окон.

Способ 1. Проверка занятости базы перед запуском (метод переименования LCK)

Самый простой и «чистый» способ, не требующий сторонних утилит, — это попытка кратковременного захвата файла блокировки. Рассмотрим, как это реализовать в обычном .bat или .cmd файле. Выясним логику: если файл 1cv7.lck нельзя переименовать, значит, база кем-то используется.

Рассмотрим пример кода для батника:


@echo off
set db_path="C:\DB\MyBase"
ren %db_path%\1cv7.lck 1cv7.lck_
if errorlevel 1 (
    echo База занята, запуск отменен.
    exit /b
)
ren %db_path%\1cv7.lck_ 1cv7.lck
start "" "C:\Program Files\1cv77\BIN\1cv7.exe" config /d /m

В данном сценарии мы сначала пытаемся переименовать файл блокировки. Если команда ren возвращает errorlevel равный 1, это сигнализирует о том, что файл открыт другим процессом. Если переименование прошло успешно — мы возвращаем имя файла обратно и запускаем 1С.

Способ 2. Использование консольной утилиты 1cusrmon.exe

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

Основные параметры командной строки:

Посмотрим на пример использования в пакетном файле:


C:\Utils\1cusrmon.exe -E3 -D0
if errorlevel 1 (
    echo В базе есть активные пользователи!
    exit /b
)
start "" "C:\1cv77\bin\1cv7.exe" enterprise /d"C:\DB" /p"PackMode" /@ "C:\Scripts\Task.txt"

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

Способ 3. Автоматическое закрытие окна ошибки через VBScript

Если вы не имеете прав администратора для установки стороннего ПО (типа nnCron), можно воспользоваться встроенным в Windows интерпретатором VBScript. Мы создадим скрипт, который будет «нажимать» кнопку ОК за нас. Посмотрим, как это реализовать.

Создайте файл closer.vbs:


Set WshShell = CreateObject("WScript.Shell")
Do
    ' Ищем окно с заголовком ошибки
    If WshShell.AppActivate("1С:Предприятие") Then
        ' Посылаем нажатие Enter
        WshShell.SendKeys "~"
    End If
    WScript.Sleep 5000 ' Проверка каждые 5 секунд
Loop

Запускайте этот скрипт непосредственно перед запуском пакетного режима 1С. После завершения работы 1С скрипт можно принудительно завершить командой taskkill /f /im wscript.exe.

Способ 4. Использование nnCron для мониторинга окон

Для продвинутых пользователей и администраторов серверов отличным решением станет планировщик nnCron. Он обладает мощным языком описания задач, который позволяет отслеживать появление конкретных дочерних окон. Рассмотрим пример скрипта (Lord_click), который упоминался в обсуждении:


BEGIN
WIN-EXIST: "1С:Предприятие"
WHILE
    FOR-CHILD-WINDOWS: "Ошибка блокировки*"
        WIN-CLICK: "%FOUND-WINDOW%" "OK"
    ;FOR-CHILD-WINDOWS
REPEAT

Этот скрипт постоянно мониторит наличие окна «1С:Предприятие» и, если внутри него появляется дочернее окно с текстом «Ошибка блокировки», автоматически имитирует нажатие кнопки ОК. Это позволяет сеансу 1С корректно завершиться, не блокируя последующие регламентные задачи.

Способ 5. Административные настройки сервера (RDP и сеансы)

Часто причиной блокировки становятся пользователи, которые ушли домой, оставив программу открытой в терминальной сессии. Выясним, как бороться с причиной, а не со следствием. Проанализируем настройки терминального сервера:

  1. Ограничение времени бездействия: В настройках RDP-Tcp (через tsconfig.msc или групповые политики) установите завершение сеанса при простое более 2–3 часов.
  2. Завершение отключенных сеансов: Если пользователь просто закрыл «крестиком» окно терминала, его сессия остается активной. Установите лимит завершения отключенного сеанса в 15–30 минут.
  3. Команда OPENFILES: Если база расположена на файловом сервере, можно использовать команду openfiles /disconnect, чтобы принудительно разорвать соединения с файлами .DBF и .MD перед началом ночной обработки.

Способ 6. Принудительное завершение через планировщик задач Windows

Рассмотрим встроенную возможность планировщика задач (Task Scheduler). Это «костыль», но он крайне эффективен для предотвращения «зависания» сервера до утра.

В свойствах задачи, запускающей 1С, на вкладке «Параметры» (Settings), установите флаг «Останавливать задачу, выполняемую дольше» (Stop the task if it runs longer than) и выберите интервал (например, 1 час). Если ваша обработка обычно выполняется 10 минут, то через час планировщик сам убьет процесс 1cv7.exe, независимо от того, какое модальное окно там открыто.

Резюме

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

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

← На главную