Зачем?!
Да, да, я знаю что уже есть куча аналогов на разных языках (ссылки внизу). И предвосхищая вопрос, который обязательно появится в комментариях, отвечу сразу, что сподвигло меня на эти свершения.
В ходе оптимизаций и автоматизаций процесса разработки и тестирования в нашей команде, сошлись (среди прочих) следующие задачи:
1. Требовалось автоматизировать сборку версий расширений под разные конфигурации/версии из одного хранилища, чтобы не плодить ветки разработки, требующие синхронизации. В общем виде, весьма упрощенно, примерно такой процесс:
1) Разборка cfe; 2) изменение нескольких файлов; 3) сборка нового cfe.
Первый и последний этапы вполне можно было бы делать и с помощью v8unpack (так и было сделано первоначально). Алгоритм по изменению - на 1С. Запуск v8unpack из 1С-кода. Всё прекрасно работает. Но как-то... некрасивенько, на мой взгляд.
2. Еще одна задача - получение расширения из Хранилища в пользовательском режиме, для обновления тестовых баз из интерфейса, без привлечения программистов. При реализации пришлось разбираться с форматом данных в хранилище и 1С-ными методами работы с двоичными данными извлекать из полученных данных файлы конфигурации. И уже из них собирать cfe-файл (опять через v8unpack). В процессе "ковыряния в байтах", подумал что и сборку cfe-файла вполне можно сделать силами 1С.
В итоге, написал с нуля сначала распаковку, руководствуясь описанием формата от Андрея Овсянкина и собственными исследованиями, а затем и сборку. Терминология в коде "блок", "документ", "заголовок" и т.д. - из описания формата.
Inflate/Deflate реализованы методом, предложенным SerVer1C, с использованием объектов для работы с Zip-файлами.
Осмелюсь предположить, что результат моих трудов может быть интересен десятку-другому коллег.
Как называется?
По аналогии с референсной программой, несколько сместив акцент на запаковку, решил окрестить свою разработку "YellowPacker". Ни у кого нет патента на это название? Вот и хорошо.
Что может?
Извлекает файлы из конфигурации/расширения/обработки/отчета (cf, cfe, epf, erf) в указанный каталог:
- в v8unpack стиле (на каждый файл конфигурации создается пара файлов .header + .data) - режим "Без распаковки (v8unpack style)" - аналог ключа "-U[NPACK]";
- в сыром виде - режим "Без распаковки" (файлы конфигурации записываются без доп.расширений, как есть; их атрибуты - в свойствах файла) - нет ключа-аналога;
- с Inflate-ом и распаковкой вложенных контейнеров - режим "С распаковкой" - аналог ключа "-P[ARSE]".
Собирает из файлов в каталоге конфигурацию/расширение/обработку/отчет:
- из файлов в v8unpack стиле - аналог ключа "-PA[CK]";
- из файлов в сыром виде - нет ключа-аналога;
- из файлов распакованных контейнеров - аналог ключа "-B[UILD]".
При выполнении сборки все параметры и версия контейнера определяются автоматически по составу и содержимому файлов в исходном каталоге.
Работает с конфигурациями как в "старом" (до 8.3.16, с 32-битной адресацией), так и в "новом" (с 8.3.16, с 64-битной адресацией) форматах.
Может работать в клиентском или серверном контексте, по выбору. Кроссплатформенно.
Работает на платформе 1С:Предприятие начиная с версии 8.3.10. Протестировано на 8.3.16, 8.3.18, 8.3.19. Конфигурация значения не имеет.
Результат сравнения исходной и пересобранной конфигурации расширения
Чего не умеет?
Из функций, присущих v8unpack, не реализован следующий функционал:
- нет отдельно Inflate/Deflate извлеченных файлов из каталога - ключи "-I[NFLATE]" и "-D[EFLATE]"
- нет вывода списка файлов - ключ "-LISTFILES|-LF"
нет работы по списку файлов - ключ "-L[IST]"(UPD 28.08.22 - теперь есть распаковка по списку)
А скорость?
Когда я вопрошал "а есть ли готовое решение на 1С-языке?", коллеги в комментариях высказывали сомнение что на 1С может работать с приемлемой скоростью. К моему удивлению, оказалось ничуть не медленнее, чем работает v8unpack. На самом деле, даже чуточку быстрее. Возможно это просто разброс или погрешность в замерах. Проверял на конфигурации "Управление холдингом" (660Мб) в режимах "Без распаковки (v8unpack style)" и "С распаковкой".
Узким местом являются дисковые операции - они и определяют время работы. По замеру производительности в Конфигураторе хорошо видно, что запись на диск занимает 80% всего времени. Разборку можно ускорить примерно вдвое (по отношению к v8unpack-style), если не записывать файлы атрибутов (.header) - это режим "Без распаковки" в моей обработке.
При извлечении файлов в режиме "С распаковкой" (с Inflate-ом) больше всего времени занимает ЧтениеZip.Извлечь() с записью файла на диск.
Отмечу, что особо оптимизацией скорости не занимался. Не исключаю, что-то можно еще что-то отыграть. Файлы расширения обрабатывает достаточно быстро - этого для моих текущих задач вполне хватает. Сборка/разборка больших конфигураций является скорее "побочным" продуктом и пока не используется.
Перспективы?
В планах - портировать на OScript в виде библиотеки. Надеюсь что нужные методы поддерживаются движком.
Ссылки есть?
По ходу поисков готового решения собрал ссылки на публикации и инструменты схожей тематики:
Описание формата файлов конфигурации (CF, EPF, ERF) - Андрей Овсянкин (Evil Beaver)
Уточнение по формату 8.3.16 - Сергей Рудаков (fishca)
V8Unpack 2.0 - brix8x (github)
В8АнПак - onepack - Новый распаковщик конфигураций - SerVer1C
Сжатие/Распаковка данных по алгоритму Deflate встроенными (!) средствами платформы 1С - SerVer1C
Python V8Unpack от Егор Иванов (Infactum)
Уменьшаем трафик: HTTP запрос со сжатием GZIP средствами 1С. На примере выгрузки файлов на Яндекс-диск - Дионисий Милославский (uno-c)
saby v8unpack - Михаил Разговоров (Businka76)
Распаковка CF на Lua - Борис Илов (ilov_boris)
Компонент для чтения CF-формата. Описание CF-формата - Сергей Карташев (Elisy)
Архиваторный плагин Total Commander для работы с файлами cf, epf, erf, cfu, cfe, hbk как с архивами - Валерий Агеев (awa)
Быстрая распаковка CF - Magister
V8Reader (с расширенным анализом форм) Upd. - Андрей Д. (bambr1975)
Распаковщик / упаковщик файлов - ZhokhovM
Плагин TotalCommander-а просмотра файлов 1C v8 - Михаил Усков (MMF)
[x1c.ru] 1CDBin: Работа с файлами *.1CD на низком уровне средствами языка 1С от Николай Гусев (GusevNA)
DT:Менеджер 8.1 (Распаковка/упаковка *.DT файлов. Быстрый экспорт CF) - Сергей Боровик (BorovikSV)
Работа с хранилищем конфигурации из режима 1С: Предприятие минуя конфигуратор - MaxxG
Хотите извращений? Их есть у меня! - прототип реализации распаковки на 1С от Валерия Агеева
А еще что-нибудь интересненькое?
Другие публикации:
Автономный сервер. Утилита управления
Автономный сервер. Новый вариант сервера
GitSync 3.0. Шпаргалка по использованию
Массовое изменение режима поддержки объектов конфигурации
Загрузка-выгрузка файлов по RDP с докачкой
UPD 23.08.22
Файл в публикации обновлен. Устранена ошибка "Тип контейнера для сборки не определен" при сборке вложенных контейнеров.
UPD 28.08.22
Файл в публикации обновлен. Устранены недоработки и найденные ошибки. Добавлено извлечение файлов по списку.
UPD 03.09.22
Файл в публикации обновлен. Доработан пересчет хеш-сумм файлов расширений при сборке.