В практике работы с архивными данными электронного документооборота (ЭДО) (для этой задачи есть готовая обработка для автоматического ведения электронного архива документов ЭДО), особенно при обращении к отчетности прошлых лет (например, ПФР за 2013 год), часто встречаются специфические форматы упаковки. Одной из таких структур является транспортный контейнер системы «Такском-Спринтер», представляющий собой ZIP-архив, внутри которого находятся файлы bin и packageDescription.xml. На первый взгляд может показаться, что данные зашифрованы или повреждены, однако зачастую это просто многослойная упаковка. Разберем по шагам, как извлечь исходные XML-файлы из таких «недоразумений».
Прежде чем приступать к распаковке, проанализируем содержимое контейнера. Стандартный пакет ЭДО того периода состоит из двух ключевых компонентов:
.bin использовалось для защиты от антивирусов.Рассмотрим ситуацию, когда при открытии внешнего ZIP-архива мы видим файл с расширением .bin, размер которого практически совпадает с размером архива. Это первый признак того, что перед нами не зашифрованный объект, а еще один сжатый контейнер.
Выясним причину, по которой обычная распаковка не дает результата сразу. В отчетности прошлых лет часто применялось «двойное» архивирование: сначала сжимался сам документ для экономии трафика, а затем он помещался в общий транспортный конверт вместе с описанием. Для ручного извлечения выполним следующие действия:
.bin..zip. Например, файл 4d884cb3...bin превратится в 4d884cb3...zip..bin..xml — для последующего прикрепления к документам учета в 1С поможет обработка массовой загрузки и прикрепления файлов.Важный нюанс: Проверить, является ли файл архивом, можно по его заголовку (сигнатуре). Если открыть файл в любом HEX-редакторе или продвинутом текстовом редакторе, первые два байта должны быть PK (в честь Филиппа Катца, создателя формата ZIP). Если вы видите эти символы, значит, перед вами архив, который можно смело распаковывать.
Для более быстрого анализа структуры вложенности удобно использовать FAR Manager. Этот инструмент позволяет «входить» внутрь файлов. Рассмотрим алгоритм работы:
Поставим указатель на файл (даже если у него расширение .bin) и нажмем сочетание клавиш Ctrl + PgDn. Если это архив, FAR откроет его как папку. Внутри мы увидим содержимое. Снова выберем файл внутри и нажмем Ctrl + PgDn. Таким образом, мы можем «провалиться» через все уровни вложенности до самого XML-файла, после чего просто скопируем его (клавиша F5) в нужную директорию.
Если подобных файлов много, ручная обработка становится неэффективной — для автоматизации импорта полученных данных в систему есть загрузка XML-документов из сервисов ЭДО в 1С. Проанализируем, как программно реализовать распаковку в 1С. Для этого мы будем использовать объекты ЧтениеZipФайла и ЧтениеXML.
Рассмотрим пример кода, который открывает транспортный контейнер, читает манифест для определения имени файла и извлекает содержимое:
// 1. Распаковываем внешний контейнер
ПутьКАрхиву = "C:\Temp\report.zip";
ПутьРаспаковки = "C:\Temp\Unpacked\";
Архив = Новый ЧтениеZipФайла(ПутьКАрхиву);
Архив.ИзвлечьВсе(ПутьРаспаковки, РежимВосстановленияПутейZipФайла.НеВосстанавливать);
Архив.Закрыть();
// 2. Читаем манифест, чтобы понять, что внутри
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ПутьРаспаковки + "packageDescription.xml");
ИмяВнутреннегоФайла = "";
Пока ЧтениеXML.Прочитать() Цикл
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "DocumentName" Тогда
ИмяВнутреннегоФайла = ЧтениеXML.ПрочитатьСтроку();
КонецЕсли;
КонецЦикла;
ЧтениеXML.Закрыть();
// 3. Обрабатываем BIN как вложенный архив
// В 1С объект ЧтениеZipФайла часто может открыть файл даже с расширением .bin,
// если внутри структура ZIP. Если нет — временно переименовываем.
ВнутреннийBin = ПутьРаспаковки + "content.bin"; // Имя из архива
ВременныйZip = ПутьРаспаковки + "temp_content.zip";
КопироватьФайл(ВнутреннийBin, ВременныйZip);
Попытка
ВложенныйАрхив = Новый ЧтениеZipФайла(ВременныйZip);
ВложенныйАрхив.ИзвлечьВсе(ПутьРаспаковки + "Final\", РежимВосстановленияПутейZipФайла.НеВосстанавливать);
ВложенныйАрхив.Закрыть();
Сообщить("Файлы успешно извлечены!");
Исключение
Сообщить("Файл не является архивом, возможно, это прямой XML");
КонецПопытки;
Проанализируем ситуацию, если после распаковки файл все равно не читается. В системах ЭДО за 2013 год (особенно ПФР) данные часто передавались в зашифрованном виде. Если вы видите расширения .enc, .p7z или .sgn, значит, файл защищен электронной подписью или зашифрован.
Однако, если файл получен из архива программы «Такском-Спринтер» через функцию «Экспорт», он, скорее всего, уже расшифрован. В этом случае сохраняется только транспортная «обертка» (ZIP + XML манифест), которую мы научились снимать выше. Если же файл остается бинарным и не начинается с PK, проверьте начало файла на наличие заголовков 1F 8B — это признак формата GZIP. В таком случае для распаковки лучше использовать библиотеку 7-Zip или специализированные скрипты обработки потоков GZipStream.
Подведем итог: для успешного получения XML из старых отчетов Такском необходимо проверить файл на «двойную матрешку» из ZIP-архивов. Использование правильных инструментов анализа заголовков файлов позволяет избежать путаницы с расширениями .bin и быстро восстановить нужные данные для учета или проверки.