При автоматизации ночных задач в 1С:Предприятии 7.7 администраторы часто сталкиваются с проблемой: если база занята другим пользователем или открыта монопольно, пакетный режим не просто завершается с ошибкой, а выводит модальное окно «Ошибка блокировки данных. Возможно, данные используются другой задачей». Это окно блокирует выполнение сценария, и сеанс 1cv7.exe остается «висеть» в памяти до вмешательства человека. Рассмотрим подробно, как автоматизировать этот процесс и сделать работу пакетного режима более надежной.
Разберем ситуацию: 1С 7.7 при запуске в пакетном режиме (особенно с ключом /m для монопольного доступа) проверяет возможность входа. Если в этот момент в базе находится хотя бы один пользователь или зависший сеанс, программа инициирует стандартный диалог Windows. Поскольку пакетный режим запускается планировщиком без участия пользователя, нажать кнопку «ОК» некому. Мы проанализируем несколько стратегий решения этой задачи: от превентивной проверки базы до принудительного закрытия зависших окон.
Самый простой и «чистый» способ, не требующий сторонних утилит, — это попытка кратковременного захвата файла блокировки. Рассмотрим, как это реализовать в обычном .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С.
Существует специализированная бесплатная утилита Монитор пользователей 1С:Предприятия 7.7 (1cusrmon.exe). Она позволяет программно определить состояние базы. Проанализируем ключевые параметры её использования. Утилита возвращает коды завершения, которые легко обрабатывать в скриптах.
Основные параметры командной строки:
-E1 — проверка, открыта ли база монопольно.-E3 — проверка, открыто ли Предприятие или Конфигуратор в любом режиме.-W — ожидание освобождения базы.Посмотрим на пример использования в пакетном файле:
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.
Если вы не имеете прав администратора для установки стороннего ПО (типа 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.
Для продвинутых пользователей и администраторов серверов отличным решением станет планировщик nnCron. Он обладает мощным языком описания задач, который позволяет отслеживать появление конкретных дочерних окон. Рассмотрим пример скрипта (Lord_click), который упоминался в обсуждении:
BEGIN
WIN-EXIST: "1С:Предприятие"
WHILE
FOR-CHILD-WINDOWS: "Ошибка блокировки*"
WIN-CLICK: "%FOUND-WINDOW%" "OK"
;FOR-CHILD-WINDOWS
REPEAT
Этот скрипт постоянно мониторит наличие окна «1С:Предприятие» и, если внутри него появляется дочернее окно с текстом «Ошибка блокировки», автоматически имитирует нажатие кнопки ОК. Это позволяет сеансу 1С корректно завершиться, не блокируя последующие регламентные задачи.
Часто причиной блокировки становятся пользователи, которые ушли домой, оставив программу открытой в терминальной сессии. Выясним, как бороться с причиной, а не со следствием. Проанализируем настройки терминального сервера:
tsconfig.msc или групповые политики) установите завершение сеанса при простое более 2–3 часов.openfiles /disconnect, чтобы принудительно разорвать соединения с файлами .DBF и .MD перед началом ночной обработки.Рассмотрим встроенную возможность планировщика задач (Task Scheduler). Это «костыль», но он крайне эффективен для предотвращения «зависания» сервера до утра.
В свойствах задачи, запускающей 1С, на вкладке «Параметры» (Settings), установите флаг «Останавливать задачу, выполняемую дольше» (Stop the task if it runs longer than) и выберите интервал (например, 1 час). Если ваша обработка обычно выполняется 10 минут, то через час планировщик сам убьет процесс 1cv7.exe, независимо от того, какое модальное окно там открыто.
Мы проанализировали различные подходы к решению проблемы блокировки данных в 1С 7.7. Для достижения максимальной стабильности рекомендуем совмещать подходы:
1cv7.lck в батнике перед запуском.Такая многоуровневая защита гарантирует, что ваши ночные обработки либо будут выполнены успешно, либо завершатся корректно, не препятствуя работе системы на следующий день.