При использовании файлового варианта (DBF) платформы 1С:Предприятие 7.7 системные администраторы и разработчики часто сталкиваются со следующей проблемой: ночью по расписанию запускается запуск автоматического сеанса (робота) для выполнения регламентных процедур. Однако если накануне произошел сбой или нештатное завершение работы одного из пользователей, при старте 1С в немонопольном режиме выводится интерактивное окно с сообщением о необходимости переиндексации базы данных.
В этот момент выполнение скрипта останавливается, регламентное задание не выполняется, а зависший процесс блокирует базу. В результате утром активные пользователи не могут войти в систему, получая ошибку "Ошибка блокировки базы при открытии".
Проанализируем причины такого поведения и разберем эффективные способы решения этой проблемы.
Платформа 1С 7.7 отслеживает корректность завершения прошлых сеансов по состоянию файлов блокировок (1Cv7.LCK, 1Cv7.FLK) и счетчику подключенных пользователей в системном файле 1SUSERS.DBF. Если в базе на момент запуска нового сеанса нет ни одного активного пользователя, но флаги аварийного завершения не были сброшены, система считает состояние индексов потенциально нецелостным и запрашивает переиндексацию.
Разберем важную особенность: штатного ключа командной строки для режима ENTERPRISE, позволяющего просто пропустить этот диалог при старте в немонопольном режиме, в 1С 7.7 не существует. Если в момент входа робота в базе уже работает хотя бы один пользователь, такое предупреждение не выводится. Исходя из этого, рассмотрим практические варианты решения задачи.
Разберем логику проверки доступности базы с помощью командного файла или внешнего скрипта. Если в базе никого нет, мы можем предварительно удалить все файлы индексов (*.cdx) и запустить 1С монопольно для их автоматического пересоздания.
Если в базе кто-то работает, файлы *.cdx или 1Cv7.LCK окажутся заблокированы операционной системой, и попытка их удаления завершится ошибкой. В таком случае регламентное задание можно спокойно запускать в обыкновенном разделенном режиме.
Посмотрим на пример алгоритма для командного скрипта:
*.cdx в каталоге базы данных.Пример реализации проверки на VBScript или CMD-скрипте:
rem Попытка удаления файлов индексов
del /f /q "C:\Base1C\*.cdx" 2>nul
if exist "C:\Base1C\*.cdx" (
rem Файлы не удалились - в базе кто-то есть
"C:\Program Files\1Cv77\BIN\1cv7s.exe" enterprise /d"C:\Base1C\" /n"Robot" /p"Pass"
) else (
rem Файлы удалены - база свободна, запускаем монопольно
"C:\Program Files\1Cv77\BIN\1cv7s.exe" enterprise /m /d"C:\Base1C\" /n"Robot" /p"Pass"
)
Проанализируем наиболее простой и надежный практический подход. Поскольку предупреждение о переиндексации в разделенном режиме не появляется, если в базе присутствуют активные пользователи, можно постоянно держать запущенный фоновый сеанс 1С.
Если требуется гарантировать целостность индексов перед стартом робота при отсутствии пользователей, рассмотрим использование пакетного запуска Конфигуратора с ключом CONFIG.
Для этого перед вызовом режима Предприятия запускаем Конфигуратор с файлом параметров prm:
"C:\Program Files\1Cv77\BIN\1cv7s.exe" config /d"C:\Base1C\" /n"Admin" /p"AdminPass" /@C:\Scripts\repair.prm
Содержимое файла repair.prm:
[General]
Quit=1
CheckAndRepair=1
[CheckAndRepair]
Repair=1
Reindex=1
PhysicalIntegrity=0
LogicalIntegrity=0
RecalcSecondaries=0
RecalcTotals=0
Конфигуратор в автоматическом режиме выполнит реиндексацию таблиц, закроется с кодом завершения, после чего запуск сеанса робота гарантированно пройдет без всплывающих диалогов.
Если регламентное задание требует монопольного монолитного выполнения и закрытия всех сторонних подключений, разберем порядок действий по очистке сеансов:
taskkill) завершаются зависшие процессы 1cv7s.exe или 1cv7.exe.*.cdx и файлы блокировок 1Cv7.LCK./m).