mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-08-03 10:10:21 +03:00
fix(meta-compile,meta-decompile): не-дефолтный TypeReductionMode измерения и nil в FixedArray
Раундтрип по документам и регистрам УТ (1283 объекта) вскрыл два пробела. TypeReductionMode измерения РС: декомпилятор значение захватывал, но парсер измерения в компиляторе не переносил ключ дальше, и любое отклонение от дефолта молча заменялось на TransformValues. Так терялось третье значение свойства — DeleteData («Удалять данные»); всего у свойства три режима: Преобразовывать значения (дефолт), Удалять данные, Запрещать. Синтетика на матрице платформ: DeleteData принимается и переживает роундтрип на 8.3.25, 8.3.26 и 8.3.27 — порог тот же, что у самого свойства (2.18). nil-элемент внутри FixedArray (<v8:Value xsi:nil="true"/>) декомпилировался пустой строкой, компилятор эмитил xs:string. Теперь это JSON null в обе стороны. Конструкция не новая — есть уже в дампе 8.3.20. Спеки: у TypeReductionMode перечислены все три значения с названиями из конфигуратора; версия появления исправлена с 2.20 на 2.18. Проверка: УТ tier-1 1283 объекта -> 1280 совпадений (было 1273), сюита meta-compile 76/76 на обоих портах. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
75e861da6e
commit
3d5c9e5bee
@@ -1041,6 +1041,9 @@ function Parse-AttributeShorthand {
|
|||||||
accountingFlag = $val.accountingFlag
|
accountingFlag = $val.accountingFlag
|
||||||
extDimensionAccountingFlag = $val.extDimensionAccountingFlag
|
extDimensionAccountingFlag = $val.extDimensionAccountingFlag
|
||||||
addressingDimension = $val.addressingDimension
|
addressingDimension = $val.addressingDimension
|
||||||
|
# Режим приведения типов измерения РС (формат 2.18). Ключ обязан доехать до эмиттера:
|
||||||
|
# без него не-дефолтное значение (Deny / DeleteData) молча заменялось на TransformValues.
|
||||||
|
typeReductionMode = $val.typeReductionMode
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1647,6 +1650,7 @@ function Emit-ChoiceParameters {
|
|||||||
} elseif ($valIsArray) {
|
} elseif ($valIsArray) {
|
||||||
X "$indent`t`t<app:value xsi:type=`"v8:FixedArray`">"
|
X "$indent`t`t<app:value xsi:type=`"v8:FixedArray`">"
|
||||||
foreach ($v in $val) {
|
foreach ($v in $val) {
|
||||||
|
if ($null -eq $v) { X "$indent`t`t`t<v8:Value xsi:nil=`"true`"/>"; continue }
|
||||||
if (Is-EmptyRef $v) { X "$indent`t`t`t<v8:Value xsi:type=`"xr:DesignTimeRef`"/>"; continue }
|
if (Is-EmptyRef $v) { X "$indent`t`t`t<v8:Value xsi:type=`"xr:DesignTimeRef`"/>"; continue }
|
||||||
$norm = Normalize-ChoiceValueT $v $ptype
|
$norm = Normalize-ChoiceValueT $v $ptype
|
||||||
if ([string]::IsNullOrEmpty($norm.Text)) { X "$indent`t`t`t<v8:Value xsi:type=`"$($norm.XsiType)`"/>" }
|
if ([string]::IsNullOrEmpty($norm.Text)) { X "$indent`t`t`t<v8:Value xsi:type=`"$($norm.XsiType)`"/>" }
|
||||||
@@ -4794,6 +4798,9 @@ if ($objType -eq "ExchangePlan") {
|
|||||||
[System.IO.File]::WriteAllText($contentPath, $sbC.ToString(), $enc)
|
[System.IO.File]::WriteAllText($contentPath, $sbC.ToString(), $enc)
|
||||||
$modulesCreated += $contentPath
|
$modulesCreated += $contentPath
|
||||||
} elseif (-not (Test-Path $contentPath)) {
|
} elseif (-not (Test-Path $contentPath)) {
|
||||||
|
# При пустом составе платформа всё равно пишет пустой <ExchangePlanContent/> — проверено на
|
||||||
|
# ОДНОЙ конфигурации, снятой 8.3.24/8.3.25/8.3.26/8.3.27: во всех четырёх файл есть.
|
||||||
|
# (Единственный план обмена БЕЗ файла найден в УТ — хвостовая аномалия конфигурации, не правило.)
|
||||||
Ensure-ExtDir
|
Ensure-ExtDir
|
||||||
$contentXml = "<?xml version=`"1.0`" encoding=`"UTF-8`"?>`r`n<ExchangePlanContent $xepNs version=`"$($script:formatVersion)`"/>`r`n"
|
$contentXml = "<?xml version=`"1.0`" encoding=`"UTF-8`"?>`r`n<ExchangePlanContent $xepNs version=`"$($script:formatVersion)`"/>`r`n"
|
||||||
[System.IO.File]::WriteAllText($contentPath, $contentXml, $enc)
|
[System.IO.File]::WriteAllText($contentPath, $contentXml, $enc)
|
||||||
|
|||||||
@@ -1073,6 +1073,9 @@ def parse_attribute_shorthand(val):
|
|||||||
'accountingFlag': val.get('accountingFlag'),
|
'accountingFlag': val.get('accountingFlag'),
|
||||||
'extDimensionAccountingFlag': val.get('extDimensionAccountingFlag'),
|
'extDimensionAccountingFlag': val.get('extDimensionAccountingFlag'),
|
||||||
'addressingDimension': val.get('addressingDimension'),
|
'addressingDimension': val.get('addressingDimension'),
|
||||||
|
# Режим приведения типов измерения РС (формат 2.18). Ключ обязан доехать до эмиттера:
|
||||||
|
# без него не-дефолтное значение (Deny / DeleteData) молча заменялось на TransformValues.
|
||||||
|
'typeReductionMode': val.get('typeReductionMode'),
|
||||||
}
|
}
|
||||||
|
|
||||||
def parse_enum_value_shorthand(val):
|
def parse_enum_value_shorthand(val):
|
||||||
@@ -1735,6 +1738,9 @@ def emit_choice_parameters(indent, cp, tag='ChoiceParameters'):
|
|||||||
elif val_is_array:
|
elif val_is_array:
|
||||||
X(f'{indent}\t\t<app:value xsi:type="v8:FixedArray">')
|
X(f'{indent}\t\t<app:value xsi:type="v8:FixedArray">')
|
||||||
for v in val:
|
for v in val:
|
||||||
|
if v is None:
|
||||||
|
X(f'{indent}\t\t\t<v8:Value xsi:nil="true"/>')
|
||||||
|
continue
|
||||||
if is_empty_ref(v):
|
if is_empty_ref(v):
|
||||||
X(f'{indent}\t\t\t<v8:Value xsi:type="xr:DesignTimeRef"/>')
|
X(f'{indent}\t\t\t<v8:Value xsi:type="xr:DesignTimeRef"/>')
|
||||||
continue
|
continue
|
||||||
@@ -4684,6 +4690,9 @@ if obj_type == 'ExchangePlan':
|
|||||||
write_utf8_bom(content_path, ''.join(parts))
|
write_utf8_bom(content_path, ''.join(parts))
|
||||||
modules_created.append(content_path)
|
modules_created.append(content_path)
|
||||||
elif not os.path.isfile(content_path):
|
elif not os.path.isfile(content_path):
|
||||||
|
# При пустом составе платформа всё равно пишет пустой <ExchangePlanContent/> — проверено на
|
||||||
|
# ОДНОЙ конфигурации, снятой 8.3.24/8.3.25/8.3.26/8.3.27: во всех четырёх файл есть.
|
||||||
|
# (Единственный план обмена БЕЗ файла найден в УТ — хвостовая аномалия конфигурации, не правило.)
|
||||||
ensure_ext_dir()
|
ensure_ext_dir()
|
||||||
content_xml = f'<?xml version="1.0" encoding="UTF-8"?>\r\n<ExchangePlanContent {xep_ns} version="{format_version}"/>\r\n'
|
content_xml = f'<?xml version="1.0" encoding="UTF-8"?>\r\n<ExchangePlanContent {xep_ns} version="{format_version}"/>\r\n'
|
||||||
write_utf8_bom(content_path, content_xml)
|
write_utf8_bom(content_path, content_xml)
|
||||||
|
|||||||
@@ -219,6 +219,9 @@ function Get-TypeShorthand {
|
|||||||
# string/dateTime/DesignTimeRef → строка (компилятор auto-детектит обратно).
|
# string/dateTime/DesignTimeRef → строка (компилятор auto-детектит обратно).
|
||||||
function Convert-ChScalarNode {
|
function Convert-ChScalarNode {
|
||||||
param($vN)
|
param($vN)
|
||||||
|
# nil-элемент массива (<v8:Value xsi:nil="true"/>) → JSON null. Без этого он приезжал пустой
|
||||||
|
# строкой и компилятор эмитил xs:string вместо nil.
|
||||||
|
if ($vN.GetAttribute('nil', 'http://www.w3.org/2001/XMLSchema-instance') -eq 'true') { return $null }
|
||||||
$xt = $vN.GetAttribute('type', 'http://www.w3.org/2001/XMLSchema-instance')
|
$xt = $vN.GetAttribute('type', 'http://www.w3.org/2001/XMLSchema-instance')
|
||||||
$txt = $vN.InnerText
|
$txt = $vN.InnerText
|
||||||
if ($xt -match 'boolean$') { return ($txt -eq 'true') }
|
if ($xt -match 'boolean$') { return ($txt -eq 'true') }
|
||||||
|
|||||||
@@ -291,6 +291,10 @@ def get_type_shorthand(type_node):
|
|||||||
|
|
||||||
# Скалярное значение параметра выбора (<Value xsi:type=...>) → JSON-значение (bool/число/строка).
|
# Скалярное значение параметра выбора (<Value xsi:type=...>) → JSON-значение (bool/число/строка).
|
||||||
def convert_ch_scalar_node(vN):
|
def convert_ch_scalar_node(vN):
|
||||||
|
# nil-элемент массива (<v8:Value xsi:nil="true"/>) -> JSON null. Без этого он приезжал пустой
|
||||||
|
# строкой и компилятор эмитил xs:string вместо nil.
|
||||||
|
if _attr(vN, 'nil', NS_XSI) == 'true':
|
||||||
|
return None
|
||||||
xt = _attr(vN, 'type', NS_XSI)
|
xt = _attr(vN, 'type', NS_XSI)
|
||||||
txt = _text(vN)
|
txt = _text(vN)
|
||||||
if re.search(r'boolean$', xt, re.I):
|
if re.search(r'boolean$', xt, re.I):
|
||||||
|
|||||||
@@ -1713,7 +1713,15 @@ XML-элемент: `<WebService>`. Трёхуровневая вложенно
|
|||||||
</xr:StandardAttribute>
|
</xr:StandardAttribute>
|
||||||
```
|
```
|
||||||
|
|
||||||
Значения: `TransformValues` (преобразовывать значения) | `Deny` (запретить). У измерений его пишут только регистры сведений.
|
Свойство «Режим сокращения типа», три значения:
|
||||||
|
|
||||||
|
| XML | В конфигураторе |
|
||||||
|
|-----|-----------------|
|
||||||
|
| `TransformValues` | Преобразовывать значения (по умолчанию) |
|
||||||
|
| `DeleteData` | Удалять данные |
|
||||||
|
| `Deny` | Запрещать |
|
||||||
|
|
||||||
|
У измерений его пишут только регистры сведений. `DeleteData` в выгрузках редок (7 измерений на всю УТ 11.5.27, ни одного в БП) и принимается платформами 8.3.25–8.3.27 — тот же порог, что у самого свойства.
|
||||||
|
|
||||||
Свойство именно новое: платформа 8.3.24 при загрузке молча его отбраковывает («Свойство не входит в состав объекта метаданных»), сообщая при этом об успехе.
|
Свойство именно новое: платформа 8.3.24 при загрузке молча его отбраковывает («Свойство не входит в состав объекта метаданных»), сообщая при этом об успехе.
|
||||||
|
|
||||||
|
|||||||
@@ -466,12 +466,13 @@ LineNumber дефолтные. Ключ `lineNumber` на объектной ф
|
|||||||
|
|
||||||
В `standardAttributes` указывают **только отклонения** от профиля (переопределение синонима, нетиповой fillChecking и т.п.).
|
В `standardAttributes` указывают **только отклонения** от профиля (переопределение синонима, нетиповой fillChecking и т.п.).
|
||||||
|
|
||||||
**Формат 2.20 — `TypeReductionMode`** (режим приведения типов). Платформа 8.3.27 пишет его каждому
|
**Формат 2.18 — `TypeReductionMode`** (режим приведения типов). Платформа начиная с 8.3.25 пишет его
|
||||||
стандартному реквизиту; значение выводится компилятором и в DSL обычно не указывается:
|
каждому стандартному реквизиту; значение выводится компилятором и в DSL обычно не указывается:
|
||||||
`TransformValues` для всех, кроме `Owner` — там `Deny`. Ключ `TypeReductionMode` в override оставлен
|
`TransformValues` для всех, кроме `Owner` — там `Deny`. Ключ `TypeReductionMode` в override оставлен
|
||||||
на случай отклонения от этого правила (правило выведено на корпусе acc; при расхождении в другой
|
на случай отклонения от этого правила (правило выведено на корпусе acc; при расхождении в другой
|
||||||
конфигурации значение можно задать явно). У измерений регистра сведений действует то же свойство —
|
конфигурации значение можно задать явно). У измерений регистра сведений действует то же свойство —
|
||||||
ключ реквизита `typeReductionMode` (дефолт `TransformValues`). В формате 2.17 тег не эмитится.
|
ключ реквизита `typeReductionMode` (дефолт `TransformValues`). Третье значение — `DeleteData`
|
||||||
|
(редкое: 7 измерений на всю УТ 11.5.27). В формате 2.17 тег не эмитится.
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user