Как подавить запрос на переиндексацию базы 1С 7.7 при запуске робота по расписанию?

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

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

В этот момент выполнение скрипта останавливается, регламентное задание не выполняется, а зависший процесс блокирует базу. В результате утром активные пользователи не могут войти в систему, получая ошибку "Ошибка блокировки базы при открытии".

Проанализируем причины такого поведения и разберем эффективные способы решения этой проблемы.

Почему возникает запрос на переиндексацию

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

Разберем важную особенность: штатного ключа командной строки для режима ENTERPRISE, позволяющего просто пропустить этот диалог при старте в немонопольном режиме, в 1С 7.7 не существует. Если в момент входа робота в базе уже работает хотя бы один пользователь, такое предупреждение не выводится. Исходя из этого, рассмотрим практические варианты решения задачи.

Способ 1. Проверка активных сеансов и очистка индексных файлов перед запуском

Разберем логику проверки доступности базы с помощью командного файла или внешнего скрипта. Если в базе никого нет, мы можем предварительно удалить все файлы индексов (*.cdx) и запустить 1С монопольно для их автоматического пересоздания.

Если в базе кто-то работает, файлы *.cdx или 1Cv7.LCK окажутся заблокированы операционной системой, и попытка их удаления завершится ошибкой. В таком случае регламентное задание можно спокойно запускать в обыкновенном разделенном режиме.

Посмотрим на пример алгоритма для командного скрипта:

  1. Пытаемся удалить файлы *.cdx в каталоге базы данных.
  2. Если файлы успешно удалены — значит, в базе нет других пользователей. Запускаем 1С в монопольном режиме для автоматического восстановления индексов и выполнения регламентной задачи.
  3. Если файлы удалить не удалось (вызвана ошибка доступа) — значит, в базе есть активные пользователи. Запускаем 1С в обыкновенном немонопольном режиме (запрос переиндексации не появится, так как сеанс в базе уже есть).

Пример реализации проверки на 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"
)

Способ 2. Использование фонового «дежурного» сеанса-заглушки

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

  1. На сервере под отдельной учетной записью запускается сеанс 1С 7.7 с минимальными правами (например, пользователь "Служебный").
  2. Данный сеанс находится в открытом состоянии круглосуточно.
  3. Когда ночью запускается робот по расписанию, платформа видит дежурный сеанс и заходит в базу без вывода модального окна переиндексации.

Способ 3. Автоматическое выполнение переиндексации через пакетный режим Конфигуратора

Если требуется гарантировать целостность индексов перед стартом робота при отсутствии пользователей, рассмотрим использование пакетного запуска Конфигуратора с ключом 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

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

Способ 4. Принудительное завершение зависших сеансов

Если регламентное задание требует монопольного монолитного выполнения и закрытия всех сторонних подключений, разберем порядок действий по очистке сеансов:

  1. За несколько минут до старта робота пользователям рассылается системное предупреждение о завершении работы.
  2. С помощью утилит командной строки (например, taskkill) завершаются зависшие процессы 1cv7s.exe или 1cv7.exe.
  3. Удаляются файлы индексов *.cdx и файлы блокировок 1Cv7.LCK.
  4. Робот запускается в монопольном режиме (ключ /m).
← На главную