Автоматизация регламентных задач (выгрузка данных, обмен с филиалами, формирование отчетов) в платформе 1С:Предприятие 7.7 часто сталкивается с проблемой нарушения целостности индексов после некорректного завершения предыдущих сессий. Если база аварийно завершилась, запуск в обычном режиме блокируется требованием переиндексации. Разберем по шагам, как построить надежный сценарий запуска внешних обработок по расписанию и корректно обработать возможные сбои.
Рассмотрим сценарий на языке 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-соединением в современных операционных системах:
%SystemRoot%\SysWOW64\wscript.exe или cscript.exe. Иначе скрипт завершится с ошибкой создания ActiveX-компонента.v77.Application (сетевая/локальная версия), v77s.Application (версия для MS SQL Server) или v77l.Application (однопользовательская).Если штатная инициализация базы не удалась из-за повреждения индексных файлов *.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"
Чтобы не создавать отдельного пользователя под каждую внешнюю задачу и не жестко привязывать код запуска к имени учетной записи, передадим путь к внешней обработке прямо в строке запуска с помощью параметра /C.
В теле процедуры ПриНачалеРаботыСистемы() глобального модуля конфигурации добавим разбор системной переменной КоманднаяСтрока:
Процедура ПриНачалеРаботыСистемы()
// Проверяем наличие параметра автозапуска
Если Найти(ВРег(КоманднаяСтрока), "AUTORUN:") > 0 Тогда
Позиция = Найти(ВРег(КоманднаяСтрока), "AUTORUN:");
ПутьКОбработке = СокрЛП(Сред(КоманднаяСтрока, Позиция + 8));
Если ФС.СуществуетФайл(ПутьКОбработке) = 1 Тогда
ОткрытьФорму("Отчет", , ПутьКОбработке);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
ЗавершитьРаботуСистемы(0). В противном случае процесс останется в диспетчере задач, заблокирует файл 1Cv7.LCK и сделает невозможным запуск следующих регламентных заданий./M) и пакетное тестирование завершаются с ошибкой, если в базе присутствуют зависшие пользователи или не сняты блокировки файлов базы данных. Перед запуском ночных выгрузок убедитесь, что все пользовательские сессии завершены.