Как в 1С 7.7 заархивировать выбранные файлы через командную строку WinRAR?

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

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

Метод 1: Прямое перечисление файлов в командной строке

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


ИмяАрхива = "C:\Backups\Reports.rar";
Файл1 = "C:\Data\Report_01.xls";
Файл2 = "C:\Data\Report_02.xls";
СтрокаКоманды = "C:\Program Files\WinRAR\RAR.exe a -ep1 """ + ИмяАрхива + """ """ + Файл1 + """ """ + Файл2 + """";
КомандаСистемы(СтрокаКоманды);

Проанализируем этот код. Мы используем ключ -ep1, чтобы исключить базовый путь из архива (сохранить только относительные пути), и берем каждый путь в кавычки, чтобы избежать ошибок при наличии пробелов в именах папок. Однако у этого метода есть существенный недостаток: ограничение длины командной строки. В среде Windows и 1С 7.7 длина строки команды ограничена (часто пределом в 512 или 1024 символа). Если файлов много или пути к ним очень длинные, команда просто обрежется и не выполнится корректно.

Метод 2: Использование текстового списка файлов (@filelist)

Чтобы обойти ограничение по длине строки, WinRAR поддерживает работу с внешними списками файлов. Вместо перечисления всех имен в самой команде, мы записываем их в обычный текстовый файл, а в команде указываем ссылку на этот файл с символом @.

Рассмотрим по шагам, как это реализовать в 1С 7.7:

  1. Создаем текстовый файл (например, list.lst).
  2. Записываем в него полные пути к нужным файлам (каждый путь с новой строки).
  3. Передаем этот файл архиватору.

// Создаем список файлов
ТекстСписок = СоздатьОбъект("Текст");
ТекстСписок.ДобавитьСтроку("C:\Data\Report_01.xls");
ТекстСписок.ДобавитьСтроку("C:\Data\Report_02.xls");
ТекстСписок.Записать(КаталогИБ() + "files.lst");

// Формируем короткую команду
ИмяСписка = КаталогИБ() + "files.lst";
ИмяАрхива = "C:\Backups\Archive.rar";
СтрокаКоманды = "RAR.exe a -ep1 """ + ИмяАрхива + """ @""" + ИмяСписка + """";
КомандаСистемы(СтрокаКоманды);

Решение проблемы с русскими буквами в путях

Часто при использовании метода со списком (.lst) пользователи сталкиваются с ошибкой: "Невозможно открыть файл". Причина кроется в кодировках. 1С 7.7 сохраняет текстовые файлы в кодировке Windows (ANSI), в то время как консольный RAR.exe по умолчанию ожидает OEM (DOS).

Чтобы WinRAR корректно прочитал русские названия из вашего списка, необходимо использовать специальный ключ -sc (Set Character encoding). Выясним, какие параметры ключа нам помогут:

Скорректированная команда будет выглядеть так:


СтрокаКоманды = "RAR.exe a -scl -ep1 """ + ИмяАрхива + """ @""" + ИмяСписка + """";

Метод 3: Использование временного BAT-файла

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


БатФайл = СоздатьОбъект("Текст");
БатФайл.ДобавитьСтроку("chcp 1251"); // Устанавливаем кодировку Windows в консоли
БатФайл.ДобавитьСтроку("""C:\Program Files\WinRAR\RAR.exe"" a -y -scl ""C:\Archive.rar"" @""C:\list.lst""");
БатФайл.Записать(КаталогИБ() + "run_rar.bat");

КомандаСистемы(КаталогИБ() + "run_rar.bat");

Метод 4: "Папка-песочница" (Самый надежный способ)

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

  1. С помощью команды ФС.СоздатьКаталог() создаем временную папку с простым латинским именем (например, C:\TempArch\).
  2. Копируем туда нужные файлы через ФС.КопироватьФайл().
  3. Архивируем всю папку одной командой RAR.exe a Archive.rar C:\TempArch\*.*.
  4. Удаляем временную папку и файлы.

Этот метод гарантирует результат, так как WinRAR будет работать с маской *.* внутри чистого каталога, и никакие спецсимволы в именах исходных путей не помешают процессу.

Продвинутая автоматизация: WScript.Shell

Использование стандартной команды КомандаСистемы() имеет минус — на экране мелькает черное окно консоли. Для профессионального решения задачи в 1С 7.7 лучше использовать объект WScript.Shell. Это позволит запускать архиватор в скрытом режиме и получать код возврата (успешно ли прошло сжатие).


Shell = СоздатьОбъект("WScript.Shell");
// Параметры Run: 
// СтрокаКоманды - путь и ключи
// 0 - скрыть окно
// 1 - ждать завершения (синхронный запуск)
Результат = Shell.Run(СтрокаКоманды, 0, 1);

Если Результат <> 0 Тогда
    Предупреждение("Ошибка при архивации! Код ошибки: " + Результат);
КонецЕсли;

Полезные ключи WinRAR для работы из 1С

Проанализируем дополнительные ключи, которые сделают вашу автоматизацию более "тихой" и надежной:

Резюме

Для стабильной работы из 1С 7.7 мы рекомендуем использовать Метод 2 (со списком файлов и ключом -scl) совместно с WScript.Shell. Это обеспечит высокую скорость работы, отсутствие ограничений на количество файлов и корректную обработку русских имен. Если же вы хотите полной независимости от установленного WinRAR, посмотрите в сторону внешней компоненты 1cpp.dll (класс BinaryData), которая позволяет работать с ZIP-архивами напрямую из кода 1С без вызова внешних программ.

← На главную