Initial SQL-only 1C adapter baseline

This commit is contained in:
2026-07-22 03:03:47 +03:00
commit e2503b77e7
545 changed files with 184711 additions and 0 deletions
+114
View File
@@ -0,0 +1,114 @@
from __future__ import annotations
import argparse
import json
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
DEFAULT_INPUT = ROOT / "plugins" / "1c" / "metadata" / "examples" / "metadata.example.json"
DEFAULT_OUTPUT = ROOT / "plugins" / "1c" / "rag" / "sources" / "metadata.generated.md"
KIND_TITLES = {
"catalog": "Справочник",
"document": "Документ",
"register": "Регистр",
"common_module": "Общий модуль",
"enum": "Перечисление",
"report": "Отчет",
"processing": "Обработка",
"other": "Объект",
}
def load_snapshot(path: Path) -> dict:
with path.open("r", encoding="utf-8") as handle:
data = json.load(handle)
if not isinstance(data, dict):
raise ValueError("metadata snapshot must be a JSON object")
if data.get("schema_version") != 1:
raise ValueError("metadata snapshot schema_version must be 1")
if not isinstance(data.get("objects"), list):
raise ValueError("metadata snapshot objects must be a list")
return data
def object_to_markdown(obj: dict) -> str:
kind = obj.get("kind") or "other"
title = KIND_TITLES.get(kind, "Объект")
name = obj.get("name") or "БезИмени"
synonym = obj.get("synonym")
description = obj.get("description")
lines = [f"## {title}: {name}", ""]
if synonym:
lines.extend([f"Синоним: {synonym}", ""])
if description:
lines.extend([description, ""])
attributes = obj.get("attributes") or []
if attributes:
lines.extend(["### Реквизиты", ""])
for attr in attributes:
attr_name = attr.get("name") or "БезИмени"
attr_type = attr.get("type") or "не указан"
attr_synonym = attr.get("synonym")
suffix = f" ({attr_synonym})" if attr_synonym else ""
lines.append(f"- {attr_name}{suffix}: {attr_type}")
lines.append("")
tabular_sections = obj.get("tabular_sections") or []
if tabular_sections:
lines.extend(["### Табличные части", ""])
for section in tabular_sections:
section_name = section.get("name") or "БезИмени"
section_synonym = section.get("synonym")
suffix = f" ({section_synonym})" if section_synonym else ""
lines.append(f"- {section_name}{suffix}")
for attr in section.get("attributes") or []:
attr_name = attr.get("name") or "БезИмени"
attr_type = attr.get("type") or "не указан"
lines.append(f" - {attr_name}: {attr_type}")
lines.append("")
return "\n".join(lines).strip()
def snapshot_to_markdown(snapshot: dict) -> str:
source = snapshot.get("source") or {}
source_name = source.get("name") or "unknown"
created_at = snapshot.get("created_at") or "unknown"
sections = [
"# 1C Metadata Snapshot",
"",
f"Источник: {source_name}",
f"Дата снимка: {created_at}",
"",
"Этот файл сгенерирован из metadata snapshot и предназначен для RAG-поиска.",
"",
]
for obj in snapshot.get("objects") or []:
sections.append(object_to_markdown(obj))
sections.append("")
return "\n".join(sections).strip() + "\n"
def main() -> int:
parser = argparse.ArgumentParser(description="Convert a 1C metadata snapshot to a Markdown RAG source.")
parser.add_argument("--input", type=Path, default=DEFAULT_INPUT)
parser.add_argument("--output", type=Path, default=DEFAULT_OUTPUT)
args = parser.parse_args()
snapshot = load_snapshot(args.input)
markdown = snapshot_to_markdown(snapshot)
args.output.parent.mkdir(parents=True, exist_ok=True)
args.output.write_text(markdown, encoding="utf-8")
print(f"Wrote RAG source to {args.output}")
return 0
if __name__ == "__main__":
raise SystemExit(main())