mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-08-26 21:19:42 +03:00
fix(cfe-borrow): секции формы отбираются по имени, а не по позиции
Свойства уровня формы собирались до первой «визуальной» секции. В этот
список входил CommandSet, который в реальных формах стоит В СЕРЕДИНЕ блока
свойств: у всех 794 форм документов ERP с CommandSet он предшествует
AutoCommandBar, а AutoTime/UsePostingMode/RepostOnWrite идут после него.
Отсечка теряла весь хвост — в одном ERP это 2062 формы.
Отказа загрузки это не давало: платформа принимает форму и молча подставляет
дефолты. На Document.ЧекККМ.ФормаДокумента (УТ) AutoTime DontUse становился
CurrentOrLast, UsePostingMode Regular — Auto; исключённые стандартные команды
(Провести, Записать, Отменить проведение) возвращались в панель.
Граница теперь — AutoCommandBar: он есть в 100% из 30223 форм корпуса, и ни
одно свойство никогда не стоит после него. Отбрасываются явным списком
Events/Attributes/Commands/Parameters/CommandInterface и свойства, значение
которых — имя реквизита формы (ReportResult, DetailsData, VariantAppearance,
GroupList): реквизиты не заимствуются, ссылка повисла бы.
Заодно разобран конфаунд коммита 7abe26af, менявшего три вещи разом с одной
атрибуцией ошибки. По эталонам Конфигуратора («Добавить в расширение»):
- корневой CommandSet переносится дословно — вырезание было ошибкой;
- вложенный CommandSet выбрасывается ЦЕЛИКОМ, а не опустошается до пустого
контейнера, как делалось;
- RowPictureDataPath — путь к данным, а не индекс картинки: сохраняется при
заимствовании основного реквизита (Объект.Товары.РасхождениеЗаказ) и
вырезается без него (Список.DefaultPicture). Переехал в formBindingDataTags.
Спецификация форм утверждала, что свойства идут до CommandSet/AutoCommandBar —
именно это заблуждение и было закодировано. Заменено фактическим порядком
секций, выведенным из корпуса (0 нарушений на 30223 формах). Там же поправлены
значения перечислений AutoTime/UsePostingMode/ReportFormType, которых в корпусе
нет ни одного.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
78fc3ba71a
commit
0737a79522
@@ -1,4 +1,4 @@
|
|||||||
# cfe-borrow v1.25 — Borrow objects from configuration into extension (CFE) (не переносить FoldersOnTop — платформа его не хранит)
|
# cfe-borrow v1.26 — Borrow objects from configuration into extension (CFE)
|
||||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||||
param(
|
param(
|
||||||
[Parameter(Mandatory)][string]$ExtensionPath,
|
[Parameter(Mandatory)][string]$ExtensionPath,
|
||||||
@@ -16,9 +16,18 @@ function Warn([string]$msg) { Write-Host "[WARN] $msg" }
|
|||||||
# Form data-binding tags (value = attribute path). A binding survives only if its root
|
# Form data-binding tags (value = attribute path). A binding survives only if its root
|
||||||
# attribute is borrowed into the form's <Attributes>; otherwise it must be stripped or the
|
# attribute is borrowed into the form's <Attributes>; otherwise it must be stripped or the
|
||||||
# platform rejects the form with "Неверный путь к данным" on load.
|
# platform rejects the form with "Неверный путь к данным" on load.
|
||||||
$script:formBindingDataTags = @('DataPath','TitleDataPath','FooterDataPath','HeaderDataPath','MultipleValueDataPath','MultipleValuePresentDataPath')
|
# RowPictureDataPath тоже путь к данным («Объект.Товары.РасхождениеЗаказ», «Список.DefaultPicture»),
|
||||||
|
# а не индекс картинки: эталон Конфигуратора сохраняет его с заимствованным основным реквизитом
|
||||||
|
# и выбрасывает без него — то же правило, что у остальных путей.
|
||||||
|
$script:formBindingDataTags = @('DataPath','TitleDataPath','FooterDataPath','HeaderDataPath','MultipleValueDataPath','MultipleValuePresentDataPath','RowPictureDataPath')
|
||||||
# Picture-path binding tags (value = picture index path, never a data attribute) — always stripped in the skeleton.
|
# Picture-path binding tags (value = picture index path, never a data attribute) — always stripped in the skeleton.
|
||||||
$script:formBindingPictureTags = @('RowPictureDataPath','MultipleValuePictureDataPath')
|
$script:formBindingPictureTags = @('MultipleValuePictureDataPath')
|
||||||
|
|
||||||
|
# Прямые дети <Form>, которые в заимствованную форму не переносятся.
|
||||||
|
# Структурные секции: AutoCommandBar и ChildItems забираются отдельно, остальные выбрасываются целиком.
|
||||||
|
$script:formStructuralSections = @('Events','Attributes','Commands','Parameters','CommandInterface')
|
||||||
|
# Свойства формы, значение которых — имя реквизита формы (реквизиты не заимствуются, ссылка повиснет).
|
||||||
|
$script:formAttributeRefProps = @('ReportResult','DetailsData','VariantAppearance','GroupList')
|
||||||
|
|
||||||
# Strip data-binding tags whose root attribute isn't borrowed.
|
# Strip data-binding tags whose root attribute isn't borrowed.
|
||||||
# $keepObjekt=$true (BorrowMainAttribute): keep Объект.* data bindings, strip the rest.
|
# $keepObjekt=$true (BorrowMainAttribute): keep Объект.* data bindings, strip the rest.
|
||||||
@@ -687,25 +696,30 @@ function Borrow-Form {
|
|||||||
# (e.g. a 2.13 form inside a 2.17 extension). The platform itself upgrades the form to the root version.
|
# (e.g. a 2.13 form inside a 2.17 extension). The platform itself upgrades the form to the root version.
|
||||||
$formVersion = $script:formatVersion
|
$formVersion = $script:formatVersion
|
||||||
|
|
||||||
# Find direct children: form properties, AutoCommandBar, ChildItems
|
# Find direct children: form properties, AutoCommandBar, ChildItems.
|
||||||
|
# Секции формы отбираются по имени, а не по позиции: свойства лежат и до, и после <CommandSet>
|
||||||
|
# (корпусная проверка: у всех 794 форм документов ERP с CommandSet он стоит раньше AutoCommandBar,
|
||||||
|
# а AutoTime/UsePostingMode/RepostOnWrite — после него). Позиционная отсечка теряла весь хвост,
|
||||||
|
# и платформа молча подставляла дефолты вместо потерянных свойств.
|
||||||
$srcAutoCmd = $null
|
$srcAutoCmd = $null
|
||||||
$srcChildItems = $null
|
$srcChildItems = $null
|
||||||
$formProps = @()
|
$formProps = @()
|
||||||
$reachedVisual = $false
|
|
||||||
foreach ($fc in $srcFormEl.ChildNodes) {
|
foreach ($fc in $srcFormEl.ChildNodes) {
|
||||||
if ($fc.NodeType -ne 'Element') { continue }
|
if ($fc.NodeType -ne 'Element') { continue }
|
||||||
if ($fc.LocalName -eq 'AutoCommandBar' -and -not $srcAutoCmd) {
|
if ($fc.LocalName -eq 'AutoCommandBar' -and -not $srcAutoCmd) {
|
||||||
$reachedVisual = $true; $srcAutoCmd = $fc; continue
|
$srcAutoCmd = $fc; continue
|
||||||
}
|
}
|
||||||
if ($fc.LocalName -eq 'ChildItems' -and -not $srcChildItems) {
|
if ($fc.LocalName -eq 'ChildItems' -and -not $srcChildItems) {
|
||||||
$reachedVisual = $true; $srcChildItems = $fc; continue
|
$srcChildItems = $fc; continue
|
||||||
}
|
|
||||||
if ($fc.LocalName -eq 'Events' -or $fc.LocalName -eq 'Attributes' -or $fc.LocalName -eq 'Commands' -or $fc.LocalName -eq 'Parameters' -or $fc.LocalName -eq 'CommandSet') {
|
|
||||||
$reachedVisual = $true; continue
|
|
||||||
}
|
|
||||||
if (-not $reachedVisual) {
|
|
||||||
$formProps += $fc.OuterXml
|
|
||||||
}
|
}
|
||||||
|
# Структурные секции: в расширении их содержимое недействительно (обработчики, команды и
|
||||||
|
# параметры базовой формы, ссылки командного интерфейса на команды базовой конфигурации).
|
||||||
|
if ($script:formStructuralSections -ccontains $fc.LocalName) { continue }
|
||||||
|
# Свойства, значение которых — имя реквизита формы. Реквизиты в заимствованную форму не
|
||||||
|
# переносятся, поэтому Конфигуратор такие свойства выбрасывает (проверено на форме отчёта:
|
||||||
|
# ReportResult и DetailsData выброшены, CustomSettingsFolder — имя элемента — сохранён).
|
||||||
|
if ($script:formAttributeRefProps -ccontains $fc.LocalName) { continue }
|
||||||
|
$formProps += $fc.OuterXml
|
||||||
}
|
}
|
||||||
|
|
||||||
# Get OuterXml and strip redundant namespace redeclarations (they're on root <Form>)
|
# Get OuterXml and strip redundant namespace redeclarations (they're on root <Form>)
|
||||||
@@ -723,8 +737,10 @@ function Borrow-Form {
|
|||||||
$autoCmdXml = [regex]::Replace($autoCmdXml, $nsStripPattern, '')
|
$autoCmdXml = [regex]::Replace($autoCmdXml, $nsStripPattern, '')
|
||||||
$autoCmdXml = [regex]::Replace($autoCmdXml, '<CommandName>[^<]*</CommandName>', '<CommandName>0</CommandName>')
|
$autoCmdXml = [regex]::Replace($autoCmdXml, '<CommandName>[^<]*</CommandName>', '<CommandName>0</CommandName>')
|
||||||
$autoCmdXml = $autoCmdXml -replace '<Autofill>true</Autofill>', '<Autofill>false</Autofill>'
|
$autoCmdXml = $autoCmdXml -replace '<Autofill>true</Autofill>', '<Autofill>false</Autofill>'
|
||||||
# Strip ExcludedCommand (references to standard commands invalid in extension)
|
# Вложенный CommandSet выбрасывается целиком, а не опустошается: Конфигуратор в заимствованной
|
||||||
$autoCmdXml = [regex]::Replace($autoCmdXml, '\s*<ExcludedCommand>[^<]*</ExcludedCommand>', '')
|
# форме оставляет только корневой (тот идёт свойством формы, здесь его нет).
|
||||||
|
$autoCmdXml = [regex]::Replace($autoCmdXml, '(?s)\s*<CommandSet>.*?</CommandSet>', '')
|
||||||
|
$autoCmdXml = [regex]::Replace($autoCmdXml, '\s*<CommandSet/>', '')
|
||||||
# Strip data-binding tags whose root attribute isn't borrowed
|
# Strip data-binding tags whose root attribute isn't borrowed
|
||||||
$autoCmdXml = Strip-FormBindings $autoCmdXml ([bool]$BorrowMainAttr)
|
$autoCmdXml = Strip-FormBindings $autoCmdXml ([bool]$BorrowMainAttr)
|
||||||
if (-not $BorrowMainAttr) { $autoCmdXml = Rewrite-ChoiceParameterLinks $autoCmdXml $srcAttrUuids }
|
if (-not $BorrowMainAttr) { $autoCmdXml = Rewrite-ChoiceParameterLinks $autoCmdXml $srcAttrUuids }
|
||||||
@@ -741,8 +757,9 @@ function Borrow-Form {
|
|||||||
# (DataPath/TitleDataPath/FooterDataPath/HeaderDataPath/MultipleValue*/RowPicture*)
|
# (DataPath/TitleDataPath/FooterDataPath/HeaderDataPath/MultipleValue*/RowPicture*)
|
||||||
$childItemsXml = Strip-FormBindings $childItemsXml ([bool]$BorrowMainAttr)
|
$childItemsXml = Strip-FormBindings $childItemsXml ([bool]$BorrowMainAttr)
|
||||||
if (-not $BorrowMainAttr) { $childItemsXml = Rewrite-ChoiceParameterLinks $childItemsXml $srcAttrUuids }
|
if (-not $BorrowMainAttr) { $childItemsXml = Rewrite-ChoiceParameterLinks $childItemsXml $srcAttrUuids }
|
||||||
# Strip ExcludedCommand in nested AutoCommandBars (references to standard commands invalid in extension)
|
# Вложенные CommandSet (у таблиц, полей табличного документа и т.п.) — целиком, см. выше
|
||||||
$childItemsXml = [regex]::Replace($childItemsXml, '\s*<ExcludedCommand>[^<]*</ExcludedCommand>', '')
|
$childItemsXml = [regex]::Replace($childItemsXml, '(?s)\s*<CommandSet>.*?</CommandSet>', '')
|
||||||
|
$childItemsXml = [regex]::Replace($childItemsXml, '\s*<CommandSet/>', '')
|
||||||
# Strip TypeLink blocks with human-readable DataPath (Items.XXX — can't convert to UUID)
|
# Strip TypeLink blocks with human-readable DataPath (Items.XXX — can't convert to UUID)
|
||||||
$childItemsXml = [regex]::Replace($childItemsXml, '(?s)\s*<TypeLink>\s*<xr:DataPath>Items\.[^<]*</xr:DataPath>.*?</TypeLink>', '')
|
$childItemsXml = [regex]::Replace($childItemsXml, '(?s)\s*<TypeLink>\s*<xr:DataPath>Items\.[^<]*</xr:DataPath>.*?</TypeLink>', '')
|
||||||
# Strip element-level Events (base form handlers not in extension)
|
# Strip element-level Events (base form handlers not in extension)
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
# cfe-borrow v1.25 — Borrow objects from configuration into extension (CFE) (не переносить FoldersOnTop — платформа его не хранит)
|
# cfe-borrow v1.26 — Borrow objects from configuration into extension (CFE)
|
||||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
@@ -39,9 +39,18 @@ V8_NS = "http://v8.1c.ru/8.1/data/core"
|
|||||||
# Form data-binding tags (value = attribute path). A binding survives only if its root
|
# Form data-binding tags (value = attribute path). A binding survives only if its root
|
||||||
# attribute is borrowed into the form's <Attributes>; otherwise it must be stripped or the
|
# attribute is borrowed into the form's <Attributes>; otherwise it must be stripped or the
|
||||||
# platform rejects the form with "Неверный путь к данным" on load.
|
# platform rejects the form with "Неверный путь к данным" on load.
|
||||||
FORM_BINDING_DATA_TAGS = ["DataPath", "TitleDataPath", "FooterDataPath", "HeaderDataPath", "MultipleValueDataPath", "MultipleValuePresentDataPath"]
|
# RowPictureDataPath тоже путь к данным («Объект.Товары.РасхождениеЗаказ», «Список.DefaultPicture»),
|
||||||
|
# а не индекс картинки: эталон Конфигуратора сохраняет его с заимствованным основным реквизитом
|
||||||
|
# и выбрасывает без него — то же правило, что у остальных путей.
|
||||||
|
FORM_BINDING_DATA_TAGS = ["DataPath", "TitleDataPath", "FooterDataPath", "HeaderDataPath", "MultipleValueDataPath", "MultipleValuePresentDataPath", "RowPictureDataPath"]
|
||||||
# Picture-path binding tags (value = picture index path, never a data attribute) — always stripped in the skeleton.
|
# Picture-path binding tags (value = picture index path, never a data attribute) — always stripped in the skeleton.
|
||||||
FORM_BINDING_PICTURE_TAGS = ["RowPictureDataPath", "MultipleValuePictureDataPath"]
|
FORM_BINDING_PICTURE_TAGS = ["MultipleValuePictureDataPath"]
|
||||||
|
|
||||||
|
# Прямые дети <Form>, которые в заимствованную форму не переносятся.
|
||||||
|
# Структурные секции: AutoCommandBar и ChildItems забираются отдельно, остальные выбрасываются целиком.
|
||||||
|
FORM_STRUCTURAL_SECTIONS = ("Events", "Attributes", "Commands", "Parameters", "CommandInterface")
|
||||||
|
# Свойства формы, значение которых — имя реквизита формы (реквизиты не заимствуются, ссылка повиснет).
|
||||||
|
FORM_ATTRIBUTE_REF_PROPS = ("ReportResult", "DetailsData", "VariantAppearance", "GroupList")
|
||||||
|
|
||||||
|
|
||||||
def strip_form_bindings(xml, keep_objekt):
|
def strip_form_bindings(xml, keep_objekt):
|
||||||
@@ -1500,25 +1509,34 @@ def main():
|
|||||||
# (e.g. a 2.13 form inside a 2.17 extension). The platform upgrades the form to the root version.
|
# (e.g. a 2.13 form inside a 2.17 extension). The platform upgrades the form to the root version.
|
||||||
form_version = format_version
|
form_version = format_version
|
||||||
|
|
||||||
|
# Секции формы отбираются по имени, а не по позиции: свойства лежат и до, и после
|
||||||
|
# <CommandSet> (корпусная проверка: у всех 794 форм документов ERP с CommandSet он стоит
|
||||||
|
# раньше AutoCommandBar, а AutoTime/UsePostingMode/RepostOnWrite — после него). Позиционная
|
||||||
|
# отсечка теряла весь хвост, и платформа молча подставляла дефолты вместо потерянных свойств.
|
||||||
src_auto_cmd = None
|
src_auto_cmd = None
|
||||||
form_props = []
|
form_props = []
|
||||||
reached_visual = False
|
|
||||||
for fc in src_form_el:
|
for fc in src_form_el:
|
||||||
if not isinstance(fc.tag, str):
|
if not isinstance(fc.tag, str):
|
||||||
continue
|
continue
|
||||||
ln = localname(fc)
|
ln = localname(fc)
|
||||||
if ln == "AutoCommandBar" and src_auto_cmd is None:
|
if ln == "AutoCommandBar" and src_auto_cmd is None:
|
||||||
reached_visual = True
|
|
||||||
src_auto_cmd = fc
|
src_auto_cmd = fc
|
||||||
continue
|
continue
|
||||||
if ln in ("ChildItems", "Events", "Attributes", "Commands", "Parameters", "CommandSet"):
|
# ChildItems забирается отдельным поиском ниже
|
||||||
reached_visual = True
|
if ln == "ChildItems":
|
||||||
continue
|
continue
|
||||||
if not reached_visual:
|
# Структурные секции: в расширении их содержимое недействительно (обработчики, команды и
|
||||||
# Form-level properties before AutoCommandBar (WindowOpeningMode, AutoFillCheck, etc.)
|
# параметры базовой формы, ссылки командного интерфейса на команды базовой конфигурации).
|
||||||
# with_tail=False — хвостовой пробел принадлежит родителю; с ним в вывод попадали
|
if ln in FORM_STRUCTURAL_SECTIONS:
|
||||||
# пустые строки, которых нет у PS-порта (OuterXml хвост не включает).
|
continue
|
||||||
form_props.append(decode_numeric_entities(etree.tostring(fc, encoding="unicode", with_tail=False)))
|
# Свойства, значение которых — имя реквизита формы. Реквизиты в заимствованную форму не
|
||||||
|
# переносятся, поэтому Конфигуратор такие свойства выбрасывает (проверено на форме отчёта:
|
||||||
|
# ReportResult и DetailsData выброшены, CustomSettingsFolder — имя элемента — сохранён).
|
||||||
|
if ln in FORM_ATTRIBUTE_REF_PROPS:
|
||||||
|
continue
|
||||||
|
# with_tail=False — хвостовой пробел принадлежит родителю; с ним в вывод попадали
|
||||||
|
# пустые строки, которых нет у PS-порта (OuterXml хвост не включает).
|
||||||
|
form_props.append(decode_numeric_entities(etree.tostring(fc, encoding="unicode", with_tail=False)))
|
||||||
|
|
||||||
ns_strip_pattern = re.compile(r'\s+xmlns(?::\w+)?="[^"]*"')
|
ns_strip_pattern = re.compile(r'\s+xmlns(?::\w+)?="[^"]*"')
|
||||||
|
|
||||||
@@ -1533,8 +1551,10 @@ def main():
|
|||||||
auto_cmd_xml = ns_strip_pattern.sub("", auto_cmd_xml)
|
auto_cmd_xml = ns_strip_pattern.sub("", auto_cmd_xml)
|
||||||
auto_cmd_xml = re.sub(r'<CommandName>[^<]*</CommandName>', '<CommandName>0</CommandName>', auto_cmd_xml)
|
auto_cmd_xml = re.sub(r'<CommandName>[^<]*</CommandName>', '<CommandName>0</CommandName>', auto_cmd_xml)
|
||||||
auto_cmd_xml = auto_cmd_xml.replace('<Autofill>true</Autofill>', '<Autofill>false</Autofill>')
|
auto_cmd_xml = auto_cmd_xml.replace('<Autofill>true</Autofill>', '<Autofill>false</Autofill>')
|
||||||
# Strip ExcludedCommand (references to standard commands invalid in extension)
|
# Вложенный CommandSet выбрасывается целиком, а не опустошается: Конфигуратор в заимствованной
|
||||||
auto_cmd_xml = re.sub(r'\s*<ExcludedCommand>[^<]*</ExcludedCommand>', '', auto_cmd_xml)
|
# форме оставляет только корневой (тот идёт свойством формы, здесь его нет).
|
||||||
|
auto_cmd_xml = re.sub(r'(?s)\s*<CommandSet>.*?</CommandSet>', '', auto_cmd_xml)
|
||||||
|
auto_cmd_xml = re.sub(r'\s*<CommandSet/>', '', auto_cmd_xml)
|
||||||
# Strip data-binding tags whose root attribute isn't borrowed
|
# Strip data-binding tags whose root attribute isn't borrowed
|
||||||
auto_cmd_xml = strip_form_bindings(auto_cmd_xml, borrow_main_attr)
|
auto_cmd_xml = strip_form_bindings(auto_cmd_xml, borrow_main_attr)
|
||||||
if not borrow_main_attr:
|
if not borrow_main_attr:
|
||||||
@@ -1557,8 +1577,9 @@ def main():
|
|||||||
child_items_xml = strip_form_bindings(child_items_xml, borrow_main_attr)
|
child_items_xml = strip_form_bindings(child_items_xml, borrow_main_attr)
|
||||||
if not borrow_main_attr:
|
if not borrow_main_attr:
|
||||||
child_items_xml = rewrite_choice_parameter_links(child_items_xml, src_attr_uuids)
|
child_items_xml = rewrite_choice_parameter_links(child_items_xml, src_attr_uuids)
|
||||||
# Strip ExcludedCommand in nested AutoCommandBars (references to standard commands invalid in extension)
|
# Вложенные CommandSet (у таблиц, полей табличного документа и т.п.) — целиком, см. выше
|
||||||
child_items_xml = re.sub(r'\s*<ExcludedCommand>[^<]*</ExcludedCommand>', '', child_items_xml)
|
child_items_xml = re.sub(r'(?s)\s*<CommandSet>.*?</CommandSet>', '', child_items_xml)
|
||||||
|
child_items_xml = re.sub(r'\s*<CommandSet/>', '', child_items_xml)
|
||||||
# Strip TypeLink blocks with human-readable DataPath (Items.XXX)
|
# Strip TypeLink blocks with human-readable DataPath (Items.XXX)
|
||||||
child_items_xml = re.sub(r'\s*<TypeLink>\s*<xr:DataPath>Items\.[^<]*</xr:DataPath>.*?</TypeLink>', '', child_items_xml, flags=re.DOTALL)
|
child_items_xml = re.sub(r'\s*<TypeLink>\s*<xr:DataPath>Items\.[^<]*</xr:DataPath>.*?</TypeLink>', '', child_items_xml, flags=re.DOTALL)
|
||||||
# Strip element-level Events
|
# Strip element-level Events
|
||||||
|
|||||||
+35
-6
@@ -212,22 +212,51 @@ CommonForms регистрируются в `Configuration.xml`:
|
|||||||
|
|
||||||
```
|
```
|
||||||
<Form>
|
<Form>
|
||||||
┌─ Свойства формы (необязательные, в произвольном порядке)
|
┌─ Свойства формы (необязательные) — часть до <CommandSet>, часть после
|
||||||
├─ <CommandSet> — исключённые стандартные команды
|
├─ <CommandSet> — исключённые стандартные команды
|
||||||
|
├─ …продолжение свойств формы (AutoTime, UsePostingMode, RepostOnWrite, ReportResult…)
|
||||||
├─ <AutoCommandBar> — главная командная панель (обязательный, id="-1")
|
├─ <AutoCommandBar> — главная командная панель (обязательный, id="-1")
|
||||||
├─ <Events> — обработчики событий формы
|
├─ <Events> — обработчики событий формы
|
||||||
├─ <ChildItems> — дерево UI-элементов
|
├─ <ChildItems> — дерево UI-элементов
|
||||||
├─ <Attributes> — реквизиты формы
|
├─ <Attributes> — реквизиты формы
|
||||||
|
├─ <Commands> — пользовательские команды
|
||||||
├─ <Parameters> — параметры открытия формы
|
├─ <Parameters> — параметры открытия формы
|
||||||
└─ <Commands> — пользовательские команды
|
└─ <CommandInterface> — командный интерфейс формы
|
||||||
</Form>
|
</Form>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Порядок **строгий**, а не произвольный: на 30223 формах корпуса (ERP, УТ, УНФ 8.5, БП, общие
|
||||||
|
формы) не встретилось ни одной пары элементов, идущей в разном порядке в разных формах.
|
||||||
|
|
||||||
|
Важно: `<CommandSet>` стоит **в середине блока свойств**, а не перед ним — свойства есть и до, и
|
||||||
|
после него. У всех 794 форм документов ERP с `CommandSet` он предшествует `AutoCommandBar`, а
|
||||||
|
`AutoTime`/`UsePostingMode`/`RepostOnWrite` идут **после** `CommandSet`.
|
||||||
|
|
||||||
|
Надёжная граница между свойствами и структурными секциями — **`<AutoCommandBar>`**: он присутствует
|
||||||
|
в 100% форм корпуса, и ни одно свойство никогда не стоит после него. Код, отделяющий свойства от
|
||||||
|
структуры, должен опираться на него, а не на «первую встреченную секцию».
|
||||||
|
|
||||||
|
Полный наблюдаемый порядок:
|
||||||
|
|
||||||
|
```
|
||||||
|
Title · Width · Height · WindowOpeningMode · EnterKeyBehavior · AutoSaveDataInSettings ·
|
||||||
|
SaveDataInSettings · SaveWindowSettings · SettingsStorage · AutoTitle · AutoURL · Group ·
|
||||||
|
ChildItemsWidth · ChildrenAlign · HorizontalSpacing · Scale · VerticalSpacing · HorizontalAlign ·
|
||||||
|
VerticalAlign · AutoFillCheck · Customizable · Enabled · CommandBarLocation · VerticalScroll ·
|
||||||
|
ScalingMode · ConversationsRepresentation · MobileDeviceCommandBarContent · ScaleVariant ·
|
||||||
|
CommandSet · GroupList · ShowTitle · CreateButtonsGroupPicture · CreateButtonsGroupTitle ·
|
||||||
|
ShowCloseButton · CollapseItemsByImportanceVariant · WindowViewMode · ShowCommandBar · AutoTime ·
|
||||||
|
ReportResult · DetailsData · ReportFormType · UseForFoldersAndItems · UsePostingMode ·
|
||||||
|
RepostOnWrite · VariantAppearance · AutoShowState · CustomSettingsFolder · ReportResultViewMode ·
|
||||||
|
ViewModeApplicationOnSetReportResult · AutoCommandBar · Events · ChildItems · Attributes ·
|
||||||
|
Commands · Parameters · CommandInterface
|
||||||
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 3. Свойства формы
|
## 3. Свойства формы
|
||||||
|
|
||||||
Прямые дочерние элементы `<Form>` (все необязательные, указываются до `<CommandSet>`/`<AutoCommandBar>`):
|
Прямые дочерние элементы `<Form>` — все необязательные, порядок между ними фиксирован (см. §2):
|
||||||
|
|
||||||
### Общие свойства (все типы форм)
|
### Общие свойства (все типы форм)
|
||||||
|
|
||||||
@@ -258,8 +287,8 @@ CommonForms регистрируются в `Configuration.xml`:
|
|||||||
|
|
||||||
| Элемент | Значения | Описание |
|
| Элемент | Значения | Описание |
|
||||||
|---------|----------|----------|
|
|---------|----------|----------|
|
||||||
| `<AutoTime>` | `CurrentOrLast`, `Current`, `Last` | Управление временем документа |
|
| `<AutoTime>` | `CurrentOrLast`, `DontUse`, `Current`, `Last` | Управление временем документа. В корпусе встречаются только `CurrentOrLast` и `DontUse` |
|
||||||
| `<UsePostingMode>` | `Auto`, `Postings`, `Movements` | Режим проведения |
|
| `<UsePostingMode>` | `Auto`, `Regular` | Режим проведения |
|
||||||
| `<RepostOnWrite>` | `true`/`false` | Перепроведение при записи |
|
| `<RepostOnWrite>` | `true`/`false` | Перепроведение при записи |
|
||||||
|
|
||||||
### Свойства справочников (Catalogs, ChartsOfAccounts)
|
### Свойства справочников (Catalogs, ChartsOfAccounts)
|
||||||
@@ -274,7 +303,7 @@ CommonForms регистрируются в `Configuration.xml`:
|
|||||||
|---------|----------|----------|
|
|---------|----------|----------|
|
||||||
| `<ReportResult>` | string | Имя реквизита результата (`Результат`) |
|
| `<ReportResult>` | string | Имя реквизита результата (`Результат`) |
|
||||||
| `<DetailsData>` | string | Имя реквизита расшифровки (`ДанныеРасшифровки`) |
|
| `<DetailsData>` | string | Имя реквизита расшифровки (`ДанныеРасшифровки`) |
|
||||||
| `<ReportFormType>` | `Main`, `Settings`, `Choice` | Тип формы отчёта |
|
| `<ReportFormType>` | `Main`, `Settings`, `Variant` | Тип формы отчёта |
|
||||||
| `<AutoShowState>` | `Auto`, `Show`, `Hide` | Автоотображение состояния |
|
| `<AutoShowState>` | `Auto`, `Show`, `Hide` | Автоотображение состояния |
|
||||||
| `<ReportResultViewMode>` | `Auto`, `Table`, `Spreadsheet` | Режим отображения результата |
|
| `<ReportResultViewMode>` | `Auto`, `Table`, `Spreadsheet` | Режим отображения результата |
|
||||||
| `<ViewModeApplicationOnSetReportResult>` | `Auto`, `Always`, `Never` | Применение режима |
|
| `<ViewModeApplicationOnSetReportResult>` | `Auto`, `Always`, `Never` | Применение режима |
|
||||||
|
|||||||
@@ -55,8 +55,8 @@
|
|||||||
| `commandBarLocation` | `<CommandBarLocation>` | `Top`, `Bottom`, `None` |
|
| `commandBarLocation` | `<CommandBarLocation>` | `Top`, `Bottom`, `None` |
|
||||||
| `saveDataInSettings` | `<SaveDataInSettings>` | `UseList`, `Use`, `DontUse` |
|
| `saveDataInSettings` | `<SaveDataInSettings>` | `UseList`, `Use`, `DontUse` |
|
||||||
| `autoSaveDataInSettings` | `<AutoSaveDataInSettings>` | `Use`, `DontUse` |
|
| `autoSaveDataInSettings` | `<AutoSaveDataInSettings>` | `Use`, `DontUse` |
|
||||||
| `autoTime` | `<AutoTime>` | `CurrentOrLast`, `Current`, `Last` |
|
| `autoTime` | `<AutoTime>` | `CurrentOrLast`, `DontUse`, `Current`, `Last` |
|
||||||
| `usePostingMode` | `<UsePostingMode>` | `Auto`, `Postings`, `Movements` |
|
| `usePostingMode` | `<UsePostingMode>` | `Auto`, `Regular` |
|
||||||
| `repostOnWrite` | `<RepostOnWrite>` | `true` / `false` |
|
| `repostOnWrite` | `<RepostOnWrite>` | `true` / `false` |
|
||||||
| `autoURL` | `<AutoURL>` | `true` / `false` |
|
| `autoURL` | `<AutoURL>` | `true` / `false` |
|
||||||
| `enabled` | `<Enabled>` | `true` / `false` — доступность всей формы (редкое; форма-уровень) |
|
| `enabled` | `<Enabled>` | `true` / `false` — доступность всей формы (редкое; форма-уровень) |
|
||||||
|
|||||||
Reference in New Issue
Block a user