К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как распаковать ZIP-файл в 1С

Как распаковать ZIP-архив в 1С: работа с объектом ЧтениеZipФайла, распаковка вложений из почты и обменов, обработка ошибок, проверка результата и типовые ошибки.

ZIP-архивы в 1С встречаются постоянно: выгрузки из банков и ЭДО, вложения электронной почты, пакеты обмена данными, файлы обновлений, архивы отчётности. Во всех этих случаях файл сначала нужно распаковать — либо вручную средствами операционной системы, либо программно из встроенного языка 1С.

Платформа 1С:Предприятие имеет штатный механизм работы с ZIP: объекты ЧтениеZipФайла и ЗаписьZipФайла. Они доступны на сервере и на толстом клиенте и не требуют внешних компонент. Для большинства задач — извлечь вложение, обработать пакет обмена, разобрать выгрузку — этого достаточно.

Ниже разобраны оба подхода: ручная распаковка, когда архив просто нужно открыть, и программная — когда распаковка является частью обработки или регламентного задания. Отдельно рассмотрены проверка результата, типичные ошибки и ограничения штатного механизма.

Когда достаточно ручной распаковки

Если задача разовая — например, банк прислал выгрузку в архиве или коллега передал пакет документов — программировать ничего не нужно. Архив распаковывается средствами операционной системы, а извлечённые файлы загружаются в 1С стандартным образом: через «Файл → Открыть», перетаскивание или кнопку загрузки в конкретной форме.

В Windows достаточно щёлкнуть по архиву правой кнопкой мыши и выбрать «Извлечь всё». Альтернатива — бесплатный архиватор 7-Zip, который корректно работает с русскими именами файлов и нестандартными архивами. После распаковки проверьте, что файлы открываются и имеют осмысленный размер, прежде чем загружать их в базу.

Программная распаковка: объект ЧтениеZipФайла

Штатный способ извлечь архив из кода 1С — объект ЧтениеZipФайла. Он открывает архив, предоставляет коллекцию элементов (файлов внутри) и позволяет извлекать их по одному или все сразу. Объект работает на сервере, что делает его пригодным для регламентных заданий и серверных обработок.

Минимальный сценарий выглядит так: создать объект с указанием пути к архиву, перебрать элементы, извлечь их в каталог назначения, закрыть чтение. Важно освобождать объект после работы, иначе файл архива останется заблокированным.

1c
ЧтениеZip = Новый ЧтениеZipФайла("C:\Обмен\packet.zip");
КаталогНазначения = "C:\Обмен\Распаковано\";
СоздатьКаталог(КаталогНазначения);
Для Каждого Элемент Из ЧтениеZip.Элементы Цикл
    ЧтениеZip.Извлечь(Элемент, КаталогНазначения, РежимВосстановленияПутейФайловZIP.Восстанавливать);
КонецЦикла;
ЧтениеZip.Закрыть();

Метод ИзвлечьВсе делает то же самое одной командой, но без возможности фильтровать файлы. Если в архиве нужен только конкретный файл (например, XML с данными, а служебные файлы не нужны), перебор элементов с проверкой имени — правильный вариант.

Порядок программной распаковки
  1. 1
    Создайте объект ЧтениеZipФайла с полным путём к архиву
  2. 2
    Убедитесь, что каталог назначения существует, при необходимости создайте его
  3. 3
    Переберите элементы архива и отберите нужные по имени или расширению
  4. 4
    Извлеките файлы методом Извлечь с восстановлением путей
  5. 5
    Вызовите Закрыть() и проверьте наличие извлечённых файлов

Тонкости: пароль, кодировка имён и структура каталогов

Архивы с паролем

Если архив защищён паролем (так делают банки и некоторые операторы ЭДО), пароль передаётся вторым параметром конструктора: Новый ЧтениеZipФайла(ИмяФайла, Пароль). Неверный пароль приведёт к исключению при чтении, поэтому вызов стоит оборачивать в попытку-исключение с понятным сообщением пользователю.

Имена файлов с кириллицей

Архивы, созданные нестандартными упаковщиками, иногда содержат имена файлов в неправильной кодировке — вместо русских букв отображаются «кракозябры». Если такое происходит, проще извлечь файлы и переименовать их по логике обработки (например, по порядковому номеру), либо попросить отправителя перепаковать архив штатными средствами Windows или 7-Zip.

Восстановление структуры каталогов

Параметр РежимВосстановленияПутейФайловZIP определяет, сохранятся ли вложенные папки из архива. Значение «Восстанавливать» воссоздаёт структуру каталогов, «НеВосстанавливать» складывает все файлы в один каталог. Для пакетов обмена, где путь является частью логики, выбирайте восстановление; для плоского набора однотипных файлов удобнее без путей.

Типовой сценарий: распаковка вложения из почты или обмена

На практике архив редко лежит в известном месте — чаще он приходит как вложение письма, двоичные данные из хранилища значений или файл из каталога обмена. Общий шаблон одинаков: сначала получить файл на диске сервера (или во временном каталоге), затем работать с ним через ЧтениеZipФайла.

Для вложений почты объект ИнтернетПочтовоеВложение содержит двоичные данные — их нужно записать во временный файл через ПолучитьИмяВременногоФайла("zip") и дальше открыть как обычный архив. То же справедливо для двоичных данных из хранилища значений в базе: Данные.Записать(ИмяВременногоФайла), затем чтение.

После обработки временные файлы желательно удалять явно. На сервере 1С временные каталоги накапливаются, и при интенсивных обменах это приводит к переполнению диска — одна из самых частых эксплуатационных проблем.

В регламентных заданиях оборачивайте распаковку в попытку-исключение и пишите результат в журнал регистрации. Архивы от внешних систем регулярно приходят битыми или с неожиданной структурой — без логирования такие сбои обнаруживаются только по жалобам пользователей.
ПЗ
Практическое замечание

Проверка результата распаковки

Успешное выполнение кода ещё не гарантирует полезный результат. После извлечения стоит проверить: существуют ли ожидаемые файлы, имеют ли они ненулевой размер, соответствует ли их количество ожиданиям. Для последующей обработки (например, загрузки XML) достаточно проверки существования конкретного файла через Файл.Существует().

Если распаковка является частью обмена, полезно сравнивать число элементов в архиве (ЧтениеZip.Элементы.Количество()) с числом фактически обработанных файлов. Расхождение — признак того, что часть данных потерялась на фильтрации или из-за ошибки в именах.

Контрольные точки

Как проверить результат

Наличие файлов в каталоге назначения
Норма

Все ожидаемые файлы на месте, размер больше нуля

Тревожный признак

Каталог пуст или файлы нулевого размера

Читаемость имён файлов
Норма

Имена совпадают с ожидаемыми, кириллица корректна

Тревожный признак

Нечитаемые символы вместо русских букв

Журнал регистрации
Норма

Нет ошибок по обработке распаковки

Тревожный признак

Исключения при чтении архива или извлечении

Ограничения и альтернативы

Штатный ЧтениеZipФайла имеет ограничения: он работает только с форматом ZIP (не RAR, не 7z), не поддерживает многотомные архивы и некоторые экзотические методы сжатия. Если контрагент присылает RAR или 7z, штатными средствами его не открыть — потребуется внешний архиватор с вызовом через командную строку (ЗапуститьПриложение) или просьба к отправителю сменить формат.

Для вызова 7-Zip из кода используется его консольная версия с параметрами распаковки. Это рабочее, но более хрупкое решение: требуется установленный архиватор на сервере и аккуратная обработка кодов возврата. Применять его стоит только когда штатный ZIP-объект заведомо не справляется.

Сравнение вариантов

ЧтениеZipФайла (штатный объект)

Подходит для всех ZIP-архивов, работает на сервере без установки дополнительного ПО. Ограничение — только формат ZIP.

Ручная распаковка (Windows, 7-Zip)

Подходит для разовых задач без программирования. Не масштабируется на регулярные обмены.

Внешний архиватор через командную строку

Поддерживает RAR, 7z и другие форматы. Требует установки на сервере и обработки кодов возврата.

Типичные ошибки и как их избежать

Типичные ошибки
01
Не вызван метод Закрыть() — файл архива остаётся заблокированным, повторное обращение или удаление вызывает ошибку
02
Извлечение в каталог с рабочими данными — существующие файлы перезаписываются без предупреждения
03
Отсутствие попытки-исключения — один битый архив останавливает весь регламентный обмен
04
Игнорирование режима восстановления путей — файлы из вложенных папок наслаиваются друг на друга в один каталог
05
Накопление временных файлов — без удаления временные каталоги сервера переполняются

Отдельная группа проблем — права доступа. Регламентное задание выполняется под учётной записью службы сервера 1С, и у неё может не быть прав на каталог, куда пользователь вручную положил архив. Симптом — «файл не найден» или «отказано в доступе» при том, что файл на месте. Решение — использовать каталоги с явно выданными правами для служебной учётной записи.

Частые вопросы

Можно ли распаковать RAR-архив штатными средствами 1С?

Нет. Объект ЧтениеZipФайла работает только с форматом ZIP. Для RAR и 7z потребуется внешний архиватор, вызываемый через командную строку, либо договорённость с отправителем о смене формата на ZIP.

Как распаковать архив, защищённый паролем?

Передайте пароль вторым параметром конструктора: Новый ЧтениеZipФайла(ИмяФайла, Пароль). При неверном пароле возникнет исключение, поэтому вызов следует оборачивать в попытку-исключение с понятным сообщением.

Почему после распаковки русские имена файлов отображаются нечитаемо?

Архив создан упаковщиком, который сохранил имена в кодировке, отличной от ожидаемой. Варианты решения: извлечь файлы и переименовать программно по своей логике либо попросить отправителя перепаковать архив штатными средствами Windows или 7-Zip.

Как извлечь из архива только один нужный файл?

Переберите коллекцию ЧтениеZip.Элементы, сравните имя или расширение каждого элемента с нужным и вызовите Извлечь только для подходящих. Метод ИзвлечьВсе для такой задачи не подходит.

Работает ли ЧтениеZipФайла на тонком клиенте?

Объект доступен на сервере и на толстом клиенте. На тонком клиенте напрямую он недоступен — распаковку следует выполнять в серверной процедуре, передавая файл через временное хранилище.

Итог

Что важно запомнить

Штатный способ распаковки ZIP в 1С — объект ЧтениеZipФайла с методами Извлечь и ИзвлечьВсе. Всегда закрывайте объект, оборачивайте работу в попытку-исключение, извлекайте во временный каталог и проверяйте результат. Для форматов RAR и 7z штатного механизма нет — нужен внешний архиватор.