mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-09-17 23:35:22 +03:00
feat(xdto-info): структура пакета и типа в терминах 1С
Навык отвечает на вопрос «что присвоить и что обязательно», а не показывает модель как есть. Типы переведены в нотацию 1С с учётом ограничений (xs:decimal + totalDigits → Число(18,2)), псевдонимы развёрнуты со стрелкой на исходное имя, кратность вынесена во флаги, для перечислимых типов выводятся допустимые литералы. Различие атрибут/элемент в таблице свойств не показывается: в коде 1С обращение одинаковое. Флаг ставится на обязательные, хотя в модели XDTO умолчание обратное. Причина — соседний meta-info, где непомеченный реквизит необязательный: один значок, означающий в двух навыках противоположное, сам по себе источник ошибок. Режимы: список пакетов конфигурации, состав пакета с точками входа, структура типа с разузлованием на -Depth и used-by. Разузлование идёт через границы пакетов с пометкой источника, анонимные типы раскрываются всегда, циклы обрываются. Пакет адресуется путём, именем или namespace — последнее потому, что модель приходит к задаче от строки ФабрикаXDTO.Тип(ns, имя), а не от имени пакета в конфигурации. Попутно закрыт баг паритета во всех четырёх py-портах: платформа допускает в targetNamespace произвольную строку (в БП есть пакет с кириллическим «ДопФайлУниверсальный»), .NET такое принимает, а libxml2 отвергает как невалидный URI. Добавлено узкое отступление на восстанавливающий разбор — только для этой ошибки, чтобы валидатор не перестал замечать битый XML. Обнаружено это только потому, что корпус впервые прогнан на Python: раньше все 760 гонялись лишь на PowerShell. Теперь 760/760 на обоих рантаймах. Сортировка в PS переведена на ординальную: Sort-Object сортирует по культуре, sorted() в Python — по кодам, и на смешанных латиница/кириллица имена расходились бы. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
bd4a082259
commit
a4a55cf883
@@ -106,6 +106,23 @@ def finalize():
|
||||
f.write("\n".join(output))
|
||||
|
||||
|
||||
def _parse_xml(source, from_string=False):
|
||||
"""Разбор с узким отступлением для не-URI пространств имён.
|
||||
|
||||
Платформа допускает в targetNamespace произвольную строку (в выгрузке БП есть
|
||||
пакет с кириллическим «ДопФайлУниверсальный»), .NET такое принимает, а libxml2
|
||||
отвергает. Откатываемся на восстанавливающий разбор ТОЛЬКО на этой ошибке,
|
||||
иначе по-настоящему битый XML перестал бы отличаться от корректного.
|
||||
"""
|
||||
try:
|
||||
return (etree.fromstring(source) if from_string else etree.parse(source))
|
||||
except etree.XMLSyntaxError as e:
|
||||
if "is not a valid URI" not in str(e):
|
||||
raise
|
||||
p = etree.XMLParser(recover=True)
|
||||
return (etree.fromstring(source, p) if from_string else etree.parse(source, p))
|
||||
|
||||
|
||||
def local(el):
|
||||
return etree.QName(el).localname
|
||||
|
||||
@@ -113,7 +130,7 @@ def local(el):
|
||||
# ── 1. well-formedness ───────────────────────────────────────
|
||||
|
||||
try:
|
||||
doc = etree.parse(bin_path)
|
||||
doc = _parse_xml(bin_path)
|
||||
except Exception as e: # noqa: BLE001
|
||||
report_error(f"Package.bin не является корректным XML: {e}")
|
||||
finalize()
|
||||
@@ -450,7 +467,7 @@ if state["stopped"]:
|
||||
# ── 11. metadata object ──────────────────────────────────────
|
||||
|
||||
if md_path:
|
||||
md = etree.parse(md_path)
|
||||
md = _parse_xml(md_path)
|
||||
md_name = md.find(f".//{{{MD_NS}}}XDTOPackage/{{{MD_NS}}}Properties/{{{MD_NS}}}Name")
|
||||
md_ns = md.find(f".//{{{MD_NS}}}XDTOPackage/{{{MD_NS}}}Properties/{{{MD_NS}}}Namespace")
|
||||
if md_name is None:
|
||||
@@ -470,7 +487,7 @@ else:
|
||||
|
||||
config_xml = os.path.join(config_dir, "Configuration.xml")
|
||||
if os.path.exists(config_xml):
|
||||
cfg = etree.parse(config_xml)
|
||||
cfg = _parse_xml(config_xml)
|
||||
registered = any((e.text or "") == file_name
|
||||
for e in cfg.iterfind(f".//{{{MD_NS}}}Configuration/{{{MD_NS}}}ChildObjects/{{{MD_NS}}}XDTOPackage"))
|
||||
if registered:
|
||||
@@ -489,7 +506,7 @@ if os.path.exists(config_xml):
|
||||
if not os.path.exists(ob):
|
||||
continue
|
||||
try:
|
||||
if etree.parse(ob).getroot().get("targetNamespace") == target_ns:
|
||||
if _parse_xml(ob).getroot().get("targetNamespace") == target_ns:
|
||||
clash.append(other)
|
||||
except Exception: # noqa: BLE001
|
||||
pass
|
||||
|
||||
Reference in New Issue
Block a user