ZIP-архив в 1С программно: создать, проверить состав и распаковать
На платформах с 8.3.26 доступны ЗаписьФайлаАрхива и ЧтениеФайлаАрхива. Добавить() формирует состав, а Записать() сохраняет и закрывает архив, перезаписывая существующий файл назначения. Примеры ниже предназначены для доверенных файлов в отдельном рабочем каталоге.
Какой API архива выбрать по версии 1С
Основной пример рассчитан на 8.3.26+ и проверен на 8.3.27.1989. Типы ЧтениеZipФайла и ЗаписьZipФайла встречаются в старом коде; справка 8.3.27 помечает их как нерекомендуемые начиная с 8.3.26. Методическая статья ИТС указывает 8.3.27 — для границы доступности здесь используем карточки типов и методов.
Перенос старого кода не сводится к замене имени: изменились типы перечислений и порядок необязательных аргументов. Проверяйте полную сигнатуру на минимальной поддерживаемой версии.
Создать ZIP-архив из одного файла
// ИмяИсточника и ИмяАрхива — полные пути на машине исполнения.
// ИмяАрхива должно быть новым и находиться вне маски источников.
Архив = Новый ЗаписьФайлаАрхива;
Архив.Открыть(ИмяАрхива);
Архив.Добавить(ИмяИсточника);
Архив.Записать();Источник должен оставаться доступным до Записать(): это не гарантия, что все байты скопированы уже после Добавить(). Файл назначения должен быть доступен для записи. Клиентский путь не становится серверным только потому, что он передан строкой.
Маска, подпапки и сохранение структуры каталогов
Архив.Добавить(
МаскаИсточников,
РежимСохраненияПутейФайлаАрхива.СохранятьОтносительныеПути,
РежимОбработкиПодкаталоговФайлаАрхива.ОбрабатыватьРекурсивно);Этот фрагмент применяйте между Открыть и Записать. По умолчанию пути не сохраняются, а вложенные каталоги не обходятся. При одинаковом имени файла в нескольких папках проверьте получившийся состав: упаковка без путей не гарантирует нужного вам разрешения коллизий.
Не добавляйте создаваемый архив в собственную маску. Кириллица в именах, разделители путей и чтение результата сторонним архиватором требуют проверки на целевых ОС. Кодировка имён файлов в архиве не является кодировкой содержимого XML или CSV.
Распаковать доверенный ZIP
Чтение = Новый ЧтениеФайлаАрхива;
Чтение.Открыть(ИмяАрхива);
// КаталогНазначения — отдельный подготовленный пустой каталог.
Чтение.ИзвлечьВсе(КаталогНазначения);
Чтение.Закрыть();До распаковки используйте коллекцию Элементы для проверки состава и сопоставления имён с ожидаемым контрактом обмена. Не запускайте полученные программы. Встроенная проверка файлового примера подтвердила создание и извлечение input.txt новым API; байты извлечённого файла сверяйте с источником, а не только по наличию имени.
Почему «добавление» заменяет старый архив
Открытие существующего файла через writer не означает дозапись. При Записать() прежний архив заменяется новым составом. Для задачи «добавить файл к существующему архиву» нужен отдельный алгоритм: прочитать исходный состав, подготовить новый архив в другом месте и заменить оригинал только после проверки. Такой алгоритм не входит в короткий пример выше.
Чужой архив: почему ИзвлечьВсе не равно безопасной загрузке
Справка использованных методов не даёт основания обещать безопасную распаковку любого пользовательского ZIP. До извлечения необходимы проверка абсолютных путей и выхода за каталог, коллизий нормализованных имён, количества и суммарного размера файлов. Одной проверки подстроки .. недостаточно. Отдельный каталог сам по себе не является песочницей ОС.
Лимиты должны учитывать фактически извлечённые данные, а не только заявленные размеры. Для недоверенных архивов нужен изолированный обработчик и политика отказа при нарушении контракта. Пример статьи не является таким обработчиком.
Источники: руководство 8.3.27, §16.7, справка «ЗаписьФайлаАрхива.Открыть/Добавить/Записать» и «ЧтениеФайлаАрхива.Открыть/ИзвлечьВсе»; особенности ZIP-объектов. Общий класс риска обхода пути описан в исследовании Zip Slip; это не утверждение об установленной уязвимости 1С.
Частые ошибки
- Указывать новый API на платформе ниже 8.3.26 — предварительно проверьте версию.
- Ожидать дозапись существующего ZIP — writer заменяет его новым составом.
- Распаковывать чужие данные прямо в рабочую папку приложения или автоматически запускать извлечённые файлы.
Частые вопросы
Когда архив действительно записан?
После успешного вызова Записать(), который сохраняет и закрывает файл архива.
Подпапки добавляются автоматически?
Нет, у Добавить по умолчанию отключены рекурсивная обработка подпапок и сохранение путей.
Можно ли распаковать любой ZIP этим примером безопасно?
Нет. Пример предназначен для доверенного архива. Недоверенные данные требуют проверки путей, коллизий и лимитов в изолированном обработчике.
ИИ Консоль кода 1С
Лайт
Для ознакомления с возможностями
- Полный набор инструментов без урезаний
- Без ввода карты
Старт
Для индивидуального использования
- До 5 конфигураций
- Встроенный агент запросов 1С
-
≈ 100 задач Подробнее про лимиты
- Техническая поддержка
Продвинутый
Популярный выборДля интенсивного использования или команд
- До 15 конфигураций
- Встроенный агент запросов 1С
-
≈ 300 задач Подробнее про лимиты
-
Свои подписки Codex, Claude и любые OpenAI-совместимые
-
Внешние обработки без Конфигуратора
- Приоритетная техническая поддержка