Как настроить запуск внешней обработки по расписанию в 1С:Предприятии 7.7 с автоматической переиндексацией

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

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

Вариант 1. Запуск через OLE Automation (VBScript)

Рассмотрим сценарий на языке VBScript с использованием COM-объекта платформы. Этот подход позволяет программно перехватывать результат инициализации базы данных и управлять дальнейшим ходом выполнения.

Посмотрим на пример базового скрипта запуска:


Set Obj1C = CreateObject("v77.Application")
Result = Obj1C.Initialize(Obj1C.RMTrade, "/d""C:\1C\Bases\Trade\"" /nAutoExport /pSecretPass", "NO_SPLASH_SHOW")

If Result = True Then
    Obj1C.ExecuteBatch("ОткрытьФормуМодально(""Отчет"",,""C:\1C\Bases\Trade\ExtForms\Export.ert"")")
Else
    ' База не запустилась (нарушены индексы, занята монопольно или неверные реквизиты входа)
    WScript.Echo "Ошибка инициализации 1С. Требуется проверка базы."
End If

Проанализируем особенности работы с COM-соединением в современных операционных системах:

  1. Разрядность процесса: Платформа 1С 7.7 является 32-битным приложением. При запуске VBScript через Планировщик заданий Windows на 64-битных системах необходимо явно вызывать 32-битный интерпретатор %SystemRoot%\SysWOW64\wscript.exe или cscript.exe. Иначе скрипт завершится с ошибкой создания ActiveX-компонента.
  2. Тип лицензии (ProgID): В зависимости от установленного движка 1С имя COM-объекта может отличаться: v77.Application (сетевая/локальная версия), v77s.Application (версия для MS SQL Server) или v77l.Application (однопользовательская).

Вариант 2. Пакетный режим Конфигуратора для фоновой переиндексации

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

Выясним причину и правильный способ решения: надежная автоматическая переиндексация выполняется через запуск Конфигуратора в пакетном режиме с ключом /@.

Создадим файл параметров пакетного режима, например, C:\1C\batch_reindex.txt:


[General]
Output="C:\1C\Logs\reindex.log"
Quit=1
CheckAndRepair=1

[CheckAndRepair]
Repair=1
Reindex=1
ClearTableCheck=0
CheckOnly=0
CreateRefs=0

Теперь разберем командный файл (.bat или .cmd), который при возникновении проблем запускает пакетную переиндексацию базы и затем выполняет обработку:


@echo off
set BASE_PATH=C:\1C\Bases\Trade
set EXE_PATH="C:\Program Files (x86)\1Cv77\BIN\1cv7.exe"
set USER=AutoExport
set PASS=SecretPass

:: Попытка монопольного запуска конфигуратора для восстановления индексов
%EXE_PATH% config /D"%BASE_PATH%" /N%USER% /P%PASS% /@"C:\1C\batch_reindex.txt"

:: Запуск Предприятия для выполнения регламентной обработки
%EXE_PATH% enterprise /D"%BASE_PATH%" /N%USER% /P%PASS% /C"AutoRun:C:\1C\ExtForms\Export.ert"

Вариант 3. Передача параметров через ключ /C и запуск в глобальном модуле

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

В теле процедуры ПриНачалеРаботыСистемы() глобального модуля конфигурации добавим разбор системной переменной КоманднаяСтрока:


Процедура ПриНачалеРаботыСистемы()
    // Проверяем наличие параметра автозапуска
    Если Найти(ВРег(КоманднаяСтрока), "AUTORUN:") > 0 Тогда
        Позиция = Найти(ВРег(КоманднаяСтрока), "AUTORUN:");
        ПутьКОбработке = СокрЛП(Сред(КоманднаяСтрока, Позиция + 8));
        
        Если ФС.СуществуетФайл(ПутьКОбработке) = 1 Тогда
            ОткрытьФорму("Отчет", , ПутьКОбработке);
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Важные рекомендации для надежной работы по расписанию

  1. Завершение сеанса: В самой внешней обработке (в модуле формы в процедуре обработки или по таймеру) в конце работы обязательно должен вызываться метод ЗавершитьРаботуСистемы(0). В противном случае процесс останется в диспетчере задач, заблокирует файл 1Cv7.LCK и сделает невозможным запуск следующих регламентных заданий.
  2. Контроль блокировок: Монопольный запуск (ключ /M) и пакетное тестирование завершаются с ошибкой, если в базе присутствуют зависшие пользователи или не сняты блокировки файлов базы данных. Перед запуском ночных выгрузок убедитесь, что все пользовательские сессии завершены.
← На главную