Как удалить исходные файлы после упаковки в zip-архив в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При автоматизации выгрузок, обменов или резервного копирования часто требуется сформировать архив и очистить каталог от исходных неупакованных файлов. Разработчики нередко ищут параметр или метод в объекте ЗаписьZipФайла, который позволял бы автоматически удалять упакованные файлы по аналогии с внешними архиваторами. Рассмотрим, как устроена работа с zip-архивами в платформе 1С:Предприятие, почему автоматическое удаление не встроено в объект архивации и как правильно организовать очистку файлов в коде.

Почему в объекте ЗаписьZipФайла нет встроенного флага удаления

В интерактивных архиваторах (например, WinRAR или 7-Zip) существует опция «Удалять файлы после архивации». Однако в программном интерфейсе 1С объект ЗаписьZipФайла отвечает исключительно за упаковку данных в архивный файл. Разделение операций архивации и удаления сделано намеренно по следующим причинам:

  1. Безопасность данных: если в процессе сжатия или сохранения архива произойдет сбой (закончится место на диске, произойдет ошибка ввода-вывода или сбой питания), исходные файлы останутся нетронутыми, что предотвратит безвозвратную потерю информации.
  2. Блокировка ресурсов: объект ЗаписьZipФайла удерживает дескрипторы открытых исходных файлов в операционной системе вплоть до вызова метода Записать(). Попытка удалить файл до завершения записи архива приведет к ошибке доступа на уровне операционной системы.

Штатный способ: использование метода УдалитьФайлы

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

Разберем по шагам типовой алгоритм:

  1. Создаем объект ЗаписьZipФайла и инициализируем архив.
  2. Добавляем файлы в архив методом Добавить().
  3. Фиксируем создание архива методом Записать().
  4. В случае успешной записи вызываем процедуру УдалитьФайлы().

Посмотрим на пример безопасной реализации на сервере:


ИмяФайлаАрхива = "C:\Exchange\Export.zip";
ИмяИсходногоФайла = "C:\Exchange\Data.xml";

Архиватор = Новый ЗаписьZipФайла(ИмяФайлаАрхива);
Попытка
    Архиватор.Добавить(ИмяИсходногоФайла);
    Архиватор.Записать();
    
    // Удаляем исходный файл только после успешного закрытия архива
    УдалитьФайлы(ИмяИсходногоФайла);
Исключение
    // В случае ошибки архив не сформирован корректно, исходный файл сохранен
    ЗаписьЖурналаРегистрации("Архивация", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
    ВызватьИсключение;
КонецПопытки;

Особенности работы в асинхронном режиме на клиенте

Если операция выполняется в клиентском коде управляемого приложения при установленном режиме «Запрещать открытие модальных окон» или запрете синхронных вызовов, прямой вызов УдалитьФайлы() вызовет исключение платформы. В таких сценариях применяются асинхронные методы работы с файловой системой.

Рассмотрим пример с использованием асинхронного вызова через конструкцию Ждать:


&НаКлиенте
Асинх Процедура УпаковатьИОчиститьФайл(ИмяФайлаАрхива, ИмяИсходногоФайла)
    
    Архиватор = Новый ЗаписьZipФайла(ИмяФайлаАрхива);
    Попытка
        Архиватор.Добавить(ИмяИсходногоФайла);
        Архиватор.Записать();
        
        // Асинхронное удаление на клиенте
        Ждать УдалитьФайлыАсинх(ИмяИсходногоФайла);
    Исключение
        ПоказатьПредупреждение(, "Не удалось заархивировать файл: " + ОписаниеОшибки());
    КонецПопытки;
    
КонецПроцедуры

Для версий платформы без поддержки ключевого слова Ждать применяется метод НачатьУдалениеФайлов() с передачей описания оповещения.

Использование временных каталогов для автоматической очистки

Когда выгружаемые данные формируются программно исключительно для упаковки в архив, удобно сохранять их в отдельном временном каталоге. Для этого используется метод ПолучитьИмяВременногоФайла().

Разберем по шагам этот подход:

  1. Получаем путь к уникальной временной папке.
  2. Создаем каталог и записываем туда все промежуточные файлы.
  3. Упаковываем всё содержимое каталога в архив.
  4. После завершения архивации удаляем каталог целиком одной командой УдалитьФайлы(ВременныйКаталог), избавляясь от необходимости перебирать каждый файл по отдельности.

Альтернативные способы: системные команды и внешние утилиты

Если в инфраструктуре применяются внешние консольные архиваторы (например, 7-Zip или WinRAR), флаг удаления файлов можно передать непосредственно в параметрах командной строки:

  1. Консольный 7-Zip: параметр -sdel предписывает утилите удалить исходные файлы после успешного добавления в архив (например, 7z.exe a archive.zip C:\Data\*.xml -sdel).
  2. Консольный WinRAR: параметр -df удаляет файлы после помещения в архив.
  3. Командные сценарии (bat/cmd): удаление может быть вынесено в отдельный командный файл операционной системы через команду ЗапуститьПриложение().

Однако при наличии встроенного объекта ЗаписьZipФайла и штатной процедуры УдалитьФайлы() использование внешних утилит избыточно, если не требуются специфические форматы сжатия или алгоритмы шифрования.

← На главную