mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-09-02 16:20:54 +03:00
feat(cf-info,meta-info): вывод состояния поддержки из ParentConfigurations.bin
Декодер Ext/ParentConfigurations.bin (нативная копия в каждом скрипте, без общего модуля — по конвенции автономности навыков; single-pass, не падает на битом/пустом файле). cf-info (v1.3): блок «Поддержка:» в overview/full — на поддержке / возможность изменения вкл-выкл / счётчики на замке/редактируется/снято (только при G=0) / снята полностью / расширение (CFE). При G=1 показывает read-only без вводящих в заблуждение счётчиков; тяжёлый скан 7.4МБ пропускается, когда не нужен. При K>1 перечисляет конфигурации поставщика. meta-info (v1.3): строка «Поддержка:» под заголовком объекта — walk-up к корню конфигурации, статус с учётом G-vs-f1 и консервативной свёртки min(f1) по блокам поставщиков. Для на-замке/read-only — короткое последствие+действие (cfe-*), для остальных терсно. Проверено на корпусе и размеченных дампах (acc G=1, erp снято, ЧастьОбъектов, Корень, НесколькоПоддержек K=7 мультивендор, CFE) — оба порта байт-в-байт. Формат: docs/1c-support-state-spec.md. Тесты: cf-info 7/7, meta-info 17/17 на PowerShell и Python. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
75a97d51ea
commit
96660f4d9d
@@ -1,4 +1,4 @@
|
||||
# meta-info v1.2 — Compact summary of 1C metadata object (Python port)
|
||||
# meta-info v1.3 — Compact summary of 1C metadata object (Python port)
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
import argparse
|
||||
import os
|
||||
@@ -469,6 +469,59 @@ def get_ws_operations(child_objs):
|
||||
return result
|
||||
|
||||
|
||||
# ── Support status of this object (Ext/ParentConfigurations.bin) ──
|
||||
# See docs/1c-support-state-spec.md. Walks up to the config root, decodes the
|
||||
# object's support rule. Never throws — degrades to "не на поддержке".
|
||||
def get_object_support_status(obj_uuid):
|
||||
try:
|
||||
d = os.path.dirname(object_path)
|
||||
bin_path = None
|
||||
for _ in range(8):
|
||||
if not d:
|
||||
break
|
||||
cand = os.path.join(d, "Ext", "ParentConfigurations.bin")
|
||||
if os.path.exists(cand) or os.path.exists(os.path.join(d, "Configuration.xml")):
|
||||
bin_path = cand
|
||||
break
|
||||
parent = os.path.dirname(d)
|
||||
if parent == d:
|
||||
break
|
||||
d = parent
|
||||
if not bin_path or not os.path.exists(bin_path):
|
||||
return "не на поддержке"
|
||||
data = open(bin_path, "rb").read()
|
||||
if len(data) <= 32:
|
||||
return "снято с поддержки (правки свободны)"
|
||||
if data[:3] == b"\xef\xbb\xbf":
|
||||
data = data[3:]
|
||||
text = data.decode("utf-8", "replace")
|
||||
h = re.match(r"\{6,(\d+),(\d+),", text)
|
||||
if not h:
|
||||
return "не на поддержке"
|
||||
g = int(h.group(1))
|
||||
k = int(h.group(2))
|
||||
if k == 0:
|
||||
return "снято с поддержки (правки свободны)"
|
||||
if g == 1:
|
||||
return "конфигурация read-only (возможность изменения выключена) — правки невозможны без включения"
|
||||
if not obj_uuid:
|
||||
return "не на поддержке"
|
||||
best = None
|
||||
for m in re.finditer(r"([0-2]),0," + re.escape(obj_uuid.lower()), text):
|
||||
f1 = int(m.group(1))
|
||||
if best is None or f1 < best:
|
||||
best = f1
|
||||
if best is None:
|
||||
return "не на поддержке"
|
||||
return {
|
||||
0: "на замке — прямая правка сломает обновления; дорабатывай через cfe-* либо включи редактирование объекта",
|
||||
1: "редактируется с сохранением поддержки",
|
||||
2: "снято с поддержки (правки свободны)",
|
||||
}.get(best, "не на поддержке")
|
||||
except Exception:
|
||||
return "не на поддержке"
|
||||
|
||||
|
||||
# ── Extract metadata ─────────────────────────────────────────
|
||||
|
||||
props = find(type_node, "md:Properties")
|
||||
@@ -650,6 +703,7 @@ if not drill_done:
|
||||
header += f' \u2014 "{synonym}"'
|
||||
header += " ==="
|
||||
out(header)
|
||||
out(f"Поддержка: {get_object_support_status(type_node.get('uuid', ''))}")
|
||||
|
||||
# Type presentation (ref objects)
|
||||
if is_ref_object:
|
||||
|
||||
Reference in New Issue
Block a user