При длительной непрерывной работе 1С:Предприятие 7.7 в режиме регламентных обменов, работы кассовых мест или интеграций нередко возникает необходимость принудительно перезапустить приложение встроенным кодом. Разберем технические особенности этого процесса и реализуем надежное решение.
Проанализируем специфику работы платформы 1С:Предприятие 7.7. Если вызвать запуск нового экземпляра программы непосредственно перед завершением текущего через команду КомандаСистемы() или ЗапуститьПриложение(), система выдаст ошибку о том, что каталог базы данных или каталог пользователя занят.
Выясним главные причины такого поведения:
1cv7.lck, 1cv7.mlk и файлов в каталоге пользователя usrdef) происходит не моментально. Операционной системе требуется некоторое время на сброс дискового кэша.1cv7s.exe (или 1cv7.exe) некоторое время остается в памяти после вызова процедуры закрытия.Следовательно, для успешного перезапуска нам необходимо передать управление внешней процедуре, которая выдержит технологическую паузу, дождется фактической выгрузки текущего сеанса и только затем выполнит старт платформы с нужными ключами командной строки.
Разберем классический и надежный способ реализации перезапуска: динамическое формирование командного файла (.cmd или .bat) штатными средствами встроенного языка 1С 7.7 с последующим корректным закрытием сеанса.
Текст.ЗапуститьПриложение().ЗавершитьРаботуСистемы(0).Посмотрим на программный код, который можно разместить в глобальном модуле или отдельной обработке:
Текст = СоздатьОбъект("Текст");
// 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);
Рассмотрим важные нюансы, с которыми часто сталкиваются разработчики при написании скрипта перезапуска:
start интерпретирует первую строку в двойных кавычках как заголовок консольного окна. Если путь к исполняемому файлу содержит пробелы (например, C:\Program Files\1Cv77\BIN\1cv7s.exe), необходимо обязательно указать пустые кавычки перед ним: start "" "C:\Program Files\...".waitfor r /T 5 — ожидает сигнала 5 секунд и завершается по таймауту.timeout /t 5 /nobreak — штатная утилита задержки в современных версиях Windows.ping -n 6 127.0.0.1 >nul — классический универсальный способ ожидания в командной строке без дополнительных утилит./N"ИмяПользователя" и пароля /P"Пароль". Ключ /m запускает базу в монопольном режиме, если это необходимо для регламентных процедур.Если требуется избежать появления черного консольного окна командной строки при перезапуске, рассмотрим создание вспомогательного 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.