Почему 1С не видит файл после архивации через WinRAR?

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

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

Выясняем причину: асинхронность команды start

Основная проблема заключается в использовании команды start внутри метода КомандаСистемы(). В Windows команда start запускает процесс в отдельном потоке и тут же возвращает управление вызывающей программе. В нашем случае 1С не дожидается окончания работы архиватора RAR.exe и сразу переходит к следующей строке кода — проверке наличия файла через ФС.СуществуетФайл().

Так как архивация — процесс не мгновенный, метод ФС.СуществуетФайл() срабатывает раньше, чем WinRAR успевает создать архив. Именно поэтому система возвращает 0, утверждая, что файл не найден.

Решение 1: Синхронный вызов программы

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

Рассмотрим правильный пример формирования строки вызова:


Кавычка = Симв(34);
ПутьКРару = Кавычка + "C:\Program Files\WinRAR\rar.exe" + Кавычка;
Параметры = " a -ep ";
ИмяАрхива = "D:\Backups\Archive.rar";
ИмяФайла = "D:\Data\MyData.dbf";
СтрокаКоманды = ПутьКРару + Параметры + Кавычка + ИмяАрхива + Кавычка + " " + Кавычка + ИмяФайла + Кавычка;
КомандаСистемы(СтрокаКоманды);
// Теперь 1С дождется окончания работы RAR и только потом выполнит следующую строку:
Сообщить("Файл существует: " + ФС.СуществуетФайл(ИмяАрхива));

Решение 2: Работа с путями, содержащими пробелы

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

  1. Сформируйте переменную Кавычка = Симв(34).
  2. Оберните в эту кавычку путь к исполняемому файлу архиватора.
  3. Оберните в эту кавычку путь к создаваемому архиву.
  4. Оберните в эту кавычку путь к папке или файлу, который нужно заархивировать.

Решение 3: Альтернативные способы управления процессами

Если вам необходимо запускать архивацию, не блокируя работу интерфейса 1С на длительное время, рассмотрите использование объекта WScript.Shell. Это позволит более гибко управлять запуском процессов:


// Пример использования WScript.Shell для управления запуском
WshShell = СоздатьОбъект("WScript.Shell");
Команда = "D:\Tools\WinRAR\RAR.exe a -m5 ""D:\Archive.rar"" ""D:\Data\*.*""";
// Второй параметр 1 означает ожидание завершения (bWaitOnReturn)
WshShell.Run(Команда, 0, 1);

Метод Run объекта WScript.Shell позволяет явно указать необходимость ожидания завершения процесса (третий параметр равен 1), что гарантирует, что ваша программа не будет проверять файл до того, как WinRAR закончит работу.

Рекомендации по безопасности и стабильности

Применяя эти простые рекомендации, вы сможете избавиться от ошибок типа «Файл не найден» и сделать ваши процессы автоматизации в 1С 7.7 стабильными и предсказуемыми.

← На главную