В процессе разработки на платформе 1С 7.7 часто возникает задача автоматизации архивных копий или упаковки сформированных отчетов для отправки по электронной почте. Если требуется упаковать не весь каталог целиком, а только определенный набор файлов (например, счета только за текущий день), разработчики сталкиваются с рядом технических ограничений: лимит длины командной строки, проблемы с кодировкой кириллических имен и необходимость скрытия консольного окна. В этой статье мы подробно разберем, как решить эти задачи эффективно и надежно.
Самый простой и очевидный способ — добавить пути к файлам непосредственно в строку запуска. Рассмотрим пример реализации, где мы формируем команду, перечисляя переменные с именами файлов через пробел.
ИмяАрхива = "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 символа). Если файлов много или пути к ним очень длинные, команда просто обрежется и не выполнится корректно.
Чтобы обойти ограничение по длине строки, WinRAR поддерживает работу с внешними списками файлов. Вместо перечисления всех имен в самой команде, мы записываем их в обычный текстовый файл, а в команде указываем ссылку на этот файл с символом @.
Рассмотрим по шагам, как это реализовать в 1С 7.7:
list.lst).
// Создаем список файлов
ТекстСписок = СоздатьОбъект("Текст");
ТекстСписок.ДобавитьСтроку("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). Выясним, какие параметры ключа нам помогут:
-scl — указывает WinRAR читать список файлов в кодировке ANSI (стандарт для 1С 7.7).-scu — чтение списка в Unicode.Скорректированная команда будет выглядеть так:
СтрокаКоманды = "RAR.exe a -scl -ep1 """ + ИмяАрхива + """ @""" + ИмяСписка + """";
Если даже при использовании списка команда получается слишком сложной, или вам нужно выполнить несколько действий подряд (например, создать архив, а затем переместить его), лучше всего создать временный .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");
Разберем ситуацию, когда работа со списками и кодировками кажется слишком громоздкой. Существует простой "дедовский" способ, который исключает любые ошибки путей:
ФС.СоздатьКаталог() создаем временную папку с простым латинским именем (например, C:\TempArch\).ФС.КопироватьФайл().RAR.exe a Archive.rar C:\TempArch\*.*.Этот метод гарантирует результат, так как WinRAR будет работать с маской *.* внутри чистого каталога, и никакие спецсимволы в именах исходных путей не помешают процессу.
Использование стандартной команды КомандаСистемы() имеет минус — на экране мелькает черное окно консоли. Для профессионального решения задачи в 1С 7.7 лучше использовать объект WScript.Shell. Это позволит запускать архиватор в скрытом режиме и получать код возврата (успешно ли прошло сжатие).
Shell = СоздатьОбъект("WScript.Shell");
// Параметры Run:
// СтрокаКоманды - путь и ключи
// 0 - скрыть окно
// 1 - ждать завершения (синхронный запуск)
Результат = Shell.Run(СтрокаКоманды, 0, 1);
Если Результат <> 0 Тогда
Предупреждение("Ошибка при архивации! Код ошибки: " + Результат);
КонецЕсли;
Проанализируем дополнительные ключи, которые сделают вашу автоматизацию более "тихой" и надежной:
-y — отвечать "Да" на все вопросы (например, на перезапись архива). Важно, чтобы процесс не "повис" в ожидании нажатия кнопки пользователем.-ibck — запуск WinRAR в фоновом режиме (иконка в трее вместо окна).-df — удалить файлы после архивации. Удобно для временных отчетов.-m5 — максимальная степень сжатия (если важен размер).-p[ПАРОЛЬ] — установить пароль на архив (если данные конфиденциальны).Для стабильной работы из 1С 7.7 мы рекомендуем использовать Метод 2 (со списком файлов и ключом -scl) совместно с WScript.Shell. Это обеспечит высокую скорость работы, отсутствие ограничений на количество файлов и корректную обработку русских имен. Если же вы хотите полной независимости от установленного WinRAR, посмотрите в сторону внешней компоненты 1cpp.dll (класс BinaryData), которая позволяет работать с ZIP-архивами напрямую из кода 1С без вызова внешних программ.