Как программно перезапустить 1С:Предприятие 7.7?

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

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

Почему 1С 7.7 нельзя перезапустить мгновенной системной командой?

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

Выясним главные причины такого поведения:

  1. Задержка снятия файловых блокировок: при закрытии базы в файловом (DBF) режиме освобождение дескрипторов файлов таблиц, а также служебных файлов блокировок (1cv7.lck, 1cv7.mlk и файлов в каталоге пользователя usrdef) происходит не моментально. Операционной системе требуется некоторое время на сброс дискового кэша.
  2. Время выгрузки процесса: исполняемый файл 1cv7s.exe (или 1cv7.exe) некоторое время остается в памяти после вызова процедуры закрытия.

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

Пошаговый алгоритм решения через командный файл

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

  1. Формируем текстовый файл командного сценария при помощи объекта Текст.
  2. Добавляем команду паузы (задержки запуска), чтобы старый процесс успел закрыться.
  3. Формируем строку запуска нового экземпляра платформы с учетом путей, содержащих пробелы.
  4. Сохраняем сценарий на диск и запускаем его с помощью метода ЗапуститьПриложение().
  5. Завершаем текущий сеанс 1С с помощью процедуры ЗавершитьРаботуСистемы(0).

Реализация кода на встроенном языке 1С 7.7

Посмотрим на программный код, который можно разместить в глобальном модуле или отдельной обработке:


Текст = СоздатьОбъект("Текст");

// 1. Устанавливаем паузу в 5 секунд для полного освобождения каталогов и блокировок
Текст.ДобавитьСтроку("waitfor r /T 5 >nul 2>&1");

// 2. Формируем строку запуска с правильным экранированием кавычек
// Команда START в Windows принимает первый аргумент в кавычках как заголовок окна,
// поэтому обязательно передаем пустые кавычки "" перед исполняемым файлом.
ИмяФайла1С = КаталогПрограммы() + "1cv7s.exe";
ПутьКБазе = КаталогИБ();

СтрокаЗапуска = "start """" """ + ИмяФайла1С + """ enterprise /m /d""" + СокрЛП(ПутьКБазе) + """";
Текст.ДобавитьСтроку(СтрокаЗапуска);

// 3. Дополнительно можно удалить отработавший батник после запуска
Текст.ДобавитьСтроку("del ""%~f0""");

// 4. Записываем командный файл в каталог информационной базы или временную папку
ИмяСкрипта = КаталогИБ() + "restart_1c.cmd";
Текст.Записать(ИмяСкрипта);

// 5. Запускаем сформированный файл и закрываем текущую 1С
ЗапуститьПриложение(ИмяСкрипта);
ЗавершитьРаботуСистемы(0);

Особенности синтаксиса и типичные ошибки

Рассмотрим важные нюансы, с которыми часто сталкиваются разработчики при написании скрипта перезапуска:

  1. Работа с пробелами в путях командной строки: системная утилита start интерпретирует первую строку в двойных кавычках как заголовок консольного окна. Если путь к исполняемому файлу содержит пробелы (например, C:\Program Files\1Cv77\BIN\1cv7s.exe), необходимо обязательно указать пустые кавычки перед ним: start "" "C:\Program Files\...".
  2. Способы организации паузы в Windows:
    • Команда waitfor r /T 5 — ожидает сигнала 5 секунд и завершается по таймауту.
    • Команда timeout /t 5 /nobreak — штатная утилита задержки в современных версиях Windows.
    • Команда ping -n 6 127.0.0.1 >nul — классический универсальный способ ожидания в командной строке без дополнительных утилит.
  3. Параметры запуска 1С: для автоматического входа без интерактивных окон можно дополнить строку запуска параметрами пользователя /N"ИмяПользователя" и пароля /P"Пароль". Ключ /m запускает базу в монопольном режиме, если это необходимо для регламентных процедур.

Альтернативный вариант: скрытый перезапуск через VBScript

Если требуется избежать появления черного консольного окна командной строки при перезапуске, рассмотрим создание вспомогательного VBS-скрипта. Он выполняет ожидание и запуск в фоновом режиме:


Текст = СоздатьОбъект("Текст");
Текст.ДобавитьСтроку("WScript.Sleep 5000");
Текст.ДобавитьСтроку("Set WshShell = CreateObject(""WScript.Shell"")");
Текст.ДобавитьСтроку("WshShell.Run """"" + КаталогПрограммы() + "1cv7s.exe"""" enterprise /d""""" + СокрЛП(КаталогИБ()) + """"", 1, False");

ИмяСкрипта = КаталогИБ() + "restart.vbs";
Текст.Записать(ИмяСкрипта);

ЗапуститьПриложение("wscript.exe """ + ИмяСкрипта + """");
ЗавершитьРаботуСистемы(0);

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

← На главную