В процессе разработки периодически возникает задача породить дочерний сеанс 1С из текущей информационной базы (например, для выгрузки файла конфигурации .cf, выполнения тяжелой фоновой процедуры в отдельном окне или автотестирования). Однако разработчики часто сталкиваются с ситуацией: метод ЗапуститьПриложение вызывается с флагом ожидания Истина, но система не ждет завершения работы нового сеанса и сразу продолжает выполнение кода.
В этой статье мы подробно проанализируем причины такого поведения, выясним ошибки в формировании строк командной строки и разберем проверенные способы корректного ожидания завершения выгрузки или работы дочернего сеанса.
Рассмотрим, что происходит, когда в коде вызывается запуск общего стартера 1С:
СтрокаЗапуска = "C:\Program Files (x86)\1cv8\common\1cestart.exe ENTERPRISE /S server\base";
ЗапуститьПриложение(СтрокаЗапуска, , Истина);
Файл 1cestart.exe не является основным исполняемым файлом самой платформы. Это утилита-загрузчик (стартер), задача которой — определить нужную версию платформы для конкретной базы, породить независимый дочерний процесс 1cv8.exe и сразу же завершить свою работу.
Операционная система фиксирует, что процесс 1cestart.exe успешно закрылся, и возвращает управление в 1С. В результате код продолжает выполняться дальше, а запущенная база еще только начинает загружаться. Если далее по коду идет попытка прочитать сформированный файл конфигурации .cf, возникнет ошибка, так как файл еще не создан.
Проанализируем еще одну частую проблему — экранирование кавычек. В Windows пути к каталогам платформы содержат пробелы (например, Program Files (x86)). Если не обернуть путь в кавычки внутри строки, командный интерпретатор разобьет команду по первому же пробелу.
Разберем, как правильным образом передать двойные кавычки во встроенном языке 1С:
// Внутри строки 1С две двойные кавычки "" преобразуются в одну кавычку "
ПутьКЗапуску = """C:\Program Files (x86)\1cv8\common\1cestart.exe"" ENTERPRISE /S server\base";
Чтобы метод ЗапуститьПриложение честно дождался закрытия окна или завершения пакетного режима, необходимо запускать исполняемый файл конкретной платформы (1cv8.exe), находящийся в каталоге bin соответствующей версии, в обход стартера.
Рассмотрим пример кода:
КодВозврата = 0;
// Указываем прямой путь к исполняемому файлу нужной версии
ПутьКЕксе = """C:\Program Files (x86)\1cv8\8.3.23.1865\bin\1cv8.exe""";
ПараметрыЗапуска = " DESIGNER /S MOW03-PT1C04T:1841\test_83 /DumpCfg ""C:\Temp\dump.cf"" /Out ""C:\Temp\log.txt""";
СтрокаКоманды = ПутьКЕксе + ПараметрыЗапуска;
// Третий параметр Истина блокирует исполнение до полного закрытия 1cv8.exe
ЗапуститьПриложение(СтрокаКоманды, , Истина, КодВозврата);
Если КодВозврата = 0 Тогда
Сообщить("Выгрузка конфигурации успешно завершена!");
Иначе
Сообщить("Процесс завершился с ошибкой. Код: " + КодВозврата);
КонецЕсли;
Важно: При пакетном вызове Конфигуратора (параметры DESIGNER и /DumpCfg) всегда передавайте ключ /Out с путем к текстовому файлу лога. Если в процессе выгрузки возникнет диалог ошибки или модальное окно, без указания лог-файла процесс может зависнуть или завершиться без создания файла .cf.
Платформа 1С предоставляет встроенную функцию ЗапуститьСистему. Она предназначена для запуска нового сеанса 1С с передачей параметров командной строки. Второй параметр отвечает за режим ожидания.
Разберем пример выгрузки конфигурации через ЗапуститьСистему:
КодВозврата = 0;
// В строку параметров передаем режим (DESIGNER) и необходимые ключи
ПараметрыВыгрузки = "DESIGNER /S MOW03-PT1C04T:1841\test_83 /DumpCfg ""C:\Temp\v8_dump.cf"" /Out ""C:\Temp\log.txt""";
// Флаг Истина заставляет систему дождаться окончания работы запущенного сеанса
ЗапуститьСистему(ПараметрыВыгрузки, Истина, КодВозврата);
Если КодВозврата = 0 Тогда
Сообщить("Конфигуратор успешно завершил работу.");
КонецЕсли;
Если требуется выполнить запуск через командную строку Windows (например, из бат-файла или скрипта), можно воспользоваться системной командой start /wait. Она принудительно заставляет командный толмач ожидать завершения процесса.
Рассмотрим пример использования с объектом WScript.Shell:
WshShell = Новый COMОбъект("WScript.Shell");
// Формируем команду для cmd.exe с флагом /wait
КомандаCmd = "cmd /c start /wait ""1C_Process"" ""C:\Program Files (x86)\1cv8\8.3.23.1865\bin\1cv8.exe"" CONFIG /S server\base /DumpCfg ""C:\Temp\file.cf""";
// Метод Run с параметром Истина блокирует выполнение до окончания cmd
КодЗавершения = WshShell.Run(КомандаCmd, 0, Истина);
Выяснив механизмы работы процессов platforms 1С, выделим ключевые правила:
1cestart.exe, если вам нужно дождаться окончания работы вызываемого сеанса. Используйте прямой путь к bin\1cv8.exe или функцию ЗапуститьСистему./Out для записи логов и предотвращения зависания интерактивных сообщений.