v8unpack-cf
Распаковка и сборка бинарных файлов 1С (CF/CFE/EPF) через Python-утилиту v8unpack. Используй когда нужно распаковать конфигурацию, расширение или обработку в исходники, или собрать обратно.
Install
npx skills add https://github.com/Desko77/claude-code-skills-1c/tree/main/skills/v8unpack-cf
claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install desko77-claude-code-skills-1c@llmmart
git clone https://github.com/Desko77/claude-code-skills-1c.git
The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole desko77/claude-code-skills-1c collection as a plugin from our marketplace. Git is the plain clone.
Skill manifest
v8unpack-cf - распаковка и сборка бинарных файлов 1С
Утилита saby v8unpack (Python) распаковывает CF/CFE/EPF файлы 1С в человекочитаемые исходники (JSON + BSL) с деревом метаданных - без платформы 1С.
Установка: pip install v8unpack (или dev-install из репозитория).
Команды
Распаковка (-E)
python -m v8unpack -E "<файл.cf>" "<папка_исходников>" --temp "<папка_temp>"
| Параметр | Описание |
|---|---|
<файл.cf> |
Путь к CF, CFE или EPF файлу |
<папка_исходников> |
Куда распаковать (создается автоматически) |
--temp <путь> |
Папка для промежуточных данных (не удаляется - для отладки) |
--processes N |
Количество потоков (по умолчанию cpu_count - 2) |
--descent XYYZZZ |
Режим версионирования расширений (суффикс версии конфигурации) |
--auto_include |
Динамическое оглавление из папки, а не из заголовка |
--prefix STR |
Префикс имен метаданных 1-го уровня |
Сборка (-B)
python -m v8unpack -B "<папка_исходников>" "<файл.cf>"
| Параметр | Описание |
|---|---|
<папка_исходников> |
Папка с распакованными исходниками |
<файл.cf> |
Путь к выходному CF/CFE/EPF файлу |
--index <path> |
JSON-файл оглавления (маппинг файлов по папкам) |
--version XYYZZ |
Версия режима совместимости (для расширений), напр. 80306 = 8.3.6 |
--descent XYYZZZ |
Суффикс версии конфигурации |
Индексация (-I)
python -m v8unpack -I "<папка_исходников>" --index index.json --core core
Генерирует/обновляет index.json - файл оглавления для раскладки исходников по подпапкам.
Пакетные операции (-EA, -BA, -IA)
python -m v8unpack -EA products.json # распаковать все продукты
python -m v8unpack -BA products.json # собрать все продукты
python -m v8unpack -BA products.json --index KEY # собрать конкретный продукт
Файл products.json описывает несколько продуктов с индивидуальными параметрами сборки.
Python API
import v8unpack
v8unpack.extract('d:/sample.cf', 'd:/src')
v8unpack.extract('d:/sample.cf', 'd:/src', temp_dir='d:/temp',
options={'descent': 4100200, 'auto_include': True})
v8unpack.build('d:/src', 'd:/repacked.cf')
v8unpack.build('d:/src', 'd:/repacked.cf', index='index.json',
options={'descent': 4100200, 'version': '80306'})
Примеры использования
Распаковать конфигурацию
python -m v8unpack -E "<project>/1Cv8.cf" "<project>/src" --temp "<project>/temp"
Собрать обратно
python -m v8unpack -B "<project>/src" "<project>/1Cv8_new.cf"
Распаковать внешнюю обработку
python -m v8unpack -E "МояОбработка.epf" "src_epf"
Распаковать расширение
python -m v8unpack -E "МоеРасширение.cfe" "src_cfe" --descent 3000112
Собрать расширение
python -m v8unpack -B "src_cfe" "bin/ext.cfe" --index cmd/index.json --descent 3000112 --version 80316
Совместимость версий
Версия утилиты записывается в Configuration.json ("v8unpack": "1.2.6"). При сборке проверяется совпадение major.minor. Если версии не совпадают:
- Собрать старой версией
- Обновить утилиту
- Распаковать новой версией
- Закоммитить
Круговая сборка: проверяй, а не верь на слово
Про версию 1.2.6 встречается утверждение, что при сборке (-B) она пишет в заголовок контейнера
размер блока 0x54 вместо 0x200, из-за чего результат приходится патчить.
На 1.2.9 это не воспроизводится (проверено 14.08.2026 на реальной .epf 1.8 МБ): распаковка и
обратная сборка проходят без ошибок, в заголовке и исходного, и пересобранного файла
page_size = 0x200. Размер файлов при этом отличается - это нормально и само по себе о поломке не
говорит.
Отсюда правило: перед тем как городить патч заголовка, сделай круговую проверку на своей версии.
python -m v8unpack -E исходный.epf ./src
python -m v8unpack -B ./src пересобранный.epf
python -c "import struct;print([hex(struct.unpack('<IIII', open(p,'rb').read(16))[1]) for p in ('исходный.epf','пересобранный.epf')])"
Оба значения 0x200 - заголовок в порядке. Дальше проверяется главное: пересобранный файл должен
открываться платформой и содержать те же модули.
Промежуточные стадии (--temp)
| Стадия | Описание |
|---|---|
decode_stage_0/ |
Извлечение из контейнера 1С |
decode_stage_1/ |
Декомпрессия (zlib), скобкофайлы |
decode_stage_3/ |
Разбор метаданных → дерево |
| Папка назначения | Организация кода (include, элементы форм) |
Ограничения
- Свойства объектов и разметка форм хранятся в
header/rawкак сырые массивы - Файлы > 1 МБ (макеты, HTML) хранятся как
.binбез декодирования - Зашифрованные модули сохраняются в бинарном виде
- При
--auto_includeвложенные объекты сортируются по алфавиту
Files (claude-code-skills-1c)
-
evals
-
evals.json 2.8 KB
{ "skill_name": "v8unpack-cf", "evals": [ { "id": 1, "prompt": "Распакуй конфигурацию D:/Projects/MyApp/1Cv8.cf в исходники. Временные файлы помести в D:/Projects/MyApp/temp/.", "expected_output": "Команда v8unpack вызвана с флагом -E, путём к CF-файлу и папке назначения, параметром --temp для временных файлов.", "expectations": [ "Команда python -m v8unpack вызвана с флагом -E (распаковка)", "Первый аргумент после -E указывает на D:/Projects/MyApp/1Cv8.cf", "Второй аргумент указывает на папку назначения для исходников", "Параметр --temp указывает на D:/Projects/MyApp/temp/", "Claude поясняет что создастся в папке исходников (JSON + BSL файлы)" ] }, { "id": 2, "prompt": "Собери обратно конфигурацию из исходников D:/Projects/MyApp/src/ в файл D:/Projects/MyApp/1Cv8_new.cf.", "expected_output": "Команда v8unpack вызвана с флагом -B, путём к папке исходников и путём к выходному CF-файлу.", "expectations": [ "Команда python -m v8unpack вызвана с флагом -B (сборка)", "Первый аргумент после -B указывает на папку исходников D:/Projects/MyApp/src/", "Второй аргумент указывает на путь к выходному файлу D:/Projects/MyApp/1Cv8_new.cf", "Claude предупреждает о проверке совместимости версии v8unpack (поле v8unpack в Configuration.json)" ] }, { "id": 3, "prompt": "Распакуй расширение МоёРасширение.cfe в папку src_cfe с режимом descent для версии конфигурации 3.0.112.", "expected_output": "Команда v8unpack вызвана с флагом -E, путём к CFE-файлу, папкой назначения src_cfe и параметром --descent 3000112.", "expectations": [ "Команда python -m v8unpack вызвана с флагом -E (распаковка)", "Аргумент указывает на МоёРасширение.cfe как источник", "Папка назначения указана как src_cfe", "Параметр --descent указан со значением 3000112 (версия 3.0.112 в формате XYYZZZ)" ] } ] }
-
-
SKILL.md 7.3 KB
--- name: v8unpack-cf description: "Распаковка и сборка бинарных файлов 1С (CF/CFE/EPF) через Python-утилиту v8unpack. Используй когда нужно распаковать конфигурацию, расширение или обработку в исходники, или собрать обратно." argument-hint: "<-E|-B> <source> <destination> [--temp path] [--descent ver] [--auto_include]" allowed-tools: - Bash - Read - Glob - Grep --- # v8unpack-cf - распаковка и сборка бинарных файлов 1С Утилита `saby v8unpack` (Python) распаковывает CF/CFE/EPF файлы 1С в человекочитаемые исходники (JSON + BSL) с деревом метаданных - **без платформы 1С**. Установка: `pip install v8unpack` (или dev-install из репозитория). ## Команды ### Распаковка (-E) ```bash python -m v8unpack -E "<файл.cf>" "<папка_исходников>" --temp "<папка_temp>" ``` | Параметр | Описание | |----------|----------| | `<файл.cf>` | Путь к CF, CFE или EPF файлу | | `<папка_исходников>` | Куда распаковать (создается автоматически) | | `--temp <путь>` | Папка для промежуточных данных (не удаляется - для отладки) | | `--processes N` | Количество потоков (по умолчанию cpu_count - 2) | | `--descent XYYZZZ` | Режим версионирования расширений (суффикс версии конфигурации) | | `--auto_include` | Динамическое оглавление из папки, а не из заголовка | | `--prefix STR` | Префикс имен метаданных 1-го уровня | ### Сборка (-B) ```bash python -m v8unpack -B "<папка_исходников>" "<файл.cf>" ``` | Параметр | Описание | |----------|----------| | `<папка_исходников>` | Папка с распакованными исходниками | | `<файл.cf>` | Путь к выходному CF/CFE/EPF файлу | | `--index <path>` | JSON-файл оглавления (маппинг файлов по папкам) | | `--version XYYZZ` | Версия режима совместимости (для расширений), напр. `80306` = 8.3.6 | | `--descent XYYZZZ` | Суффикс версии конфигурации | ### Индексация (-I) ```bash python -m v8unpack -I "<папка_исходников>" --index index.json --core core ``` Генерирует/обновляет `index.json` - файл оглавления для раскладки исходников по подпапкам. ### Пакетные операции (-EA, -BA, -IA) ```bash python -m v8unpack -EA products.json # распаковать все продукты python -m v8unpack -BA products.json # собрать все продукты python -m v8unpack -BA products.json --index KEY # собрать конкретный продукт ``` Файл `products.json` описывает несколько продуктов с индивидуальными параметрами сборки. ## Python API ```python import v8unpack v8unpack.extract('d:/sample.cf', 'd:/src') v8unpack.extract('d:/sample.cf', 'd:/src', temp_dir='d:/temp', options={'descent': 4100200, 'auto_include': True}) v8unpack.build('d:/src', 'd:/repacked.cf') v8unpack.build('d:/src', 'd:/repacked.cf', index='index.json', options={'descent': 4100200, 'version': '80306'}) ``` ## Примеры использования ### Распаковать конфигурацию ```bash python -m v8unpack -E "<project>/1Cv8.cf" "<project>/src" --temp "<project>/temp" ``` ### Собрать обратно ```bash python -m v8unpack -B "<project>/src" "<project>/1Cv8_new.cf" ``` ### Распаковать внешнюю обработку ```bash python -m v8unpack -E "МояОбработка.epf" "src_epf" ``` ### Распаковать расширение ```bash python -m v8unpack -E "МоеРасширение.cfe" "src_cfe" --descent 3000112 ``` ### Собрать расширение ```bash python -m v8unpack -B "src_cfe" "bin/ext.cfe" --index cmd/index.json --descent 3000112 --version 80316 ``` ## Совместимость версий Версия утилиты записывается в `Configuration.json` (`"v8unpack": "1.2.6"`). При сборке проверяется совпадение major.minor. Если версии не совпадают: 1. Собрать старой версией 2. Обновить утилиту 3. Распаковать новой версией 4. Закоммитить ### Круговая сборка: проверяй, а не верь на слово Про версию 1.2.6 встречается утверждение, что при сборке (`-B`) она пишет в заголовок контейнера размер блока `0x54` вместо `0x200`, из-за чего результат приходится патчить. **На 1.2.9 это не воспроизводится** (проверено 14.08.2026 на реальной `.epf` 1.8 МБ): распаковка и обратная сборка проходят без ошибок, в заголовке и исходного, и пересобранного файла `page_size = 0x200`. Размер файлов при этом отличается - это нормально и само по себе о поломке не говорит. Отсюда правило: перед тем как городить патч заголовка, **сделай круговую проверку на своей версии**. ```bash python -m v8unpack -E исходный.epf ./src python -m v8unpack -B ./src пересобранный.epf python -c "import struct;print([hex(struct.unpack('<IIII', open(p,'rb').read(16))[1]) for p in ('исходный.epf','пересобранный.epf')])" ``` Оба значения `0x200` - заголовок в порядке. Дальше проверяется главное: пересобранный файл должен открываться платформой и содержать те же модули. ## Промежуточные стадии (--temp) | Стадия | Описание | |--------|----------| | `decode_stage_0/` | Извлечение из контейнера 1С | | `decode_stage_1/` | Декомпрессия (zlib), скобкофайлы | | `decode_stage_3/` | Разбор метаданных → дерево | | Папка назначения | Организация кода (include, элементы форм) | ## Ограничения - Свойства объектов и разметка форм хранятся в `header` / `raw` как сырые массивы - Файлы > 1 МБ (макеты, HTML) хранятся как `.bin` без декодирования - Зашифрованные модули сохраняются в бинарном виде - При `--auto_include` вложенные объекты сортируются по алфавиту
Comments (0)
Sign in to join the conversation.
Reviews (0)
No reviews yet.
No comments yet.