mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-09-05 01:30:54 +03:00
fix(meta-compile,meta-edit): ссылочный тип корневым cfg:, как пишет платформа
Эмитился локальный xmlns:d5p1 на тот же URI, что уже объявлен в шапке файла. Формально эквивалентно (значим URI, а не префикс), платформа принимала — но первый же цикл «загрузить в базу → выгрузить» переписывал КАЖДЫЙ ссылочный тип в cfg:, то есть давал diff-шум при неизменной семантике. Форма пришла из СКД, где cfg: действительно не работает; в метаданных такого ограничения нет. Радиус оказался втрое меньше прежней оценки: form-compile в него НЕ входил — он уже писал cfg:, а все его d5p1 относятся к чужим пространствам (txtedt/chart/geo/graphscheme/data-analysis), которых в корне нет и где локальное объявление законно. meta-edit берёт префикс из объявлений КОРНЯ правимого файла, а если URI там не объявлен — остаётся на самодостаточной локальной форме. Это не перестраховка: ссылочный тип живёт в ТЕКСТЕ узла, поэтому XML-слой про префикс не знает и сам объявление не добавит — проверено, .NET на документе без xmlns:cfg молча пишет неразрешимый префикс. Та же природа объясняет удалённый костыль в meta-edit.py: lxml выбрасывал xmlns:d5p1 как «неиспользуемый», и его возвращали регуляркой после сериализации. Синхронно снята нормализация ref-префикса в раундтрип-харнесе (debug/, вне git): она сводила cfg: и d5p1: к одному REF: и делала харнес слепым ровно к тому, ради чего затевался переход. Проверка: - живой цикл через базу (db-create → db-load-xml → db-dump-xml): выгрузка платформы совпала с нашими исходниками ПОСТРОЧНО, расхождений ноль; - корпусный раундтрип 4897 объектов уже БЕЗ маски префикса: match не просел (150/1640/151/2600/314/42), порядок ≠ 0, TOTAL diff lines 0; - юнит-тесты 648/648 ps1, 645/648 py; - 1С-сертификация meta-edit 17/17 на платформе 8.3.24; - дрейф эталонов 48 файлов, в диффе нет ни одной строки кроме d5p1: → cfg:; skd-* не затронуты ни одним файлом (там cfg: не работает). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
a3aa8fe87c
commit
683e370938
@@ -1,4 +1,4 @@
|
||||
# meta-compile v1.84 — Compile 1C metadata object from JSON
|
||||
# meta-compile v1.85 — Compile 1C metadata object from JSON
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
param(
|
||||
[Parameter(Mandatory)]
|
||||
@@ -760,9 +760,15 @@ function Emit-TypeContent {
|
||||
return
|
||||
}
|
||||
|
||||
# Reference types — use local xmlns declaration for 1C compatibility
|
||||
# Ссылочные типы — корневой cfg:, как пишет платформа. Раньше здесь объявлялся
|
||||
# ЛОКАЛЬНЫЙ xmlns:d5p1 на тот же URI, что уже объявлен в шапке ($script:xmlnsDecl):
|
||||
# формально эквивалентно (значим URI, не префикс) и платформой принималось, но
|
||||
# первый же цикл «загрузить в базу → выгрузить» переписывал каждый ссылочный тип
|
||||
# в cfg: — то есть давал diff-шум на ровном месте. Форма пришла из СКД, где cfg:
|
||||
# действительно не работает; в метаданных такого ограничения нет.
|
||||
# NB: локальная xmlns остаётся законной для ЧУЖИХ пространств — см. $script:typeNamespaceMap.
|
||||
if ($typeStr -match '^(CatalogRef|DocumentRef|EnumRef|ChartOfAccountsRef|ChartOfCharacteristicTypesRef|ChartOfCalculationTypesRef|ExchangePlanRef|BusinessProcessRef|BusinessProcessRoutePointRef|TaskRef)\.(.+)$') {
|
||||
X "$indent<v8:Type xmlns:d5p1=`"http://v8.1c.ru/8.1/data/enterprise/current-config`">d5p1:$typeStr</v8:Type>"
|
||||
X "$indent<v8:Type>cfg:$typeStr</v8:Type>"
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env python3
|
||||
# meta-compile v1.84 — Compile 1C metadata object from JSON
|
||||
# meta-compile v1.85 — Compile 1C metadata object from JSON
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
|
||||
import argparse
|
||||
@@ -806,10 +806,16 @@ def emit_type_content(indent, type_str):
|
||||
X(f'{indent}<v8:Type>cfg:{type_str}</v8:Type>')
|
||||
return
|
||||
|
||||
# Reference types — use local xmlns declaration for 1C compatibility
|
||||
# Ссылочные типы — корневой cfg:, как пишет платформа. Раньше здесь объявлялся
|
||||
# ЛОКАЛЬНЫЙ xmlns:d5p1 на тот же URI, что уже объявлен в шапке: формально
|
||||
# эквивалентно (значим URI, не префикс) и платформой принималось, но первый же
|
||||
# цикл «загрузить в базу → выгрузить» переписывал каждый ссылочный тип в cfg: —
|
||||
# то есть давал diff-шум на ровном месте. Форма пришла из СКД, где cfg:
|
||||
# действительно не работает; в метаданных такого ограничения нет.
|
||||
# NB: локальная xmlns остаётся законной для ЧУЖИХ пространств — см. type_namespace_map.
|
||||
m = re.match(r'^(CatalogRef|DocumentRef|EnumRef|ChartOfAccountsRef|ChartOfCharacteristicTypesRef|ChartOfCalculationTypesRef|ExchangePlanRef|BusinessProcessRef|BusinessProcessRoutePointRef|TaskRef)\.(.+)$', type_str)
|
||||
if m:
|
||||
X(f'{indent}<v8:Type xmlns:d5p1="http://v8.1c.ru/8.1/data/enterprise/current-config">d5p1:{type_str}</v8:Type>')
|
||||
X(f'{indent}<v8:Type>cfg:{type_str}</v8:Type>')
|
||||
return
|
||||
# Fallback
|
||||
X(f'{indent}<v8:Type>{type_str}</v8:Type>')
|
||||
|
||||
Reference in New Issue
Block a user