fix(form-edit,meta-edit,mxl-compile,role-compile,subsystem-*): кавычки в тексте не экранируем

Правило платформы единое и подтверждено дважды. По корпусу трёх конфигураций:
92142 сырых кавычки в тексте элементов и НИ ОДНОЙ "; в условиях RLS —
16334 сырых против нуля экранированных (при этом & платформа пишет, то есть
амперсанд экранируется, а кавычка нет). Загрузка на стенде: оба варианта
принимаются, но выгружает платформа сырую кавычку — то есть " не ошибка,
а лишний шум в роундтрипе.

Решение было принято раньше в form-compile (там оно и записано комментарием) и
в skd-compile/skd-edit, но шесть навыков из него выпали. Приведены к общему виду:
где Esc-Xml использовался только для текста — функция стала текстовой; в meta-edit,
где она нужна и для атрибута, текстовые места переведены на существующий
Esc-XmlText. Атрибуты нигде не затронуты: там экранирование кавычек обязательно.

Дрейф эталонов — три строки, все условия RLS; role-info и role-validate строят
фикстуры прогоном role-compile (кросс-навыковый пересъём).

Проверка: полная сюита 630/630 на PowerShell и 627+3 skipped на python;
1С-сертификация role-compile 9/9, subsystem-compile 9/9, subsystem-edit 6/6,
form-edit 6/6, meta-edit 16/16. В mxl-compile кейс guard-allow-external падает
и до правки — не связан.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-08-02 15:08:55 +03:00
co-authored by Claude Opus 5
parent 6963df6b99
commit 919d49fe14
19 changed files with 114 additions and 77 deletions
@@ -1,4 +1,4 @@
# meta-compile v1.74 — Compile 1C metadata object from JSON
# meta-compile v1.75 — Compile 1C metadata object from JSON
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
param(
[Parameter(Mandatory)]
@@ -1785,7 +1785,10 @@ function Emit-Characteristics {
if ([string]::IsNullOrEmpty($tfvN.Text)) { X "$indent`t`t`t<xr:TypesFilterValue xsi:type=`"$($tfvN.XsiType)`"/>" }
else { X "$indent`t`t`t<xr:TypesFilterValue xsi:type=`"$($tfvN.XsiType)`">$(Esc-XmlText $tfvN.Text)</xr:TypesFilterValue>" }
}
X "$indent`t`t`t<xr:DataPathField>$(Esc-XmlText (Expand-CharField "$dpf" $tFrom))</xr:DataPathField>"
# Числовое значение (обычно -1 или 0) — как есть; разворачивать через Expand-CharField нельзя,
# оно примет "0" за короткое имя поля и выдаст "<from>.Attribute.0".
$dpfOut = if ("$dpf" -match '^-?\d+$') { "$dpf" } else { Esc-XmlText (Expand-CharField "$dpf" $tFrom) }
X "$indent`t`t`t<xr:DataPathField>$dpfOut</xr:DataPathField>"
X "$indent`t`t`t<xr:MultipleValuesUseField>$mvu</xr:MultipleValuesUseField>"
X "$indent`t`t</xr:CharacteristicTypes>"
X "$indent`t`t<xr:CharacteristicValues from=`"$(Esc-Xml $vFrom)`">"
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
# meta-compile v1.74 — Compile 1C metadata object from JSON
# meta-compile v1.75 — Compile 1C metadata object from JSON
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse
@@ -1822,10 +1822,14 @@ def resolve_char_std_en(name):
return None
def char_int_field(obj, names):
"""Поле-флаг Characteristics — дефолт -1. ПОЛИМОРФНО: обычно число, но DataPathField в
некоторых конфигурациях содержит ПУТЬ к полю тогда возвращаем строку как есть."""
v = ch_el_prop(obj, names)
if v is None or str(v) == '':
return -1
return int(v)
if re.fullmatch(r'-?\d+', str(v)):
return int(v)
return str(v)
def expand_char_field(field, from_):
s = str(field or '')
@@ -1875,7 +1879,10 @@ def emit_characteristics(indent, chars):
X(f'{indent}\t\t\t<xr:TypesFilterValue xsi:type="{tfv_xt}"/>')
else:
X(f'{indent}\t\t\t<xr:TypesFilterValue xsi:type="{tfv_xt}">{esc_xml_text(tfv_tx)}</xr:TypesFilterValue>')
X(f'{indent}\t\t\t<xr:DataPathField>{dpf}</xr:DataPathField>')
# Числовое значение (обычно -1 или 0) — как есть; expand_char_field примет "0" за короткое
# имя поля и выдаст "<from>.Attribute.0".
dpf_out = str(dpf) if re.fullmatch(r'-?\d+', str(dpf)) else esc_xml_text(expand_char_field(str(dpf), t_from))
X(f'{indent}\t\t\t<xr:DataPathField>{dpf_out}</xr:DataPathField>')
X(f'{indent}\t\t\t<xr:MultipleValuesUseField>{mvu}</xr:MultipleValuesUseField>')
X(f'{indent}\t\t</xr:CharacteristicTypes>')
X(f'{indent}\t\t<xr:CharacteristicValues from="{esc_xml(v_from)}">')