Java v8unpack

Альтернативная-opensource реализация распаковщика cf, epf & etc на Java.

InDev

Основные отличия:

  • распаковывает данные сразу
  • работает в несколько потоков
  • не сохраняет заголовки файлов   уже сохраняет
  • пожирает память нещадно

Документация

По проекту:
Project documentation
Java-doc api: 
API-doc 

Сборка:

git clone https://github.com/MinimaJack/com.minimajack.v8.cf.reader.git
cd com.minimajack.v8.cf.reader
mvn clean compile assembly:single

Забирать из папки ./target/

Для сборки необходимо:

  • maven 3.+
  • JDK 1.8+

Запуск:

для распаковки:

unpack.bat test.epf ./unpacked/

или

java -jar com.minimajack.v8.cf.reader-0.0.1-SNAPSHOT-jar-with-dependencies.jar %file% %path%

для упаковки

pack.bat ./unpacked/ test.epf

java -jar com.minimajack.v8.cf.reader-0.0.1-SNAPSHOT-jar-with-dependencies.jar  %path% %file%

P.S. В первую очередь предназначается для обучения

04.06.2026 Причесал немного код. Выделил библиотеку отдельно, демо пример отдельно.

Исходники:

Библиотеки — https://github.com/MinimaJack/com.minimajack.v8.format

Демо пример, он же распаковщик — https://github.com/MinimaJack/com.minimajack.v8.cf.reader.git

10.06.2026 Обновил файл

26.06.2026 Обновил ссылки на библиотеки

20.04.2026 Демо пример переделан на fork/join pool

26.04.2026 Демо пример переделан, добавлена возможность кеширования файлов по дате модификации которая по умолчанию влючена. Что бы отключить необходимо третьим параметром передать стратегию NONCACHE

28.04.2026 Демо пример переделан с возможностью иерархического построения проекта, без изменения именований.

63 Comments

  1. ekaruk

    Идея интересная.

    Спасибо.

    Давно искала повод покопаться в Java.

    Reply ↓
  2. minimajack

    (1) ekaruk, идея то не новая, фактическая дата создания моего проекта 7 декабря 2014…ну и awa параллельно тоже запилил (https://github.com/awk-kazmin/JV8Unpack).

    Программирование на Java — как глоток свежего воздуха.

    ps Будут вопросы, задавайте — с удовольствием отвечу.

    Reply ↓
  3. DoctorRoza

    Ну что, началось! Java начинает паломничество на святую землю Инфостарт! 🙂

    По ссылке error 404

    Reply ↓
  4. minimajack
  5. nSpirit2

    А обратно запаковывать она умеет?

    Reply ↓
  6. awa

    (2)

    ну и awa параллельно тоже запилил

    Видимо, это просто опечатка. Но на всякий случай уточню, что это не мой проект, а Василия Казьмина http://infostart.ru/profile/44963/

    Reply ↓
  7. minimajack

    (6) awa, да, просто опечатка

    (5) nSpirit2, пока нет

    Reply ↓
  8. baton_pk

    Пора открывать клуб V8Unpacker-ов ?

    Reply ↓
  9. nSpirit2

    (8) baton_pk, Лучше клуб запакеров начинайте основывать 🙂

    (7) Ясно а в планах то есть ?

    Reply ↓
  10. minimajack

    (8) baton_pk, не понял вопроса

    (9) nSpirit2,

    мне не хватило текущего функционала V8Unpack.

    да собирать обратно планирую

    Reply ↓
  11. detec

    Жаль, что интерфейс консольный. Можно было бы реализовать на javafx форму приложения.

    Reply ↓
  12. minimajack

    (11) detec, данная разработка позиционируется как библиотека, а не как самостоятельное приложение. Это позволит использовать код как угодно.

    Reply ↓
  13. ret-Phoenix

    Действительно, подобных проектов несколько штук, но вот еще ни один не дошел до уровня gcomp. Все выгружают просто «RAW», а хотелось бы получить в результате нормальные имена и разбор по каталогам. Тогда от подобных инструментов будет толк (вспоминаю fez, ADirks).

    P.S. не удивлюсь, если есть уже решение, но в public не выложено.

    Reply ↓
  14. minimajack

    (13) ret-Phoenix, (5) nSpirit2, так получается, что текущий функционал можно развивать по разному.

    1. Нормальный разбор: нормальные имена, структура папок

    2. Нормальную сборку — именно низкоуровневую, даем файлы -> получаем упакованный результат.

    3. Полную разборку в папки и сборку — подобно xml выгрузки, загрузки

    Для меня сейчас важнее 2 пункт, но хотелось бы узнать мнение других людей.

    Reply ↓
  15. nSpirit2

    (14) не знаю как другим, но по моему возможность обратно собрать обратно должна обязательно присутствовать в таком проекте иначе его функциональность не будет использоваться в полной мере… Запаковка распаковка так и до альтернативного редактора кода не далеко 🙂 В любом случае такая система решит много проблем с использованием VCS а это большой плюс 🙂

    Reply ↓
  16. baton_pk

    (14)

    2. Нормальную сборку — именно низкоуровневую, даем файлы -> получаем упакованный результат.

    ну, с этим долго возиться вряд ли придётся. тут поле уже пахано-перепахано.

    а вот разбирать всё это дело в понятный формат — вот это действительно требует основательного погружения.

    Reply ↓
  17. minimajack

    (16) baton_pk, без низкоуровневой сборки как то не функционально…ничего сложного нет, но руки не резиновые

    опять же с форматом…что считать нормальным…какой он нормальный . Возможно использовать родной 1с-кий, возможно придумать что то свое…

    Reply ↓
  18. Evil Beaver

    (16) baton_pk, ну так V8Reader же от bambr1975! Там вам и unpack и парсер-распарсер во все поля.

    http://infostart.ru/public/106310 Плюс, их совместный проект с awa — MetaRead, ссылку не помню.

    Reply ↓
  19. baton_pk

    (18) Evil Beaver,

    V8Reader же от Вики Дорохиной

    да, воистину сильнейшая разработка! всё никак повода не находится сесть и разобраться.

    ссылку не помню

    вот для того и нужен «клуб» 🙂 чтоб не бегать по разным местам

    Reply ↓
  20. minimajack

    Разделил код на библиотеку и демо-распаковщик.

    (18) Evil Beaver, жаль MetaRead не нашел, описание метаданных ускорило бы разработку

    Reply ↓
  21. eugeniezheludkov

    Извиняюсь за снобизм, но библиотека не будет полной без документации, а в репо я так её и не нашел. Нужно некое АПИ, его описание, как работать с этой библиотекой, копаться в исходниках? Если будет документация, то это будет продукт отличающийся от других анпакеров. Порог вхождения будет гораздо ниже, что увеличит количество контрибьютеров и пользователей библиотеки

    Reply ↓
  22. minimajack

    (21) eugeniezheludkov, библиотеке от роду три дня, хотя фактически даже сутки не прошли с разделения. Так что документация будет, но пока это даже не альфа.

    пока, как пример, можно смотреть на распаковщик…тем более как ее собираются использовать я не знаю. Будут вопросы задавайте.

    фактически вся логика находится в двух файлах:

    https://github.com/MinimaJack/com.minimajack.v8.cf.reader/blob/master/src/main/java/com/minimajack/v8/parser/Re­ader.java

    https://github.com/MinimaJack/com.minimajack.v8.cf.reader/blob/master/src/main/java/com/minimajack/v8/model/Con­tainerReader.java

    Логика пока такая:

    создаем рутовый контекст -> создаем рутовый контейнер -> указываем в контексте реализацию ридера и просим распарсить данные.

    все остальные файлы, лишь для удобства и скорости работы(работа в несколько потоков и прочее).

    Если будет документация, то это будет продукт отличающийся от других анпакеров

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

    Reply ↓
  23. minimajack

    Основная страница

    http://minimajack.github.io/v8Unpack4j/index.html

    Java-doc api

    http://minimajack.github.io/v8Unpack4j/apidocs/index.html

    CI — нет сервера.

    Метрики пока не нужны.

    Тестов — пока тоже нет.

    Java-doc — пока без описания, только вызовы и методы

    Reply ↓
  24. ret-Phoenix

    (0) Из приятных мелочей: найденным v8unpack разобрать УП 2 не смог — слетела разборка. Твоей утилитой разобралось.

    Reply ↓
  25. minimajack

    (24) ret-Phoenix, да…к счастью и сожалению она разбирает даже то что не должна

    Reply ↓
  26. ret-Phoenix

    (25) Например? если конфигурация убита и позволяет ее разобрать — это явный плюс )

    Reply ↓
  27. minimajack

    (26) ret-Phoenix, нет…такую конфиграцию не разберет…

    я делаю упаковку из файлов и естественно тестирую ….

    распаковал нормальную обработку -> упаковываю -> снова распаковываю уже упакованую своей обработкой

    так вот у меня все ок — все распаковывается, все на месте до байтика…

    а вот 1С упорно не желает пользоваться — видит зуб да неймет

    Reply ↓
  28. minimajack

    В общем, получилось.

    Распаковал упп -> запаковал обратно -> конфигурация открылась

    теперь о минусах…

    перепакованная версия открывается(сравнение объединение) дольше — необходимо время на изыскания…скорее всего дело в выравнивании, порядке данных и правильной сегментации

    упаковка происходит в один поток, памяти жрет меньше, есть простор для оптимизации

    выводы:

    для внешних обработок подходит

    для полноценных конфигураций пока нет

    упаковывать аналогично распаковке -> только меняется местами параметры

    распаковать: %file% %path%

    упаковать: %path% %file%

    Reply ↓
  29. minimajack

    Народ что дальше?

    1. Нормальный разбор: нормальные имена, структура папок

    2. Скорость упаковки, работы 1С с упакованным файлом?

    голосуем https://github.com/MinimaJack/com.minimajack.v8.cf.reader/issues

    Reply ↓
  30. Rustig

    (29) зачем нужны упаковщики, распаковщики? я просто консультант и ни разу с этим не сталкивался, хотел бы узнать подробности

    Reply ↓
  31. minimajack

    (30) Rustig,

    В первую очередь для системы контроля версий, статического анализа кода и т.п.

    http://infostart.ru/public/335018/

    http://infostart.ru/public/118207/

    Reply ↓
  32. minimajack

    (29)

    Ввиду «оживленного» обсуждения, решил заняться разбором метаданных — «{0,{}}».

    Инструментарий будет в отдельном проекте.

    На текущий момент реализовано чтение: строки, числа, булево, массива, списка, хешмап, UUID, перечислений, объектов(с разбором полей). На выходе получаем заполненный экземпляр класса, со всеми полями. Пока реализовано только чтение; запись будет реализована позже. Запись скорее всего будет в XML формат — ближе к 1С-кому.

    Проекты будут связанны «format.cf» — чтение файлов, «format.???» — описание классов, сериализация-десериализация.

    Скорость — пока на второй план, много времени занимает именно кодинг классов.

    Пример реализации класса — «описания» реквизита:

    Скрытый текст

    з.ы. задача кодерская-нудная, сидеть добавлять перечисления 1С, классы 1С, и сравнивать с сериализацией.

    Reply ↓
  33. baton_pk
    задача кодерская-нудная

    ох, как я тут согласен 🙂 сам пытаюсь на Ц++ классы для управляемых форм сообразить.

    Вообще, тут бы лучше подумать надо хорошей кодогенерацией. Есть тучи XML-ек, которые можно навыгружать из 1С, по ним можно построить XSD (я пробовал trang, который, кстати, на Java), а по XSD уже нагенерить классов.

    Reply ↓
  34. minimajack

    (33) baton_pk,

    В Java все попроще…рефлексия — хлоп-хлоп и готово.

    https://github.com/MinimaJack/com.minimajack.v8.bs.format — мини библиотека для разбора, в стандартной поставке чтение:

    — строк

    — чисел

    — булево

    — UUID

    — классов

    — Enum-ов

    — List-ов

    — Map-ов

    Косяков еще хватает, но потихоньку буду править

    https://github.com/MinimaJack/com.minimajack.v8.example.bs- пример для чтения рутового файла.

    @V8Class
    public class V8Root
    {
    public Integer id;
    
    public UUID guid;
    
    public AnyData hash;
    
    }

    Показать

    Reply ↓
  35. baton_pk

    (34)

    так рефлексия — это когда классы уже есть. а я говорю о том, чтобы эти классы хитрой обработиной создать из XSD-шек.

    Reply ↓
  36. minimajack

    (35) baton_pk,

    «Есть тучи XML-ек, которые можно навыгружать из 1С» — типа выгрузка конфигурации в XML?

    Reply ↓
  37. baton_pk

    (36) она самая.

    Reply ↓
  38. minimajack

    (37) baton_pk, это борода.

    Формат меняется, скорость выгрузки не ахти. Что делать в таком случае с внешними обработками и отчетами?

    Я лучше потихоньку десериализую реальные классы и буду уверен, что все ок.

    Reply ↓
  39. baton_pk

    (38)

    наверное, мы друг друга не понимаем.

    я говорю вот, о чём: есть у меня выгрузка большой-большой конфы (чем больше, тем лучше). там куча файлов, к примеру, Catalog.Справочник1.xml, Catalog.Справочник2.xml, Catalog.Справочник3.xml.

    Сами непосредственно справочники меня мало волнуют, мне нужны их общие поля. Они получаются при генерации схемы. Итого в XSD я вижу, к примеру, список полей, описывающих справочник, как объект метаданных:

    Name
    Synonym
    Comment
    Hierarchical
    HierarchyType
    LimitLevelCount
    LevelCount
    FoldersOnTop
    ……
    

    Показать

    и по ним генерю класс:

    class MetaCatalog {
    
    public string Name;
    public multistring Synonym;
    public string Comment;
    …..
    }
    

    Показать

    Главное в таком подходе — все сложные типы вроде HierarchyType или SearchStringModeOnInputByString можно будет сразу увидеть и сгенерить по ним Enum.

    Сериализации тут нет, её вам всё равно пилить руками надо будет. Тут цель — быстро и относительно малой кровью разово создать всю эту тучу классов, описывающих метаданные, в которые вы потом уже будете сериализировать эти зловещие файлы со скобочками.

    Но это всё пока у меня в теории, потому как до конечного результата я тут пока не дошёл.

    Reply ↓
  40. minimajack

    (39) baton_pk, есть проще вариант:

    http://forum.infostart.ru/forum24/topic21501/message227593/#message227593

    Reply ↓
  41. minimajack

    пример использования совместно java-fx, com.minimajack.v8.bs.format и v8Unpack

    Reply ↓
  42. minimajack

    Объединил библиотеки для чтения под одним корневым проектом…старые репозитории пришлось удалить

    https://github.com/MinimaJack/com.minimajack.v8.format

    Описание:

    http://minimajack.github.io/com.minimajack.v8.format/0.0.9/

    http://minimajack.github.io/com.minimajack.v8.format/0.0.9/com.minimajack.v8.format.cf/

    http://minimajack.github.io/com.minimajack.v8.format/0.0.9/com.minimajack.v8.format.bs/

    Репозиторий:

     <repositories>
    <repository>
    <id>v8Unpack4j</id>
    <url>https:// raw.github.com/MinimaJack/com.minimajack.v8.format/mvn-repo/</url>
    </repository>
    </repositories>
    Reply ↓
  43. minimajack

    (43) v3rter, кому не надо — тот не пользуется.

    Reply ↓
  44. v3rter

    (44) Запакером? Проблема в том, что запакером могут воспользоваться те, кому не надо, и появится новый класс вредоносов.

    Вот распакер — вещь нужная, особенно если портативный и консольный.

    Reply ↓
  45. pumbaE

    (45) v3rter, найдешь на кухне нож — ВЫБРОСИ, а то мало ли чего.

    Reply ↓
  46. capitan

    Rename 0cd0af71-a8c9-45a6-aa56-18ecdd9124b2 to MGNkMGFmNzEtYThjOS00NWE2LWFhNTYtMThlY2RkOTEyNGI

    java.io.IOException: Синтаксическая ошибка в имени файла, имени папки или метке

    и далее штук пять таких же ошибок

    конфигурация состоит из одной формы

    если пробую обработку

    Rename copyinfo to Y29weWluZm8

    java.io.IOException: Синтаксическая ошибка в имени файла, имени папки или метке тома

    Что может быть не так ?

    Кроме ДНК 🙂

    Reply ↓
  47. minimajack

    (47) capitan, не может создать файл…возможно не хватает прав

    собрал, проверил

    java -jar com.minimajack.v8.cf.reader-0.0.1-SNAPSHOT-jar-with-dependencies.jar cf.cf ./сf/
    Reply ↓
  48. capitan

    Мерси.

    Так работает.

    С меня +

    В файле unpack.bat на github похоже ошибка

    @echo OFF

    Echo Start parsing

    @java -Xms1G -Xmx2G -jar com.minimajack.v8.cf.reader-0.0.1-SNAPSHOT-jar-with-dependencies.jar %1 ./unpacked/%1

    два раза %1

    Reply ↓
  49. minimajack

    (49) capitan, спасибо, исправил

    Reply ↓
  50. minimajack

    Пофиксил долгое открытие упаковоной конфигурации — надеюсь) в линуксе не тестил — но должно работать.

    «Перешел» на 8 java

    В общем все оказалось проще чем думалось — всего то надо было в алфавитном порядке(в одном регистре) записывать в фс 1С.

    бинарник в шапке обновил…

    Reply ↓
  51. Infactum

    (51)

    А оглавление контейнера у вас одним цельным блоком в начале расположено? Просто для полного соответствия формату, который генерирует сама платформа, оглавление должно состоять из блока в 512 байт в начале контейнера, а все остальные блоки (если они есть) расположены в конце.

    Можете посмотреть мою Python реализацию запаковки, там сразу не было проблемы с быстродействием перепакованных файлов.

    Reply ↓
  52. minimajack

    (52) Infactum, да 512 байт…

    entries = sorted(os.listdir(folder))

    у вас изначально сортируется список файлов — потому и не словили)

    Reply ↓
  53. Infactum

    (53)

    Ну да, и это тоже. Я изначально хотел полного совпадения файлов добиться после перепаковки, поэтому писал все с оглядкой на структуру исходного контейнера, но в итоге параметры сжатия соответствующие подобрать не удалось 🙂

    Reply ↓
  54. minimajack

    (54) Infactum,

    btw у вас сортируется правильно-регистронезависимо? Как долго упаковывается конфигурация?

    ffaac527-f33e-48bc-b09d-43245a025cd5
    FFAAC527-F33E-48BC-B09D-43245A025CD5.0
    ffaac527-f33e-48bc-b09d-43245a025cd5.1
    
    Reply ↓
  55. Infactum

    (55)

    Сортировка правильная.

    Скорость работы это очень субъективный показатель как вы понимаете. Если хотите сравнить со своей реализацией и не устанавливать питон и т.п, то возьмите просто exe’шник из вот этой темы и проверьте на вашем компьютере и вашей тестовой конфигурации.

    Reply ↓
  56. minimajack

    (56) Infactum, спасибо. Жаль у вас время работы не выводится

    Reply ↓
  57. Infactum

    (57)

    Просто тот исполняемый файл — это лишь демонстрация возможностей моего модуля, поэтому никаких «плюшек» там нет. Распаковывает/запаковывает по ключам командной строки и все.

    А субъективно что скажете? Разница есть?

    Reply ↓
  58. minimajack

    (58) Infactum, ваш не ест память, мой быстрее работает ) как то такие ощущения

    а не…в принципе время сопоставимое

    Reply ↓
  59. eugeniezheludkov
    Reply ↓
  60. minimajack

    (60) eugeniezheludkov, да нет прав на фс

    проверьте еще раз параметры запуска программы или напишите сюда

    Reply ↓
  61. serge_focus

    Для файлов epf & etc — может быть и альтернатива да и то до выхода 8.3.8..

    А с 8.3.7.1759 конфигуратор нормально сохраняет в файлы для GITa

    Reply ↓
  62. farkhod

    Отвалилось с ошибкой

    Exception in thread «main» java.lang.NullPointerException

    at com.minimajack.v8.code.impl.RelativizeProcessor.process(RelativizeProcessor.java:19)

    at com.minimajack.v8.code.impl.RelativizeProcessor.process(RelativizeProcessor.java:21)

    at com.minimajack.v8.code.impl.RelativizeProcessor.process(RelativizeProcessor.java:8)

    at com.minimajack.v8.code.impl.CodeProcessor.process(CodeProcessor.java:15)

    at com.minimajack.v8.project.Project.unpackProject(Project.java:79)

    at com.minimajack.v8.MainApp.main(MainApp.java:45)

    Reply ↓
  63. minimajack

    (63)

    read «main» java.lang.NullPointerException

    at com.minimajack.v8.code.impl.RelativizeProcessor.process(RelativizeProcessor.java:19)

    at com.minimajack.v8.code.impl.RelativizeProcessor.process(RelativizeProcessor.java:21)

    at com.minimajack.v8.code.impl.RelativizeProcessor.process(RelativizeProcessor.java:8)

    at com.minimajack.v8.code.impl.CodeProcessor.process(CodeProcessor.java:15)

    at com.minimajack.v8.project.Project.unpackProject(Project.java:79)

    at com.minimajack.v8.MainApp.main(Main

    очень похоже на некорректные параметры или отсутствие доступа к файловой системе…

    https://github.com/MinimaJack/com.minimajack.v8.cf.reader/blob/develop/dist/unpack.bat

    первый параметр конфигурация, второй параметр — путь к папке в которую надо разобрать проект

    Reply ↓

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *