v8unpack-agent
Прикладной инструмент над upstream-распаковщиком v8unpack: превращает
выгрузку конфигурации 1С в читаемый текстовый слой, машиночитаемую опись
форм и компактный контекст для LLM.
Задача пакета — дать агенту достоверные сведения о формах и модулях без угадывания. Где данные нечитаемы, результат помечается как неполный, а не достраивается догадками.
Границы и non-goals
- Пакет не распаковывает контейнер сам: дерево выгрузки готовит upstream
v8unpack, а агент работает с уже раскрытым каталогом. - Production-адаптера одиночного
Form.binв пакете нет: реализацию распаковщика передаёт вызывающая сторона. - Функций
index_cf()иrag.rebuild()не существует; векторная индексация находится вне scope пакета. - Пакет не подключается к живой информационной базе и не читает её данные.
Кто что решает
| Компонент | Ответственность |
|---|---|
upstream v8unpack |
распаковка контейнеров в дерево файлов |
v8unpack-agent |
опись форм, текстовый слой, индексы, контекст, отчёт о запуске |
| вызывающая сторона | реализация распаковщика формы и решения по degraded-результату |
Установка
Основная установка из PyPI:
pip install v8unpack-agent
Исторический pre-release 0.1.0rc1 остаётся доступным в PyPI и по умолчанию
не выбирается резолверами (нужен явный pin или --pre):
pip install v8unpack-agent==0.1.0rc1
Установка актуального состояния main напрямую из Git остаётся вариантом для
проверки ещё не опубликованных изменений:
pip install git+https://github.com/MRDK80/v8unpack-agent.git
Установка для разработки из клона:
pip install -e ".[test]"
upstream v8unpack нужен для фактического извлечения текстов, включая
поддержку внешних отчётов .erf.
Быстрый старт: CLI
Один прогон — один отчёт и один код возврата. На вход подаётся каталог уже распакованной выгрузки.
v8unpack-agent-run <корень_выгрузки> --report-path post-run.json
Аргумент --report-path обязателен, значения по умолчанию нет, а
каталог-родитель должен существовать заранее.
| Код | Значение |
|---|---|
| 0 | все объекты обработаны полностью |
| 2 | ошибка аргументов или корень не является каталогом |
| 3 | degraded: есть частичные или отказавшие объекты |
| 4 | управляемая фатальная ошибка пайплайна |
| 5 | ошибка записи отчёта |
| 6 | фатальная ошибка и ошибка записи одновременно |
Degraded — неуспешное завершение: неполный контекст не должен выглядеть
успехом для автоматизации. Полное описание аргументов, стадий и кодов причин —
в docs/runner.md, схема отчёта — в
docs/run_report.md.
Быстрый старт: Python
Каноническая цепочка: обнаружение источников, распаковка по FormBinSource,
обновление индекса.
from pathlib import Path
from v8unpack_agent import unpack_all_forms, update_forms_index
from v8unpack_agent.form_artifact import FormArtifact
from v8unpack_agent.form_identity import FormBinSource
from v8unpack_agent.scan_forms import scan_forms
dump_root = Path("unpacked_cf")
unpacked_root = Path("text_layer")
def unpack_one(source: FormBinSource, root: Path) -> FormArtifact:
"""Здесь вызывается реальное извлечение текстов из source.bin_path."""
return FormArtifact.for_form(root, source.name)
scan_index = scan_forms(dump_root)
print(f"Найдено форм: {scan_index.total}")
artifacts = unpack_all_forms(dump_root, unpacked_root, unpack_one)
index = update_forms_index(dump_root, unpacked_root, artifacts)
index.save(Path("forms_index.json"))
Распаковщик получает FormBinSource и корень текстового слоя — ровно два
аргумента. Существующая трёхаргументная реализация подключается только через
adapt_legacy_unpacker(). Подробный разбор и отбор по form_ids — в
docs/pipeline.md, готовые сценарии — в
examples/README.md.
Пайплайн
| Шаг | Функция | Результат |
|---|---|---|
| опись форм | scan_forms() |
FormScanIndex с layout-метаданными и индексом ссылочных типов |
| обнаружение источников | discover_form_sources() |
FormBinSource с каноническим form_id |
| распаковка | unpack_all_forms() |
FormArtifact на каждую форму |
| структура формы | parse_elem_json() |
элементы и привязки data_path, best-effort |
| реквизиты объекта | decode_object_attributes() |
Properties и TabularSections |
| классификация | classify_form() |
object, service или unknown |
| внешние отчёты | unpack_erf() |
текстовый слой и запросы СКД |
| индекс актуальности | update_forms_index() |
FormsIndex с ключом form_id |
| контроль дрейфа | check_drift() |
DriftReport по хешам |
| контекст для LLM | build_form_context() |
FormContext и промпт-фрагмент |
Ключевые возможности
- Одноимённые формы разных владельцев не затирают друг друга: идентичность —
form_id, а не имя. - Формы без кода попадают в опись: elem-only ветка заполняет
elem_json_path. - Частичный результат всегда явный:
extraction_ok=Falseневозможен без непустогоextraction_warnings. - Ссылочные типы реквизитов приводятся к имени объекта метаданных; неизвестный
UUID остаётся
Ref#<uuid>и не угадывается. - Сервисные формы отделены от объектных, чтобы метрика покрытия не занижалась архитектурным паттерном платформы.
- Дрейф детектируется по хешам модуля и структуры, а не только по времени изменения файла.
- Сериализация индексов переносима: в файлы пишутся только относительные POSIX-пути, одинаковые на POSIX и NT.
Версии схем
Три независимые версии, которые не сравниваются друг с другом.
| Артефакт | Версия | Где описан |
|---|---|---|
FormsIndex |
2 | docs/pipeline.md |
FormScanIndex |
2 при чтении legacy 1 | docs/scan_forms.md |
| post-run report | 1 | docs/run_report.md |
Публичная поверхность
| Модуль | Основные имена | Канонический документ |
|---|---|---|
scan_forms |
scan_forms, FormEntry, FormScanIndex, scan_warning_code |
scan_forms |
pipeline |
unpack_all_forms, unpack_erf, update_forms_index, FormUnpacker |
pipeline |
form_identity |
FormBinSource, discover_form_sources, select_sources, adapt_legacy_unpacker |
pipeline |
form_artifact |
FormArtifact |
pipeline |
forms_index |
FormsIndex, FormsIndexEntry, is_form_stale |
pipeline |
runner, cli |
RunOptions, RunOutcome, run_pipeline |
runner |
run_report |
PostRunReport, ObjectRunResult, write_post_run_report |
run_report |
elem_parser |
parse_elem_json, ElemIndexResult, UnindexedReason |
elem_parser |
form_classifier |
classify_form, FormClass, classify_empty_tree_form |
form_classifier |
coverage_metric |
calc_data_path_coverage, CoverageReport |
form_classifier |
object_decoder |
decode_object_attributes, DecodeResult, DecodeError |
object_decoder |
catalog_resolver |
resolve_data_path, ResolvedBinding |
catalog_resolver |
form_context |
FormContext, build_form_context, to_llm_prompt_fragment |
form_context |
form_summary |
build_form_summary, to_normalized_json |
form_summary |
form_router |
FormRouter, form_paths |
form_router |
common_modules |
scan_common_modules, build_common_module_context |
common_modules |
managed_forms |
discover_elem_forms, ElemFormEntry |
managed_forms_structure |
skd_extractor |
extract_skd_queries, extract_all_skd_queries |
skd_extractor |
drift_checker |
check_drift, DriftReport |
drift_checker |
Документация
Начало работы
Пайплайн и запуск
Формы и разбор
- Структура элементов и
UnindexedReason - Классификация форм и метрика покрытия
- Сводка по форме
- Контекст для LLM
- Маршрутизация путей формы
- Структура управляемых форм
- Структура внешних обработок и отчётов
- Запросы СКД
Метаданные и индексы
- Опись форм и индекс ссылочных типов
- Реквизиты объекта из raw-секции
header - Разрешение
data_path - Общие модули
- Контроль дрейфа
Исследования
Датированные протоколы с агрегатами; выводы не переписываются задним числом.
- Доля неиндексированных форм
- Разрешение ссылочных типов
- Нессылочные типовые грани
- Кросс-конфигурационная проверка типов
- Пустые реквизиты объекта
- Структура
Form.bin - Валидация на третьей выгрузке
Примеры и политики
Известные ограничения
- Обычные (неуправляемые) формы хранят разметку в бинарном виде и частично
не читаются; такие формы получают
unknownи исключаются из знаменателя метрики. - Квалификаторы реквизитов и составные типы не декодируются.
- Индекс ссылочных типов строится только для видов метаданных с доказанной
ссылочной формой; остальные UUID остаются
Ref#<uuid>. - В режиме
mode="external"индекс ссылочных типов не собирается. - Распаковщики из
examples/и тестов — заглушки и не читают бинарный формат. - Пакет ещё не опубликован в индексе пакетов (issue #149).
Тесты
pytest
Фикстуры синтетические: реальная выгрузка для прогона не требуется. Порядок работы с ветками, проверки перед PR и требования к обезличенности описаны в CONTRIBUTING.md.
Связанное
saby-integration/v8unpack— upstream-распаковщик на Python, лицензия MIT.
Лицензия
MIT — см. LICENSE.
Release files for v8unpack-agent 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| v8unpack_agent-0.1.0.tar.gz | 266.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| v8unpack_agent-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size:396.1 kB
Release files / v8unpack_agent-0.1.0.tar.gz
| Download URL | v8unpack_agent-0.1.0.tar.gz |
|---|---|
| Size | 266.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
64c0fcf1e1a4badab13d46e54e49146c9c62d8cea662423c5a9103579a132e14
|
|
BLAKE2b-256 checksum How to use checksums |
10460909a1810a80f85ca96106633695fa88f2d317ed93cd15896c25f82480ca
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 18, 2026.
Transparency logRelease files / v8unpack_agent-0.1.0-py3-none-any.whl
| Download URL | v8unpack_agent-0.1.0-py3-none-any.whl |
|---|---|
| Size | 129.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4d4386f7181140f14e0c8f1411eff4940879508c84b0c1fb8ca2fbbd17038baf
|
|
BLAKE2b-256 checksum How to use checksums |
5c0652a724d883f62ea8d381e1f5fb187ffc181d57d70e31ad5ed47bdce023c1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 18, 2026.
Transparency log