Платформа 1С:Предприятие предоставляет возможности работы с ZIP архивами. Для этого в системе существуют объекты ЗаписьZIPФайла, ответственный за запись, и ЧтениеZIPФайла, соответственно ответственный за чтение архивов.
Для того чтобы записать файлы в ZIP-архив необходимо выполнить несколько простых действий:
Рассмотрим эти действия подробнее.
Создание объекта ЗаписьZIPФайла можно осуществить двумя путями - создать инициализированный объект или создав неинициализированный объект вызвать у него метод Открыть. В обоих случаях состав параметров является одинаковым. В самом простом случае требуется указать только имя файла, куда будет записан архив.
Для создания нового архива требуется указать:
После создания объекта необходимо добавить в него необходимые файлы, воспользовавшись методом Добавить. Он принимает на вход 3 параметра:
После того, как все необходимые файлы добавлены, можно записать архив на диск, воспользовавшись методом Записать().
Важно понимать, что до выполнения этого метода, никаких реальных действий по созданию архива не происходит. После записи архива на диск объект закрывает его и для работы со следующим архивом необходимо выполнить метод Открыть().
Пример:
Копировать в буфер обменаСейчас = ТекущаяДата(); // Создадим объект записи ZIP-архива ЗаписьZIP = Новый ЗаписьZipФайла(ИмяАрхивногоФайла, ПарольАрхивногоФайла, "" + МетодСжатия + Символы.ПС + УровеньСжатия + Символы.ПС + МетодШифрования, МетодСжатия, УровеньСжатия, МетодШифрования); // Добавим необходимые файлы в архив ЗаписьZIP.Добавить("c:\MyFiles\File1.xml", РежимСохраненияПутейZIP.НеСохранятьПути); ЗаписьZIP.Добавить("c:\MyFiles\MoreFiles\*.xml", РежимСохраненияПутейZIP.СохранятьОтносительныеПути, РежимОбработкиПодкаталоговZIP.НеОбрабатывать); // Запишем архив на диск ЗаписьZIP.Записать(); // Сообщим время, которое потребовалось для работы. Сообщить("Упаковка заняла " + ТекущаяДата() - Сейчас) + " секунд(ы)");
Остановимся подробнее на особенностях упаковки файлов по маске.
Предположим, что у нас есть следующий файлы, которые нам необходимо поместить в архив:
Копировать в буфер обменаc:\ZipTest\11.xls c:\ZipTest\12.xls c:\ZipTest\13.xls c:\ZipTest\MoreFiles\14.xls c:\ZipTest\MoreFiles\15.xls c:\ZipTest\MoreFiles\16.xls
Мы хотим создать в архив с помощью нижеследующих команд:
Копировать в буфер обмена// Добавим необходимые файлы в архив ЗаписьZIP.Добавить("c:\ZipTest\11.xls", РежимСохраненияПутейZIP.СохранятьПолныеПути); ЗаписьZIP.Добавить("c:\ZipTest\12.xls", РежимСохраненияПутейZIP.СохранятьОтносительныеПути); ЗаписьZIP.Добавить("c:\ZipTest\13.xls", РежимСохраненияПутейZIP.НеСохранятьПути);
В результирующий архив будут помещены следующие файлы:
Копировать в буфер обмена\ZipTest\11.xls \12.xls \13.xls
Мы хотим создать в архив с помощью нижеследующих команд:
Копировать в буфер обмена// Добавим необходимые файлы в архив ЗаписьZIP.Добавить("c:\ZipTest\*.xls", РежимСохраненияПутейZIP.СохранятьОтносительныеПути, РежимОбработкиПодкаталоговZIP.НеОбрабатывать);
В результирующий архив будут помещены следующие файлы:
Копировать в буфер обмена\ZipTest\11.xls \ZipTest\12.xls \ZipTest\13.xls
Мы хотим создать в архив с помощью нижеследующих команд:
Копировать в буфер обмена// Добавим необходимые файлы в архив ЗаписьZIP.Добавить("c:\ZipTest\*.xls", РежимСохраненияПутейZIP.СохранятьОтносительныеПути, РежимОбработкиПодкаталоговZIP.ОбрабатыватьРекурсивно);
В результирующий архив будут помещены следующие файлы:
Копировать в буфер обмена\ZipTest\11.xls \ZipTest\12.xls \ZipTest\13.xls \ZipTest\MoreFiles\14.xls \ZipTest\MoreFiles\15.xls \ZipTest\MoreFiles\16.xls
Для того чтобы прочитать файлы из ZIP-архива необходимо выполнить несколько простых действий:
Рассмотрим эти действия подробнее.
Создание объекта ЧтениеZIPФайла можно осуществить двумя путями - создать инициализированный объект или создав неинициализированный объект вызвать у него метод Открыть(). В обоих случаях состав параметров является одинаковым. В самом простом случае требуется указать только имя архивного файла, с которым необходимо работать.
Для открытия архива требуется указать:
После того, как архив успешно открыт, можно получить информацию о файлах, хранящихся внутри него. Для этого у объекта ЧтениеZIPФайла предусмотрено свойство Элементы, которое предоставляет доступ к коллекции элементов ZIP файла.
Для каждого элемента можно получить разнообразную информацию о его имени, времени его модификации, его атрибутах, а также узнать является ли данный элемент зашифрованным.
После получения информации о элементах их можно распаковать на диск. Это возможно сделать двумя методами:
Метод ИзвлечьВсе() распаковывает все файлы в архиву по указанному пути. Второй параметр данного метода определяет возможность восстановления исходных путей файлов.
Метод Извлечь() распаковывает указанный элемент коллекции из свойства Элементы по указанному пути. Второй параметр данного метода аналогичен тому же параметру метода ИзвлечьВсе(). Наибольший интерес представляет третий параметр данного метода - Пароль. В нем можно указать индивидуальный пароль для элемента архива, в случае если он зашифрован паролем отличным от других файлов.
После того, как архив нам больше не нужен можно завершить работу с ним вызвав метод Закрыть().
Пример:
Копировать в буфер обменаСообщить("Распаковка файла - " + ИмяАрхивногоФайла); Сейчас = ТекущаяДата(); // Откроем файл для чтения ЧтениеZIP = Новый ЧтениеZipФайла(ИмяАрхивногоФайла, ПарольАрхивногоФайла); // Сообщим комментарий архива Сообщить("Комментарий:"); Сообщить(ЧтениеZIP.Комментарий); // Распакуем все файлы из архива ЧтениеZIP.ИзвлечьВсе(ПапкаНазначения, РежимВосстановленияПутейФайловZIP.НеВосстанавливать); // Распакуем файлы по одиночке Для Каждого Элемент Из ЧтениеZIP.Элементы Цикл Сообщить("Распаковка файла:" + Элемент.ПолноеИмя); ЧтениеZIP.Извлечь(Элемент, ПапкаНазначения, РежимВосстановленияПутейФайловZIP.Восстанавливать, ? (Элемент.Зашифрован, ПарольАрхивногоФайла, "")); КонецЦикла; ЧтениеZIP.Закрыть(); // Сообщим время, потребовавшееся для работы Сообщить("Распаковка заняла " + (ТекущаяДата() - Сейчас) + " секунд(ы)");
При работе с большими объемами данных могут возникнуть проблемы при пересылке архивных файлов. Типичной такой ситуацией является ограничение некоторых почтовых серверов на размер сообщения - если письмо превышает некий заранее установленный размер, оно отбрасывается сервером. Применительно к 1С:Предприятию такая ситуация может возникнуть при пересылке больших сообщений обмена данными.
Для решения этих проблем можно использовать функции РазделитьФайл() и ОбъединитьФайлы().
Функция РазделитьФайл() предназначена для разбиения файла на несколько частей указанного размера. Функция ОбъединитьФайлы() объединяет несколько файлов в один.
Более подробную информацию о этих функциях можно получить в документации.