mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-09-05 17:50:53 +03:00
fix(xdto): три дефекта, найденных платформенной верификацией снэпшотов
verify-snapshots загружает результат каждого кейса в 1С. Раньше навыки xdto через него не проходили вовсе; первый прогон дал 5 из 9. Ни корпусная сверка, ни валидатор такого не ловили: корпус состоит из заведомо валидных пакетов, а синтетические кейсы до сих пор в базу не грузились. 1. fixed. В модели XDTO это булев флаг, значение лежит в default; в XSD наоборот — fixed="V" несёт значение. Компилятор писал значение прямо в fixed, и платформа отвергала пакет («Отсутствует фиксированное значение свойства»). Перевод сделан в обе стороны; по принципу прощающего ввода принимается и модельная форма через зеркало xdto:fixed. Отображение выведено по корпусу: fixed встречается только вместе с default, значений всего два. 2. Импорт на несуществующий пакет платформа отвергает («xdto-package-3.3 … не определен»), а у нас проверки не было. Добавлена ошибка валидатора и, что важнее, предупреждение прямо на сборке — отказ при db-update дешевле поймать на шаг раньше. Правило пришлось калибровать корпусом: сначала оно дало 67 ложных срабатываний на платформенных пространствах имён, их список выведен и исключён. 3. localName проверяется как NCName — фикстура с пробелом в имени была негодной, заменена на реалистичный дефис (name="alpha_3" localName="alpha-3"). Харнесс получил skipPlatformVerify с обязательной причиной: результат set-namespace невалиден by design, операция намеренно оставляет висящий импорт у зависящего пакета. Итог: 9/9 компилятора, 9/10 + 1 осознанный пропуск у edit, round-trip 760/760, валидатор 0 ложных, 40 тестов на обоих рантаймах. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
3eb805f7b0
commit
5d5a1bc36a
@@ -302,6 +302,13 @@ function Emit-Property([System.Xml.XmlElement]$p, [string]$indent, [bool]$isGlob
|
||||
$nill = A $p "nillable"
|
||||
$def = A $p "default"
|
||||
$fix = A $p "fixed"
|
||||
# В модели fixed — булев флаг, значение лежит в default; в XSD наоборот:
|
||||
# fixed="V" несёт само значение. Переводим, а не копируем.
|
||||
$defOut = $def
|
||||
$fixOut = $null
|
||||
$fixMirror = ""
|
||||
if ($fix -eq "true" -and $null -ne $def) { $fixOut = $def; $defOut = $null }
|
||||
elseif ($null -ne $fix) { $fixMirror = Mirror "fixed" $fix }
|
||||
$anon = Get-AnonTypeDef $p
|
||||
# qualified записан как атрибут в пространстве имён XDTO
|
||||
$qual = $p.GetAttribute("qualified", $XDTO_NS)
|
||||
@@ -326,7 +333,8 @@ function Emit-Property([System.Xml.XmlElement]$p, [string]$indent, [bool]$isGlob
|
||||
if ($null -ne $lower) { $m += Mirror "lowerBound" $lower }
|
||||
if ($null -ne $upper) { $m += Mirror "upperBound" $upper }
|
||||
$m += $mirrorName
|
||||
$body = Attrs @('name', $xmlName, 'ref', $ref, 'type', $type, 'default', $def, 'fixed', $fix)
|
||||
$m += $fixMirror
|
||||
$body = Attrs @('name', $xmlName, 'ref', $ref, 'type', $type, 'default', $defOut, 'fixed', $fixOut)
|
||||
if ($anon) {
|
||||
X "$indent<xs:attribute$body$m>"
|
||||
X "$indent`t<xs:simpleType>"
|
||||
@@ -349,10 +357,11 @@ function Emit-Property([System.Xml.XmlElement]$p, [string]$indent, [bool]$isGlob
|
||||
if ($null -ne $qual) { $m += Mirror "qualified" $qual }
|
||||
$m += $mirrorName
|
||||
$m += (Mirror-Prefix $p)
|
||||
$m += $fixMirror
|
||||
|
||||
$body = Attrs @('name', $xmlName, 'ref', $ref, 'type', $type,
|
||||
'minOccurs', $minOccurs, 'maxOccurs', $maxOccurs,
|
||||
'nillable', $nill, 'default', $def, 'fixed', $fix)
|
||||
'nillable', $nill, 'default', $defOut, 'fixed', $fixOut)
|
||||
|
||||
if ($anon) {
|
||||
X "$indent<xs:element$body$m>"
|
||||
|
||||
@@ -308,6 +308,13 @@ def emit_property(p, indent):
|
||||
nill = p.get("nillable")
|
||||
default = p.get("default")
|
||||
fixed = p.get("fixed")
|
||||
# В модели fixed — булев флаг, значение лежит в default; в XSD наоборот:
|
||||
# fixed="V" несёт само значение. Переводим, а не копируем.
|
||||
def_out, fix_out, fix_mirror = default, None, ""
|
||||
if fixed == "true" and default is not None:
|
||||
fix_out, def_out = default, None
|
||||
elif fixed is not None:
|
||||
fix_mirror = mirror("fixed", fixed)
|
||||
anon = anon_type_def(p)
|
||||
qual = p.get(f"{{{XDTO_NS}}}qualified")
|
||||
|
||||
@@ -330,7 +337,8 @@ def emit_property(p, indent):
|
||||
if upper is not None:
|
||||
m += mirror("upperBound", upper)
|
||||
m += mirror_name
|
||||
body = attrs(["name", xml_name, "ref", ref, "type", type_, "default", default, "fixed", fixed])
|
||||
m += fix_mirror
|
||||
body = attrs(["name", xml_name, "ref", ref, "type", type_, "default", def_out, "fixed", fix_out])
|
||||
if anon is not None:
|
||||
X(f"{indent}<xs:attribute{body}{m}>")
|
||||
X(f"{indent}\t<xs:simpleType>")
|
||||
@@ -351,10 +359,11 @@ def emit_property(p, indent):
|
||||
m += mirror("qualified", qual)
|
||||
m += mirror_name
|
||||
m += mirror_prefix(p)
|
||||
m += fix_mirror
|
||||
|
||||
body = attrs(["name", xml_name, "ref", ref, "type", type_,
|
||||
"minOccurs", min_occurs, "maxOccurs", max_occurs,
|
||||
"nillable", nill, "default", default, "fixed", fixed])
|
||||
"nillable", nill, "default", def_out, "fixed", fix_out])
|
||||
|
||||
if anon is not None:
|
||||
X(f"{indent}<xs:element{body}{m}>")
|
||||
|
||||
Reference in New Issue
Block a user