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.2025 Причесал немного код. Выделил библиотеку отдельно, демо пример отдельно.
Исходники:
Библиотеки — https://github.com/MinimaJack/com.minimajack.v8.format
Демо пример, он же распаковщик — https://github.com/MinimaJack/com.minimajack.v8.cf.reader.git
10.06.2025 Обновил файл
26.06.2025 Обновил ссылки на библиотеки
20.04.2025 Демо пример переделан на fork/join pool
26.04.2025 Демо пример переделан, добавлена возможность кеширования файлов по дате модификации которая по умолчанию влючена. Что бы отключить необходимо третьим параметром передать стратегию NONCACHE
28.04.2025 Демо пример переделан с возможностью иерархического построения проекта, без изменения именований.
Идея интересная.
Спасибо.
Давно искала повод покопаться в Java.
(1) ekaruk, идея то не новая, фактическая дата создания моего проекта 7 декабря 2014…ну и awa параллельно тоже запилил (https://github.com/awk-kazmin/JV8Unpack) .
Программирование на Java — как глоток свежего воздуха.
ps Будут вопросы, задавайте — с удовольствием отвечу.
Ну что, началось! Java начинает паломничество на
святую землюИнфостарт! 🙂По ссылке error 404
(3) DoctorRoza,
https://github.com/MinimaJack/v8Unpack4j
https://github.com/awk-kazmin/JV8Unpack
мой репо:
репо awk:
А обратно запаковывать она умеет?
(2)
Видимо, это просто опечатка. Но на всякий случай уточню, что это не мой проект, а Василия Казьминаhttp://infostart.ru/profile/44963/
(6) awa, да, просто опечатка
(5) nSpirit2, пока нет
Пора открывать клуб V8Unpacker-ов ?
(8) baton_pk, Лучше клуб запакеров начинайте основывать 🙂
(7) Ясно а в планах то есть ?
(8) baton_pk, не понял вопроса
(9) nSpirit2,
мне не хватило текущего функционала V8Unpack.
да собирать обратно планирую
Жаль, что интерфейс консольный. Можно было бы реализовать на javafx форму приложения.
(11) detec, данная разработка позиционируется как библиотека, а не как самостоятельное приложение. Это позволит использовать код как угодно.
Действительно, подобных проектов несколько штук, но вот еще ни один не дошел до уровня gcomp. Все выгружают просто «RAW», а хотелось бы получить в результате нормальные имена и разбор по каталогам. Тогда от подобных инструментов будет толк (вспоминаю fez, ADirks).
P.S. не удивлюсь, если есть уже решение, но в public не выложено.
(13) ret-Phoenix, (5) nSpirit2, так получается, что текущий функционал можно развивать по разному.
1. Нормальный разбор: нормальные имена, структура папок
2. Нормальную сборку — именно низкоуровневую, даем файлы -> получаем упакованный результат.
3. Полную разборку в папки и сборку — подобно xml выгрузки, загрузки
Для меня сейчас важнее 2 пункт, но хотелось бы узнать мнение других людей.
(14) не знаю как другим, но по моему возможность обратно собрать обратно должна обязательно присутствовать в таком проекте иначе его функциональность не будет использоваться в полной мере… Запаковка распаковка так и до альтернативного редактора кода не далеко 🙂 В любом случае такая система решит много проблем с использованием VCS а это большой плюс 🙂
(14)
ну, с этим долго возиться вряд ли придётся. тут поле уже пахано-перепахано.
а вот разбирать всё это дело в понятный формат — вот это действительно требует основательного погружения.
(16) baton_pk, без низкоуровневой сборки как то не функционально…ничего сложного нет, но руки не резиновые
опять же с форматом…что считать нормальным…какой он нормальный . Возможно использовать родной 1с-кий, возможно придумать что то свое…
(16) baton_pk, ну так V8Reader же от bambr1975! Там вам и unpack и парсер-распарсер во все поля.
http://infostart.ru/public/106310 Плюс, их совместный проект с awa — MetaRead, ссылку не помню.
(18) Evil Beaver,
да, воистину сильнейшая разработка! всё никак повода не находится сесть и разобраться.
вот для того и нужен «клуб» 🙂 чтоб не бегать по разным местам
Разделил код на библиотеку и демо-распаковщик.
(18) Evil Beaver, жаль MetaRead не нашел, описание метаданных ускорило бы разработку
Извиняюсь за снобизм, но библиотека не будет полной без документации, а в репо я так её и не нашел. Нужно некое АПИ, его описание, как работать с этой библиотекой, копаться в исходниках? Если будет документация, то это будет продукт отличающийся от других анпакеров. Порог вхождения будет гораздо ниже, что увеличит количество контрибьютеров и пользователей библиотеки
(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
Логика пока такая:
создаем рутовый контекст -> создаем рутовый контейнер -> указываем в контексте реализацию ридера и просим распарсить данные.
все остальные файлы, лишь для удобства и скорости работы(работа в несколько потоков и прочее).
— основное отличие — это в первую очередь библиотека. С документацией проблемы — возможно на выходных что нибудь подготовлю.
Основная страница
http://minimajack.github.io/v8Unpack4j/index.html
http://minimajack.github.io/v8Unpack4j/apidocs/index.html
Java-doc api
CI — нет сервера.
Метрики пока не нужны.
Тестов — пока тоже нет.
Java-doc — пока без описания, только вызовы и методы
(0) Из приятных мелочей: найденным v8unpack разобрать УП 2 не смог — слетела разборка. Твоей утилитой разобралось.
(24) ret-Phoenix, да…к счастью и сожалению она разбирает даже то что не должна
(25) Например? если конфигурация убита и позволяет ее разобрать — это явный плюс )
(26) ret-Phoenix, нет…такую конфиграцию не разберет…
я делаю упаковку из файлов и естественно тестирую ….
распаковал нормальную обработку -> упаковываю -> снова распаковываю уже упакованую своей обработкой
так вот у меня все ок — все распаковывается, все на месте до байтика…
а вот 1С упорно не желает пользоваться — видит зуб да неймет
В общем, получилось.
Распаковал упп -> запаковал обратно -> конфигурация открылась
теперь о минусах…
перепакованная версия открывается(сравнение объединение) дольше — необходимо время на изыскания…скорее всего дело в выравнивании, порядке данных и правильной сегментации
упаковка происходит в один поток, памяти жрет меньше, есть простор для оптимизации
выводы:
для внешних обработок подходит
для полноценных конфигураций пока нет
упаковывать аналогично распаковке -> только меняется местами параметры
распаковать: %file% %path%
упаковать: %path% %file%
Народ что дальше?
1. Нормальный разбор: нормальные имена, структура папок
2. Скорость упаковки, работы 1С с упакованным файлом?
голосуемhttps://github.com/MinimaJack/com.minimajack.v8.cf.reader/issues
(29) зачем нужны упаковщики, распаковщики? я просто консультант и ни разу с этим не сталкивался, хотел бы узнать подробности
(30) Rustig,
http://infostart.ru/public/335018/
http://infostart.ru/public/118207/
В первую очередь для системы контроля версий, статического анализа кода и т.п.
(29)
Ввиду «оживленного» обсуждения, решил заняться разбором метаданных — «{0,{}}».
Инструментарий будет в отдельном проекте.
На текущий момент реализовано чтение: строки, числа, булево, массива, списка, хешмап, UUID, перечислений, объектов(с разбором полей). На выходе получаем заполненный экземпляр класса, со всеми полями. Пока реализовано только чтение; запись будет реализована позже. Запись скорее всего будет в XML формат — ближе к 1С-кому.
Проекты будут связанны «format.cf» — чтение файлов, «format.???» — описание классов, сериализация-десериализация.
Скорость — пока на второй план, много времени занимает именно кодинг классов.
Пример реализации класса — «описания» реквизита:
Показать
з.ы. задача кодерская-нудная, сидеть добавлять перечисления 1С, классы 1С, и сравнивать с сериализацией.
ох, как я тут согласен 🙂 сам пытаюсь на Ц++ классы для управляемых форм сообразить.
Вообще, тут бы лучше подумать надо хорошей кодогенерацией. Есть тучи XML-ек, которые можно навыгружать из 1С, по ним можно построить XSD (я пробовал trang, который, кстати, на Java), а по XSD уже нагенерить классов.
(33) baton_pk,
В Java все попроще…рефлексия — хлоп-хлоп и готово.
— строк
— чисел
— булево
— UUID
— классов
— Enum-ов
— List-ов
— Map-ов
Косяков еще хватает, но потихоньку буду править
Показать
(34)
так рефлексия — это когда классы уже есть. а я говорю о том, чтобы эти классы хитрой обработиной создать из XSD-шек.
(35) baton_pk,
«Есть тучи XML-ек, которые можно навыгружать из 1С» — типа выгрузка конфигурации в XML?
(36) она самая.
(37) baton_pk, это борода.
Формат меняется, скорость выгрузки не ахти. Что делать в таком случае с внешними обработками и отчетами?
Я лучше потихоньку десериализую реальные классы и буду уверен, что все ок.
(38)
наверное, мы друг друга не понимаем.
я говорю вот, о чём: есть у меня выгрузка большой-большой конфы (чем больше, тем лучше). там куча файлов, к примеру, Catalog.Справочник1.xml, Catalog.Справочник2.xml, Catalog.Справочник3.xml.
Сами непосредственно справочники меня мало волнуют, мне нужны их общие поля. Они получаются при генерации схемы. Итого в XSD я вижу, к примеру, список полей, описывающих справочник, как объект метаданных:
Показать
и по ним генерю класс:
Показать
Главное в таком подходе — все сложные типы вроде HierarchyType или SearchStringModeOnInputByString можно будет сразу увидеть и сгенерить по ним Enum.
Сериализации тут нет, её вам всё равно пилить руками надо будет. Тут цель — быстро и относительно малой кровью разово создать всю эту тучу классов, описывающих метаданные, в которые вы потом уже будете сериализировать эти зловещие файлы со скобочками.
Но это всё пока у меня в теории, потому как до конечного результата я тут пока не дошёл.
(39) baton_pk, есть проще вариант:
http://forum.infostart.ru/forum24/topic21501/message227593/#message227593
пример использования совместно java-fx, com.minimajack.v8.bs.format и v8Unpack
Объединил библиотеки для чтения под одним корневым проектом…старые репозитории пришлось удалить
https://github.com/MinimaJack/com.minimajack.v8.format
http://minimajack.github.io/com.minimajack.v8.format/0.0.9/
Описание:
Репозиторий:
(43) v3rter, кому не надо — тот не пользуется.
(44) Запакером? Проблема в том, что запакером могут воспользоваться те, кому не надо, и появится новый класс вредоносов.
Вот распакер — вещь нужная, особенно если портативный и консольный.
(45) v3rter, найдешь на кухне нож — ВЫБРОСИ, а то мало ли чего.
Rename 0cd0af71-a8c9-45a6-aa56-18ecdd9124b2 to MGNkMGFmNzEtYThjOS00NWE2LWFhNTYtMThlY2RkOTEyNGI
java.io.IOException: Синтаксическая ошибка в имени файла, имени папки или метке
и далее штук пять таких же ошибок
конфигурация состоит из одной формы
если пробую обработку
Rename copyinfo to Y29weWluZm8
java.io.IOException: Синтаксическая ошибка в имени файла, имени папки или метке тома
Что может быть не так ?
Кроме ДНК 🙂
(47) 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
(49) capitan, спасибо, исправил
Пофиксил долгое открытие упаковоной конфигурации — надеюсь) в линуксе не тестил — но должно работать.
«Перешел» на 8 java
В общем все оказалось проще чем думалось — всего то надо было в алфавитном порядке(в одном регистре) записывать в фс 1С.
бинарник в шапке обновил…
(51)
реализацию запаковки , там сразу не было проблемы с быстродействием перепакованных файлов.
А оглавление контейнера у вас одним цельным блоком в начале расположено? Просто для полного соответствия формату, который генерирует сама платформа, оглавление должно состоять из блока в 512 байт в начале контейнера, а все остальные блоки (если они есть) расположены в конце.
Можете посмотреть мою Python
(52) Infactum, да 512 байт…
у вас изначально сортируется список файлов — потому и не словили)
(53)
Ну да, и это тоже. Я изначально хотел полного совпадения файлов добиться после перепаковки, поэтому писал все с оглядкой на структуру исходного контейнера, но в итоге параметры сжатия соответствующие подобрать не удалось 🙂
(54) Infactum,
btw у вас сортируется правильно-регистронезависимо? Как долго упаковывается конфигурация?
(55)
темы и проверьте на вашем компьютере и вашей тестовой конфигурации.
Сортировка правильная.
Скорость работы это очень субъективный показатель как вы понимаете. Если хотите сравнить со своей реализацией и не устанавливать питон и т.п, то возьмите просто exe’шник из вот этой
(56) Infactum, спасибо. Жаль у вас время работы не выводится
(57)
Просто тот исполняемый файл — это лишь демонстрация возможностей моего модуля, поэтому никаких «плюшек» там нет. Распаковывает/запаковывает по ключам командной строки и все.
А субъективно что скажете? Разница есть?
(58) Infactum, ваш не ест память, мой быстрее работает ) как то такие ощущения
а не…в принципе время сопоставимое
(60) eugeniezheludkov, да нет прав на фс
проверьте еще раз параметры запуска программы или напишите сюда
Для файлов epf & etc — может быть и альтернатива да и то до выхода 8.3.8..
А с 8.3.7.1759 конфигуратор нормально сохраняет в файлы для GITa
Отвалилось с ошибкой
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)
(63)
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
первый параметр конфигурация, второй параметр — путь к папке в которую надо разобрать проект