mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-07-24 05:31:02 +03:00
feat(form-decompile,form-compile): userSettingPresentation контейнера ListSettings (filter/order/CA)
Контейнер настроек компоновщика (<dcsset:filter>/<order>/<conditionalAppearance>)
может нести собственный <dcsset:userSettingPresentation> — кастомную подпись
пользовательской настройки (после userSettingID). Декомпилятор кодировал контейнер
только как блок-мету "vu"/"u"/"v" (viewMode/userSettingID), теряя presentation;
компилятор не эмитил.
Дескриптор listSettings[tag] теперь — строка-код "vu" ИЛИ объект
{ meta:"vu", presentation:<текст/{ru,en}> }. Декомпилятор: Get-PresByType сохраняет
форму по xsi:type (ru-only LocalString ≠ xs:string). Компилятор: новый параметр
blockUserSettingPresentation в Emit-Filter/Order/ConditionalAppearance (+ в гейт
hasBlockMeta — иначе контейнер только-с-presentation, без items/viewMode/userSettingID,
не эмитился). Зеркало py.
Корпус 8.3.24: 6 контейнеров-presentation в 6 формах. Выборка 6 форм
(ОтветственныеЗаАктуализацию/ЗаПодписание acc+erp, ПравилаФормированияРезервов,
СтавкиНДСНоменклатуры): match 0→6, TOTAL→0. ps1==py байт-в-байт. Регресс 43/43.
Spec обновлён. Cert: раундтрип (формат платформы, позиция как в оригинале).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
9af86b7810
commit
668173121d
@@ -1,4 +1,4 @@
|
|||||||
# form-compile v1.151 — Compile 1C managed form from JSON or object metadata
|
# form-compile v1.152 — Compile 1C managed form from JSON or object metadata
|
||||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||||
param(
|
param(
|
||||||
[string]$JsonPath,
|
[string]$JsonPath,
|
||||||
@@ -1805,9 +1805,9 @@ function Emit-FilterItem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function Emit-Filter {
|
function Emit-Filter {
|
||||||
param($items, [string]$indent, $blockViewMode = $null, $blockUserSettingID = $null)
|
param($items, [string]$indent, $blockViewMode = $null, $blockUserSettingID = $null, $blockUserSettingPresentation = $null)
|
||||||
$hasItems = $items -and $items.Count -gt 0
|
$hasItems = $items -and $items.Count -gt 0
|
||||||
$hasBlockMeta = ($null -ne $blockViewMode) -or ($null -ne $blockUserSettingID)
|
$hasBlockMeta = ($null -ne $blockViewMode) -or ($null -ne $blockUserSettingID) -or ($null -ne $blockUserSettingPresentation)
|
||||||
if (-not $hasItems -and -not $hasBlockMeta) { return }
|
if (-not $hasItems -and -not $hasBlockMeta) { return }
|
||||||
X "$indent<dcsset:filter>"
|
X "$indent<dcsset:filter>"
|
||||||
foreach ($item in $items) {
|
foreach ($item in $items) {
|
||||||
@@ -1827,13 +1827,14 @@ function Emit-Filter {
|
|||||||
$uid = if ("$blockUserSettingID" -eq 'auto') { New-Guid-String } else { "$blockUserSettingID" }
|
$uid = if ("$blockUserSettingID" -eq 'auto') { New-Guid-String } else { "$blockUserSettingID" }
|
||||||
X "$indent`t<dcsset:userSettingID>$(Esc-Xml $uid)</dcsset:userSettingID>"
|
X "$indent`t<dcsset:userSettingID>$(Esc-Xml $uid)</dcsset:userSettingID>"
|
||||||
}
|
}
|
||||||
|
if ($null -ne $blockUserSettingPresentation) { Emit-USPresentation -val $blockUserSettingPresentation -tag "dcsset:userSettingPresentation" -indent "$indent`t" }
|
||||||
X "$indent</dcsset:filter>"
|
X "$indent</dcsset:filter>"
|
||||||
}
|
}
|
||||||
|
|
||||||
function Emit-Order {
|
function Emit-Order {
|
||||||
param($items, [string]$indent, [switch]$skipAuto, $blockViewMode = $null, $blockUserSettingID = $null)
|
param($items, [string]$indent, [switch]$skipAuto, $blockViewMode = $null, $blockUserSettingID = $null, $blockUserSettingPresentation = $null)
|
||||||
$hasItems = $items -and $items.Count -gt 0
|
$hasItems = $items -and $items.Count -gt 0
|
||||||
$hasBlockMeta = ($null -ne $blockViewMode) -or ($null -ne $blockUserSettingID)
|
$hasBlockMeta = ($null -ne $blockViewMode) -or ($null -ne $blockUserSettingID) -or ($null -ne $blockUserSettingPresentation)
|
||||||
if (-not $hasItems -and -not $hasBlockMeta) { return }
|
if (-not $hasItems -and -not $hasBlockMeta) { return }
|
||||||
X "$indent<dcsset:order>"
|
X "$indent<dcsset:order>"
|
||||||
foreach ($item in $items) {
|
foreach ($item in $items) {
|
||||||
@@ -1867,6 +1868,7 @@ function Emit-Order {
|
|||||||
$uid = if ("$blockUserSettingID" -eq 'auto') { New-Guid-String } else { "$blockUserSettingID" }
|
$uid = if ("$blockUserSettingID" -eq 'auto') { New-Guid-String } else { "$blockUserSettingID" }
|
||||||
X "$indent`t<dcsset:userSettingID>$(Esc-Xml $uid)</dcsset:userSettingID>"
|
X "$indent`t<dcsset:userSettingID>$(Esc-Xml $uid)</dcsset:userSettingID>"
|
||||||
}
|
}
|
||||||
|
if ($null -ne $blockUserSettingPresentation) { Emit-USPresentation -val $blockUserSettingPresentation -tag "dcsset:userSettingPresentation" -indent "$indent`t" }
|
||||||
X "$indent</dcsset:order>"
|
X "$indent</dcsset:order>"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1963,9 +1965,9 @@ function Emit-AppearanceValue {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function Emit-ConditionalAppearance {
|
function Emit-ConditionalAppearance {
|
||||||
param($items, [string]$indent, $blockViewMode = $null, $blockUserSettingID = $null, [string]$wrapTag = 'dcsset:conditionalAppearance')
|
param($items, [string]$indent, $blockViewMode = $null, $blockUserSettingID = $null, [string]$wrapTag = 'dcsset:conditionalAppearance', $blockUserSettingPresentation = $null)
|
||||||
$hasItems = $items -and $items.Count -gt 0
|
$hasItems = $items -and $items.Count -gt 0
|
||||||
$hasBlockMeta = ($null -ne $blockViewMode) -or ($null -ne $blockUserSettingID)
|
$hasBlockMeta = ($null -ne $blockViewMode) -or ($null -ne $blockUserSettingID) -or ($null -ne $blockUserSettingPresentation)
|
||||||
if (-not $hasItems -and -not $hasBlockMeta) { return }
|
if (-not $hasItems -and -not $hasBlockMeta) { return }
|
||||||
X "$indent<$wrapTag>"
|
X "$indent<$wrapTag>"
|
||||||
foreach ($ca in $items) {
|
foreach ($ca in $items) {
|
||||||
@@ -2020,6 +2022,7 @@ function Emit-ConditionalAppearance {
|
|||||||
$uid = if ("$blockUserSettingID" -eq 'auto') { New-Guid-String } else { "$blockUserSettingID" }
|
$uid = if ("$blockUserSettingID" -eq 'auto') { New-Guid-String } else { "$blockUserSettingID" }
|
||||||
X "$indent`t<dcsset:userSettingID>$(Esc-Xml $uid)</dcsset:userSettingID>"
|
X "$indent`t<dcsset:userSettingID>$(Esc-Xml $uid)</dcsset:userSettingID>"
|
||||||
}
|
}
|
||||||
|
if ($null -ne $blockUserSettingPresentation) { Emit-USPresentation -val $blockUserSettingPresentation -tag "dcsset:userSettingPresentation" -indent "$indent`t" }
|
||||||
X "$indent</$wrapTag>"
|
X "$indent</$wrapTag>"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5727,12 +5730,17 @@ function Emit-Attributes {
|
|||||||
# Частичная/минимальная форма скелета — эмитим ТОЛЬКО указанные части с их блок-метой.
|
# Частичная/минимальная форма скелета — эмитим ТОЛЬКО указанные части с их блок-метой.
|
||||||
# meta: 'v'=viewMode, 'u'=userSettingID (контейнеры); itemsViewMode/itemsUserSettingID → present.
|
# meta: 'v'=viewMode, 'u'=userSettingID (контейнеры); itemsViewMode/itemsUserSettingID → present.
|
||||||
foreach ($prop in $st.listSettings.PSObject.Properties) {
|
foreach ($prop in $st.listSettings.PSObject.Properties) {
|
||||||
$tag = $prop.Name; $meta = "$($prop.Value)"
|
$tag = $prop.Name; $pv = $prop.Value
|
||||||
|
# Значение дескриптора: строка-код "vu" ИЛИ объект { meta:"vu", presentation:<текст/ML> }
|
||||||
|
# (контейнер несёт собственный userSettingPresentation — кастомную подпись настройки).
|
||||||
|
if (($pv -is [PSCustomObject]) -or ($pv -is [System.Collections.IDictionary])) {
|
||||||
|
$meta = "$(Get-Prop $pv 'meta')"; $bpres = Get-Prop $pv 'presentation'
|
||||||
|
} else { $meta = "$pv"; $bpres = $null }
|
||||||
$bvm = if ($meta -match 'v') { 'Normal' } else { $null }
|
$bvm = if ($meta -match 'v') { 'Normal' } else { $null }
|
||||||
switch ($tag) {
|
switch ($tag) {
|
||||||
'filter' { $bus = if ($meta -match 'u') { $script:CANON_FILTER_ID } else { $null }; Emit-Filter -items $st.filter -indent $lsi -blockViewMode $bvm -blockUserSettingID $bus }
|
'filter' { $bus = if ($meta -match 'u') { $script:CANON_FILTER_ID } else { $null }; Emit-Filter -items $st.filter -indent $lsi -blockViewMode $bvm -blockUserSettingID $bus -blockUserSettingPresentation $bpres }
|
||||||
'order' { $bus = if ($meta -match 'u') { $script:CANON_ORDER_ID } else { $null }; Emit-Order -items $st.order -indent $lsi -blockViewMode $bvm -blockUserSettingID $bus }
|
'order' { $bus = if ($meta -match 'u') { $script:CANON_ORDER_ID } else { $null }; Emit-Order -items $st.order -indent $lsi -blockViewMode $bvm -blockUserSettingID $bus -blockUserSettingPresentation $bpres }
|
||||||
'conditionalAppearance' { $bus = if ($meta -match 'u') { $script:CANON_CA_ID } else { $null }; Emit-ConditionalAppearance -items $st.conditionalAppearance -indent $lsi -blockViewMode $bvm -blockUserSettingID $bus }
|
'conditionalAppearance' { $bus = if ($meta -match 'u') { $script:CANON_CA_ID } else { $null }; Emit-ConditionalAppearance -items $st.conditionalAppearance -indent $lsi -blockViewMode $bvm -blockUserSettingID $bus -blockUserSettingPresentation $bpres }
|
||||||
'itemsViewMode' { X "$lsi<dcsset:itemsViewMode>Normal</dcsset:itemsViewMode>" }
|
'itemsViewMode' { X "$lsi<dcsset:itemsViewMode>Normal</dcsset:itemsViewMode>" }
|
||||||
'itemsUserSettingID' { X "$lsi<dcsset:itemsUserSettingID>$($script:CANON_ITEMS_ID)</dcsset:itemsUserSettingID>" }
|
'itemsUserSettingID' { X "$lsi<dcsset:itemsUserSettingID>$($script:CANON_ITEMS_ID)</dcsset:itemsUserSettingID>" }
|
||||||
'structure' { Emit-ListGrouping (Get-ListGroupingValue $st) $lsi }
|
'structure' { Emit-ListGrouping (Get-ListGroupingValue $st) $lsi }
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
# form-compile v1.151 — Compile 1C managed form from JSON or object metadata
|
# form-compile v1.152 — Compile 1C managed form from JSON or object metadata
|
||||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||||
import argparse
|
import argparse
|
||||||
import copy
|
import copy
|
||||||
@@ -1533,9 +1533,9 @@ def emit_filter_item(lines, item, indent):
|
|||||||
lines.append(f'{indent}</dcsset:item>')
|
lines.append(f'{indent}</dcsset:item>')
|
||||||
|
|
||||||
|
|
||||||
def emit_filter(lines, items, indent, block_view_mode=None, block_user_setting_id=None):
|
def emit_filter(lines, items, indent, block_view_mode=None, block_user_setting_id=None, block_user_setting_presentation=None):
|
||||||
has_items = bool(items) and len(items) > 0
|
has_items = bool(items) and len(items) > 0
|
||||||
has_block_meta = (block_view_mode is not None) or (block_user_setting_id is not None)
|
has_block_meta = (block_view_mode is not None) or (block_user_setting_id is not None) or (block_user_setting_presentation is not None)
|
||||||
if not has_items and not has_block_meta:
|
if not has_items and not has_block_meta:
|
||||||
return
|
return
|
||||||
lines.append(f'{indent}<dcsset:filter>')
|
lines.append(f'{indent}<dcsset:filter>')
|
||||||
@@ -1561,12 +1561,14 @@ def emit_filter(lines, items, indent, block_view_mode=None, block_user_setting_i
|
|||||||
if block_user_setting_id is not None:
|
if block_user_setting_id is not None:
|
||||||
uid = new_uuid() if str(block_user_setting_id) == 'auto' else str(block_user_setting_id)
|
uid = new_uuid() if str(block_user_setting_id) == 'auto' else str(block_user_setting_id)
|
||||||
lines.append(f'{indent}\t<dcsset:userSettingID>{esc_xml(uid)}</dcsset:userSettingID>')
|
lines.append(f'{indent}\t<dcsset:userSettingID>{esc_xml(uid)}</dcsset:userSettingID>')
|
||||||
|
if block_user_setting_presentation is not None:
|
||||||
|
emit_us_presentation(lines, f'{indent}\t', 'dcsset:userSettingPresentation', block_user_setting_presentation)
|
||||||
lines.append(f'{indent}</dcsset:filter>')
|
lines.append(f'{indent}</dcsset:filter>')
|
||||||
|
|
||||||
|
|
||||||
def emit_order(lines, items, indent, skip_auto=False, block_view_mode=None, block_user_setting_id=None):
|
def emit_order(lines, items, indent, skip_auto=False, block_view_mode=None, block_user_setting_id=None, block_user_setting_presentation=None):
|
||||||
has_items = bool(items) and len(items) > 0
|
has_items = bool(items) and len(items) > 0
|
||||||
has_block_meta = (block_view_mode is not None) or (block_user_setting_id is not None)
|
has_block_meta = (block_view_mode is not None) or (block_user_setting_id is not None) or (block_user_setting_presentation is not None)
|
||||||
if not has_items and not has_block_meta:
|
if not has_items and not has_block_meta:
|
||||||
return
|
return
|
||||||
lines.append(f'{indent}<dcsset:order>')
|
lines.append(f'{indent}<dcsset:order>')
|
||||||
@@ -1610,6 +1612,8 @@ def emit_order(lines, items, indent, skip_auto=False, block_view_mode=None, bloc
|
|||||||
if block_user_setting_id is not None:
|
if block_user_setting_id is not None:
|
||||||
uid = new_uuid() if str(block_user_setting_id) == 'auto' else str(block_user_setting_id)
|
uid = new_uuid() if str(block_user_setting_id) == 'auto' else str(block_user_setting_id)
|
||||||
lines.append(f'{indent}\t<dcsset:userSettingID>{esc_xml(uid)}</dcsset:userSettingID>')
|
lines.append(f'{indent}\t<dcsset:userSettingID>{esc_xml(uid)}</dcsset:userSettingID>')
|
||||||
|
if block_user_setting_presentation is not None:
|
||||||
|
emit_us_presentation(lines, f'{indent}\t', 'dcsset:userSettingPresentation', block_user_setting_presentation)
|
||||||
lines.append(f'{indent}</dcsset:order>')
|
lines.append(f'{indent}</dcsset:order>')
|
||||||
|
|
||||||
|
|
||||||
@@ -1870,9 +1874,9 @@ def emit_restrict_block(lines, tag, ur, indent):
|
|||||||
lines.append(f'{indent}</dcssch:{tag}>')
|
lines.append(f'{indent}</dcssch:{tag}>')
|
||||||
|
|
||||||
|
|
||||||
def emit_conditional_appearance(lines, items, indent, block_view_mode=None, block_user_setting_id=None, wrap_tag='dcsset:conditionalAppearance'):
|
def emit_conditional_appearance(lines, items, indent, block_view_mode=None, block_user_setting_id=None, wrap_tag='dcsset:conditionalAppearance', block_user_setting_presentation=None):
|
||||||
has_items = bool(items) and len(items) > 0
|
has_items = bool(items) and len(items) > 0
|
||||||
has_block_meta = (block_view_mode is not None) or (block_user_setting_id is not None)
|
has_block_meta = (block_view_mode is not None) or (block_user_setting_id is not None) or (block_user_setting_presentation is not None)
|
||||||
if not has_items and not has_block_meta:
|
if not has_items and not has_block_meta:
|
||||||
return
|
return
|
||||||
lines.append(f'{indent}<{wrap_tag}>')
|
lines.append(f'{indent}<{wrap_tag}>')
|
||||||
@@ -1928,6 +1932,8 @@ def emit_conditional_appearance(lines, items, indent, block_view_mode=None, bloc
|
|||||||
if block_user_setting_id is not None:
|
if block_user_setting_id is not None:
|
||||||
uid = new_uuid() if str(block_user_setting_id) == 'auto' else str(block_user_setting_id)
|
uid = new_uuid() if str(block_user_setting_id) == 'auto' else str(block_user_setting_id)
|
||||||
lines.append(f'{indent}\t<dcsset:userSettingID>{esc_xml(uid)}</dcsset:userSettingID>')
|
lines.append(f'{indent}\t<dcsset:userSettingID>{esc_xml(uid)}</dcsset:userSettingID>')
|
||||||
|
if block_user_setting_presentation is not None:
|
||||||
|
emit_us_presentation(lines, f'{indent}\t', 'dcsset:userSettingPresentation', block_user_setting_presentation)
|
||||||
lines.append(f'{indent}</{wrap_tag}>')
|
lines.append(f'{indent}</{wrap_tag}>')
|
||||||
|
|
||||||
|
|
||||||
@@ -5479,18 +5485,23 @@ def emit_attributes(lines, attrs, indent, conditional_appearance=None):
|
|||||||
ls_shape = s.get('listSettings')
|
ls_shape = s.get('listSettings')
|
||||||
if ls_shape is not None:
|
if ls_shape is not None:
|
||||||
# Частичная/минимальная форма скелета — эмитим ТОЛЬКО указанные части с их блок-метой.
|
# Частичная/минимальная форма скелета — эмитим ТОЛЬКО указанные части с их блок-метой.
|
||||||
for tag, meta in ls_shape.items():
|
for tag, pv in ls_shape.items():
|
||||||
meta = str(meta)
|
# Значение дескриптора: строка-код "vu" ИЛИ объект {meta, presentation}
|
||||||
|
# (контейнер несёт собственный userSettingPresentation — подпись настройки).
|
||||||
|
if isinstance(pv, dict):
|
||||||
|
meta = str(pv.get('meta', '')); bpres = pv.get('presentation')
|
||||||
|
else:
|
||||||
|
meta = str(pv); bpres = None
|
||||||
bvm = 'Normal' if 'v' in meta else None
|
bvm = 'Normal' if 'v' in meta else None
|
||||||
if tag == 'filter':
|
if tag == 'filter':
|
||||||
bus = CANON_FILTER_ID if 'u' in meta else None
|
bus = CANON_FILTER_ID if 'u' in meta else None
|
||||||
emit_filter(lines, s.get('filter'), lsi, block_view_mode=bvm, block_user_setting_id=bus)
|
emit_filter(lines, s.get('filter'), lsi, block_view_mode=bvm, block_user_setting_id=bus, block_user_setting_presentation=bpres)
|
||||||
elif tag == 'order':
|
elif tag == 'order':
|
||||||
bus = CANON_ORDER_ID if 'u' in meta else None
|
bus = CANON_ORDER_ID if 'u' in meta else None
|
||||||
emit_order(lines, s.get('order'), lsi, block_view_mode=bvm, block_user_setting_id=bus)
|
emit_order(lines, s.get('order'), lsi, block_view_mode=bvm, block_user_setting_id=bus, block_user_setting_presentation=bpres)
|
||||||
elif tag == 'conditionalAppearance':
|
elif tag == 'conditionalAppearance':
|
||||||
bus = CANON_CA_ID if 'u' in meta else None
|
bus = CANON_CA_ID if 'u' in meta else None
|
||||||
emit_conditional_appearance(lines, s.get('conditionalAppearance'), lsi, block_view_mode=bvm, block_user_setting_id=bus)
|
emit_conditional_appearance(lines, s.get('conditionalAppearance'), lsi, block_view_mode=bvm, block_user_setting_id=bus, block_user_setting_presentation=bpres)
|
||||||
elif tag == 'itemsViewMode':
|
elif tag == 'itemsViewMode':
|
||||||
lines.append(f'{lsi}<dcsset:itemsViewMode>Normal</dcsset:itemsViewMode>')
|
lines.append(f'{lsi}<dcsset:itemsViewMode>Normal</dcsset:itemsViewMode>')
|
||||||
elif tag == 'itemsUserSettingID':
|
elif tag == 'itemsUserSettingID':
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# form-decompile v0.126 — Decompile 1C managed Form.xml to JSON DSL (draft)
|
# form-decompile v0.127 — Decompile 1C managed Form.xml to JSON DSL (draft)
|
||||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||||
# ВНИМАНИЕ: раундтрип не гарантируется. Навык исключён из авто-использования моделью.
|
# ВНИМАНИЕ: раундтрип не гарантируется. Навык исключён из авто-использования моделью.
|
||||||
param(
|
param(
|
||||||
@@ -134,7 +134,14 @@ function Get-ListSettingsShape {
|
|||||||
if ($tag -in @('filter','order','conditionalAppearance')) {
|
if ($tag -in @('filter','order','conditionalAppearance')) {
|
||||||
$hasVM = $null -ne $child.SelectSingleNode("dcsset:viewMode", $ns)
|
$hasVM = $null -ne $child.SelectSingleNode("dcsset:viewMode", $ns)
|
||||||
$hasUS = $null -ne $child.SelectSingleNode("dcsset:userSettingID", $ns)
|
$hasUS = $null -ne $child.SelectSingleNode("dcsset:userSettingID", $ns)
|
||||||
$shape[$tag] = "$(if ($hasVM) {'v'})$(if ($hasUS) {'u'})"
|
$code = "$(if ($hasVM) {'v'})$(if ($hasUS) {'u'})"
|
||||||
|
# Контейнер может нести собственный <dcsset:userSettingPresentation> (кастомная подпись
|
||||||
|
# настройки) — сохраняем форму по xsi:type (Get-PresByType: ru-only LocalString ≠ xs:string).
|
||||||
|
$uspNode = $child.SelectSingleNode("dcsset:userSettingPresentation", $ns)
|
||||||
|
if ($uspNode) {
|
||||||
|
$usp = Get-PresByType $uspNode
|
||||||
|
$shape[$tag] = [ordered]@{ meta = $code; presentation = $usp }
|
||||||
|
} else { $shape[$tag] = $code }
|
||||||
} elseif ($tag -eq 'itemsViewMode') { $shape['itemsViewMode'] = $true }
|
} elseif ($tag -eq 'itemsViewMode') { $shape['itemsViewMode'] = $true }
|
||||||
elseif ($tag -eq 'itemsUserSettingID') { $shape['itemsUserSettingID'] = $true }
|
elseif ($tag -eq 'itemsUserSettingID') { $shape['itemsUserSettingID'] = $true }
|
||||||
elseif ($tag -eq 'item') { if ($hasGrouping) { $shape['structure'] = $true } else { return $null } }
|
elseif ($tag -eq 'item') { if ($hasGrouping) { $shape['structure'] = $true } else { return $null } }
|
||||||
|
|||||||
@@ -959,7 +959,7 @@ Forgiving-синонимы типа: XML-имя (`SpreadSheetDocumentField`) и
|
|||||||
|
|
||||||
Пустой блок настроек компоновщика (`ListSettings`) генерируется автоматически (каноничный полный скелет платформы — filter+order+conditionalAppearance+itemsViewMode+itemsUserSettingID, ~93% форм); указывать ничего не нужно.
|
Пустой блок настроек компоновщика (`ListSettings`) генерируется автоматически (каноничный полный скелет платформы — filter+order+conditionalAppearance+itemsViewMode+itemsUserSettingID, ~93% форм); указывать ничего не нужно.
|
||||||
|
|
||||||
| `listSettings` | object | **Дескриптор формы скелета `<ListSettings>`** — только для НЕ-каноничных (частичных/минимальных) форм. Ordered-карта present top-level элементов: контейнеры `filter`/`order`/`conditionalAppearance` → блок-мета (`"vu"`=viewMode+userSettingID, `"u"`=только userSettingID, `"v"`, `""`); `itemsViewMode`/`itemsUserSettingID` → `true`. Компилятор эмитит ТОЛЬКО указанные части (контент берёт из `filter`/`order`/`conditionalAppearance`). Нет ключа → полный каноничный скелет. Пустой объект `{}` → self-closing `<ListSettings/>` (оригинал без скелета). Декомпилятор пишет дескриптор только для отклонений от канона |
|
| `listSettings` | object | **Дескриптор формы скелета `<ListSettings>`** — только для НЕ-каноничных (частичных/минимальных) форм. Ordered-карта present top-level элементов: контейнеры `filter`/`order`/`conditionalAppearance` → блок-мета (`"vu"`=viewMode+userSettingID, `"u"`=только userSettingID, `"v"`, `""`); `itemsViewMode`/`itemsUserSettingID` → `true`. Если контейнер несёт собственный `userSettingPresentation` (кастомная подпись настройки), значение — объект `{ meta: "u", presentation: "Текст" | {ru,en} }` (presentation по форме значения: строка → `xs:string`, объект → `LocalStringType`). Компилятор эмитит ТОЛЬКО указанные части (контент берёт из `filter`/`order`/`conditionalAppearance`). Нет ключа → полный каноничный скелет. Пустой объект `{}` → self-closing `<ListSettings/>` (оригинал без скелета). Декомпилятор пишет дескриптор только для отклонений от канона |
|
||||||
|
|
||||||
#### parameters — параметры схемы дин-списка
|
#### parameters — параметры схемы дин-списка
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user