Файлы и обмен данными в 1С

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С

Лайт

Бесплатно
≈ 0,1 млн токенов на 2 дн.

Для ознакомления с возможностями

  • Все функции бесплатно на 2 дня +2 дня за подписку на Telegram или Max
  • Полный набор инструментов без урезаний
  • Без ввода карты

Старт

1990 руб. в месяц
≈ 10 млн токенов

Для индивидуального использования

Продвинутый

Популярный выбор
3990 руб. в месяц
≈ 25 млн токенов

Для интенсивного использования или команд

  • До 15 конфигураций
  • Встроенный агент запросов 1С
  • Свои подписки Codex, Claude и любые OpenAI-совместимые
  • Внешние обработки без Конфигуратора
  • Приоритетная техническая поддержка