1С 8.3 ZIP
Данные > Примеры кода 1С > 1С 8.3 ZIP
Платформа 1С 8.3 для работы с архивами использует формат ZIP. Это популярный формат архивации файлов и сжатия данных без потерь, который может содержать один или несколько файлов и/или каталогов. Для этого во встроенном языке 1С 8.3 существуют функции ЗаписьZIPФайла и ЧтениеZIPФайла. Есть также необходимые для разбиения архифа на несколько частей указанного размера и объединения нескольких архивов в один соответственно: РазделитьФайл() и ОбъединитьФайлы().
Оглавление:
Создаем Zip архив с файлами в 1С 8.3:
&НаКлиенте
Процедура СоздаемZipАрхивСФайлами()
// Создаем zip-архив
ИмяАрхФайла="D:\AvtoArhiv\Doc31032020.zip";//Путь к архиву и имя
// Особенность: Архивировать средствами 1С можно даже запущенную информационную базу 1С
ПарольАрхФайла=""; // если нужно - можно задать пароль на архив
КоммАрхФайла="Архив документов создан 31/03/2020 из 1С 8.3"; // комментарий к архиву
ФайлАрхива = Новый ЗаписьZipФайла(ИмяАрхФайла, ПарольАрхФайла, КоммАрхФайла,
МетодСжатияZIP.Сжатие, УровеньСжатияZIP.Оптимальный, МетодШифрованияZIP.Zip20);
// Добавляем файл в zip-архив
ФайлАрхива.Добавить("D:\MyDocuments\ПланНа2020.docx"); // путь к файлу который добавляем в архив
// Или добавляем несколько файлов в zip-архив по маске
ФайлАрхива.Добавить("D:\MyDocuments\*.xlsx"); // указываем маску к файлам
// Или если нужно в архив добавить файлы не только из корневой папки ("D:\MyDocuments\"),
// но и из подпапок ("D:\MyDocuments\Balans2019\","D:\MyDocuments\Balans2020\",...)
// где есть файлы c расширением *.xlsx. Нужно использовать параметры (режимы):
ФайлАрхива.Добавить("D:\MyDocuments\*.xlsx",
РежимСохраненияПутейZIP.СохранятьОтносительныеПути,
РежимОбработкиПодкаталоговZIP.ОбрабатыватьРекурсивно);
// Записываем созданный архив на диск компьютера
ФайлАрхива.Записать();
КонецПроцедуры
Процедура СоздаемZipАрхивСФайлами()
// Создаем zip-архив
ИмяАрхФайла="D:\AvtoArhiv\Doc31032020.zip";//Путь к архиву и имя
// Особенность: Архивировать средствами 1С можно даже запущенную информационную базу 1С
ПарольАрхФайла=""; // если нужно - можно задать пароль на архив
КоммАрхФайла="Архив документов создан 31/03/2020 из 1С 8.3"; // комментарий к архиву
ФайлАрхива = Новый ЗаписьZipФайла(ИмяАрхФайла, ПарольАрхФайла, КоммАрхФайла,
МетодСжатияZIP.Сжатие, УровеньСжатияZIP.Оптимальный, МетодШифрованияZIP.Zip20);
// Добавляем файл в zip-архив
ФайлАрхива.Добавить("D:\MyDocuments\ПланНа2020.docx"); // путь к файлу который добавляем в архив
// Или добавляем несколько файлов в zip-архив по маске
ФайлАрхива.Добавить("D:\MyDocuments\*.xlsx"); // указываем маску к файлам
// Или если нужно в архив добавить файлы не только из корневой папки ("D:\MyDocuments\"),
// но и из подпапок ("D:\MyDocuments\Balans2019\","D:\MyDocuments\Balans2020\",...)
// где есть файлы c расширением *.xlsx. Нужно использовать параметры (режимы):
ФайлАрхива.Добавить("D:\MyDocuments\*.xlsx",
РежимСохраненияПутейZIP.СохранятьОтносительныеПути,
РежимОбработкиПодкаталоговZIP.ОбрабатыватьРекурсивно);
// Записываем созданный архив на диск компьютера
ФайлАрхива.Записать();
КонецПроцедуры
Распаковываем Zip архив в 1С 8.3:
&НаКлиенте
Процедура РаспаковываемZipАрхив()
// Распаковываем Doc31032020.zip в папку "D:\AvtoArhiv\"
ФайлАрхива = Новый ЧтениеZipФайла("D:\AvtoArhiv\Doc31032020.zip",""); // путь, пароль к архиву
// Сообщим комментарий к архиву
Сообщить(ФайлАрхива.Комментарий);
РежимВосстПутейФайлов=РежимВосстановленияПутейФайловZIP.Восстанавливать;
// Распаковываем все файлы в D:\MyDocuments\Out
ФайлАрхива.ИзвлечьВсе("D:\MyDocuments\Out", РежимВосстПутейФайлов); // (путь, восстанавливать каталоги)
// Или распаковываем файлы по одиночке.
Для Каждого Элемент Из ФайлАрхива.Элементы Цикл
Сообщить("... разархивирую..."+Элемент.ПолноеИмя);
//(Элемент, Путь, ВосстанавливатьКаталоги, Пароль)
ФайлАрхива.Извлечь(Элемент,"D:\MyDocuments\Out", РежимВосстПутейФайлов,"");
КонецЦикла;
КонецПроцедуры
Процедура РаспаковываемZipАрхив()
// Распаковываем Doc31032020.zip в папку "D:\AvtoArhiv\"
ФайлАрхива = Новый ЧтениеZipФайла("D:\AvtoArhiv\Doc31032020.zip",""); // путь, пароль к архиву
// Сообщим комментарий к архиву
Сообщить(ФайлАрхива.Комментарий);
РежимВосстПутейФайлов=РежимВосстановленияПутейФайловZIP.Восстанавливать;
// Распаковываем все файлы в D:\MyDocuments\Out
ФайлАрхива.ИзвлечьВсе("D:\MyDocuments\Out", РежимВосстПутейФайлов); // (путь, восстанавливать каталоги)
// Или распаковываем файлы по одиночке.
Для Каждого Элемент Из ФайлАрхива.Элементы Цикл
Сообщить("... разархивирую..."+Элемент.ПолноеИмя);
//(Элемент, Путь, ВосстанавливатьКаталоги, Пароль)
ФайлАрхива.Извлечь(Элемент,"D:\MyDocuments\Out", РежимВосстПутейФайлов,"");
КонецЦикла;
КонецПроцедуры
Пример готовой функции по распаковке Zip в 1С 8.3:
// Распаковывает все ZIP-архивы в указанном каталоге
// Каждый файл в архиве получает уникальное имя в формате: ИмяБезРасширения_UID.Расширение
//
// Параметры:
// КаталогАрхивов - Строка - Путь к каталогу с ZIP-архивами
Процедура РаспаковатьZIPАрхивы(КаталогАрхивов)
ФайлыАрхивов = НайтиФайлы(КаталогАрхивов, "*.zip");
Для Каждого ФайлАрхива Из ФайлыАрхивов Цикл
Попытка
ЧтениеАрхива = Новый ЧтениеZipФайла(ФайлАрхива.ПолноеИмя);
Исключение
Сообщить("Не удалось открыть архив: """ + ФайлАрхива.Имя + """", СтатусСообщения.Важное);
Продолжить;
КонецПопытки;
Для Каждого ЭлементАрхива Из ЧтениеАрхива.Элементы Цикл
ЧтениеАрхива.Извлечь(ЭлементАрхива, КаталогАрхивов, РежимВосстановленияПутейФайловZIP.НеВосстанавливать);
// Формируем уникальное имя для распакованного файла
ИсходноеИмяФайла = КаталогАрхивов + "\" + УбратьНедопустимыеСимволыВИмени(ЭлементАрхива.Имя);
УникальноеИмяФайла = КаталогАрхивов + "\" + УбратьНедопустимыеСимволыВИмени(ЭлементАрхива.ИмяБезРасширения)
// Каждый файл в архиве получает уникальное имя в формате: ИмяБезРасширения_UID.Расширение
//
// Параметры:
// КаталогАрхивов - Строка - Путь к каталогу с ZIP-архивами
Процедура РаспаковатьZIPАрхивы(КаталогАрхивов)
ФайлыАрхивов = НайтиФайлы(КаталогАрхивов, "*.zip");
Для Каждого ФайлАрхива Из ФайлыАрхивов Цикл
Попытка
ЧтениеАрхива = Новый ЧтениеZipФайла(ФайлАрхива.ПолноеИмя);
Исключение
Сообщить("Не удалось открыть архив: """ + ФайлАрхива.Имя + """", СтатусСообщения.Важное);
Продолжить;
КонецПопытки;
Для Каждого ЭлементАрхива Из ЧтениеАрхива.Элементы Цикл
ЧтениеАрхива.Извлечь(ЭлементАрхива, КаталогАрхивов, РежимВосстановленияПутейФайловZIP.НеВосстанавливать);
// Формируем уникальное имя для распакованного файла
ИсходноеИмяФайла = КаталогАрхивов + "\" + УбратьНедопустимыеСимволыВИмени(ЭлементАрхива.Имя);
УникальноеИмяФайла = КаталогАрхивов + "\" + УбратьНедопустимыеСимволыВИмени(ЭлементАрхива.ИмяБезРасширения)
+ "_" + Строка(Новый УникальныйИдентификатор()) + "." + ЭлементАрхива.Расширение;
Файл = Новый Файл(ИсходноеИмяФайла);
Файл.УстановитьТолькоЧтение(Ложь); // Снимаем атрибут "только чтение"
Попытка
ПереместитьФайл(ИсходноеИмяФайла, УникальноеИмяФайла);
Сообщить("Переименование файла: " + ИсходноеИмяФайла + " -> "+ УникальноеИмяФайла);
Исключение
Сообщить("Ошибка при переименовании файла: " + ИсходноеИмяФайла, СтатусСообщения.Ошибка);
КонецПопытки;
КонецЦикла;
ЧтениеАрхива.Закрыть();
Попытка
УдалитьФайл(ФайлАрхива.ПолноеИмя); // Удаляем архив после распаковки
Исключение
Сообщить("Не удалось удалить архив: " + ФайлАрхива.ПолноеИмя, СтатусСообщения.Ошибка);
КонецПопытки;
КонецЦикла;
КонецПроцедуры
// Заменяет недопустимые символы в имени файла
//
// Параметры:
// ИмяФайла - Строка - Исходное имя файла
//
// Возвращаемое значение:
// Строка - Имя файла с замененными недопустимыми символами
Функция УбратьНедопустимыеСимволыВИмени(Знач ИмяФайла)
ИмяФайла = СтрЗаменить(ИмяФайла, """", "_");
Возврат ИмяФайла;
КонецФункции
Файл = Новый Файл(ИсходноеИмяФайла);
Файл.УстановитьТолькоЧтение(Ложь); // Снимаем атрибут "только чтение"
Попытка
ПереместитьФайл(ИсходноеИмяФайла, УникальноеИмяФайла);
Сообщить("Переименование файла: " + ИсходноеИмяФайла + " -> "+ УникальноеИмяФайла);
Исключение
Сообщить("Ошибка при переименовании файла: " + ИсходноеИмяФайла, СтатусСообщения.Ошибка);
КонецПопытки;
КонецЦикла;
ЧтениеАрхива.Закрыть();
Попытка
УдалитьФайл(ФайлАрхива.ПолноеИмя); // Удаляем архив после распаковки
Исключение
Сообщить("Не удалось удалить архив: " + ФайлАрхива.ПолноеИмя, СтатусСообщения.Ошибка);
КонецПопытки;
КонецЦикла;
КонецПроцедуры
// Заменяет недопустимые символы в имени файла
//
// Параметры:
// ИмяФайла - Строка - Исходное имя файла
//
// Возвращаемое значение:
// Строка - Имя файла с замененными недопустимыми символами
Функция УбратьНедопустимыеСимволыВИмени(Знач ИмяФайла)
ИмяФайла = СтрЗаменить(ИмяФайла, """", "_");
Возврат ИмяФайла;
КонецФункции
💡 Шаблоны (готовые модели) кода 1С 8.3 с тегом #ZIP:
📰 Актуальные новости с тегом #Zip:
- В версии 8.3.27 реализована поддержка приложениями Autorun и SetupV8 поставки конфигурации в формате zip.
- В версии 8.3.21 реализована возможность выгрузки конфигурации в zip-архив xml-файлов. При выгрузке на стороне кластера серверов реализована возможность многопоточной выгрузки конфигурации.Команда Конфигуратора Выгрузить конфигурацию в файлы позволяет указать способ выгрузки (на сервере/на клиенте), количество одновременных потоков выгрузки и необходимость архивировать файл выгрузки. Для выполнения данной задачи реализован специальный параметр для следующих инструментов загрузки:
- Командная строка запуска конфигуратора. Для команды /DumpConfigToFiles реализован параметр -Server, -Archive, -JobsCount.
- Конфигуратор в режиме агента. Для команды config dump-config-to-files реализованы параметры --archive, --server, --threads.
- Утилита управления автономным сервером (ibcmd). Для команды infobase config export реализованы параметры --archive, --server, --threads.
0
комментарии
____________________
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник