diff --git a/.claude/skills/cfe-borrow/scripts/cfe-borrow.ps1 b/.claude/skills/cfe-borrow/scripts/cfe-borrow.ps1 index 099ddac2..a8531dd6 100644 --- a/.claude/skills/cfe-borrow/scripts/cfe-borrow.ps1 +++ b/.claude/skills/cfe-borrow/scripts/cfe-borrow.ps1 @@ -1,4 +1,4 @@ -# cfe-borrow v1.3 — Borrow objects from configuration into extension (CFE) +# cfe-borrow v1.4 — Borrow objects from configuration into extension (CFE) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)][string]$ExtensionPath, @@ -13,6 +13,31 @@ $ErrorActionPreference = "Stop" function Info([string]$msg) { Write-Host "[INFO] $msg" } function Warn([string]$msg) { Write-Host "[WARN] $msg" } +# Form data-binding tags (value = attribute path). A binding survives only if its root +# attribute is borrowed into the form's ; otherwise it must be stripped or the +# platform rejects the form with "Неверный путь к данным" on load. +$script:formBindingDataTags = @('DataPath','TitleDataPath','FooterDataPath','HeaderDataPath','MultipleValueDataPath','MultipleValuePresentDataPath') +# Picture-path binding tags (value = picture index path, never a data attribute) — always stripped in the skeleton. +$script:formBindingPictureTags = @('RowPictureDataPath','MultipleValuePictureDataPath') + +# Strip data-binding tags whose root attribute isn't borrowed. +# $keepObjekt=$true (BorrowMainAttribute): keep Объект.* data bindings, strip the rest. +# $keepObjekt=$false (default skeleton): strip all bindings. Picture-path tags are always stripped. +function Strip-FormBindings { + param([string]$xml, [bool]$keepObjekt) + foreach ($tag in $script:formBindingDataTags) { + if ($keepObjekt) { + $xml = [regex]::Replace($xml, "\s*<$tag>(?!Объект\.)[^<]*", '') + } else { + $xml = [regex]::Replace($xml, "\s*<$tag>[^<]*", '') + } + } + foreach ($tag in $script:formBindingPictureTags) { + $xml = [regex]::Replace($xml, "\s*<$tag>[^<]*", '') + } + return $xml +} + # --- 1. Resolve paths --- if (-not [System.IO.Path]::IsPathRooted($ExtensionPath)) { $ExtensionPath = Join-Path (Get-Location).Path $ExtensionPath @@ -552,13 +577,8 @@ function Borrow-Form { $autoCmdXml = $autoCmdXml -replace 'true', 'false' # Strip ExcludedCommand (references to standard commands invalid in extension) $autoCmdXml = [regex]::Replace($autoCmdXml, '\s*[^<]*', '') - # Strip DataPath in AutoCommandBar buttons - if ($BorrowMainAttr) { - # Keep only Объект.* DataPaths - $autoCmdXml = [regex]::Replace($autoCmdXml, '\s*(?!Объект\.)[^<]*', '') - } else { - $autoCmdXml = [regex]::Replace($autoCmdXml, '\s*[^<]*', '') - } + # Strip data-binding tags whose root attribute isn't borrowed + $autoCmdXml = Strip-FormBindings $autoCmdXml ([bool]$BorrowMainAttr) } # ChildItems: copy full tree, clean up base-config references @@ -568,17 +588,9 @@ function Borrow-Form { $childItemsXml = [regex]::Replace($childItemsXml, $nsStripPattern, '') # Replace all CommandName values with 0 $childItemsXml = [regex]::Replace($childItemsXml, '[^<]*', '0') - # Strip DataPath, TitleDataPath, RowPictureDataPath - if ($BorrowMainAttr) { - # Keep only Объект.* DataPaths — strip form-attribute DataPaths (not borrowed) - $childItemsXml = [regex]::Replace($childItemsXml, '\s*(?!Объект\.)[^<]*', '') - $childItemsXml = [regex]::Replace($childItemsXml, '\s*(?!Объект\.)[^<]*', '') - $childItemsXml = [regex]::Replace($childItemsXml, '\s*[^<]*', '') - } else { - $childItemsXml = [regex]::Replace($childItemsXml, '\s*[^<]*', '') - $childItemsXml = [regex]::Replace($childItemsXml, '\s*[^<]*', '') - $childItemsXml = [regex]::Replace($childItemsXml, '\s*[^<]*', '') - } + # Strip data-binding tags whose root attribute isn't borrowed + # (DataPath/TitleDataPath/FooterDataPath/HeaderDataPath/MultipleValue*/RowPicture*) + $childItemsXml = Strip-FormBindings $childItemsXml ([bool]$BorrowMainAttr) # Strip ExcludedCommand in nested AutoCommandBars (references to standard commands invalid in extension) $childItemsXml = [regex]::Replace($childItemsXml, '\s*[^<]*', '') # Strip TypeLink blocks with human-readable DataPath (Items.XXX — can't convert to UUID) @@ -1010,30 +1022,24 @@ function Collect-FormDataPaths { $firstLevel = @{} $deepPaths = @() - $matches2 = [regex]::Matches($content, '[^<]*\bОбъект\.(\w+(?:\.\w+)*)') - foreach ($m in $matches2) { - $path = $m.Groups[1].Value - $segments = $path.Split(".") - $seg0 = $segments[0] - if ($script:standardFields -contains $seg0) { continue } - $firstLevel[$seg0] = $true - if ($segments.Count -ge 2) { - $seg1 = $segments[1] - if ($script:standardFields -contains $seg1) { continue } - $deepPaths += @{ ObjectAttr = $seg0; SubAttr = $seg1 } + # Scan every data-binding tag (DataPath/TitleDataPath/FooterDataPath/HeaderDataPath/MultipleValue*) + # for Объект.* references — picture-path tags carry picture indices, not data attributes. + foreach ($tag in $script:formBindingDataTags) { + $bms = [regex]::Matches($content, "<$tag>[^<]*\bОбъект\.(\w+(?:\.\w+)*)") + foreach ($m in $bms) { + $path = $m.Groups[1].Value + $segments = $path.Split(".") + $seg0 = $segments[0] + if ($script:standardFields -contains $seg0) { continue } + $firstLevel[$seg0] = $true + if ($segments.Count -ge 2) { + $seg1 = $segments[1] + if ($script:standardFields -contains $seg1) { continue } + $deepPaths += @{ ObjectAttr = $seg0; SubAttr = $seg1 } + } } } - # Also collect from TitleDataPath - $matches3 = [regex]::Matches($content, '[^<]*\bОбъект\.(\w+(?:\.\w+)*)') - foreach ($m in $matches3) { - $path = $m.Groups[1].Value - $segments = $path.Split(".") - $seg0 = $segments[0] - if ($script:standardFields -contains $seg0) { continue } - $firstLevel[$seg0] = $true - } - # Deduplicate deep paths $seen = @{} $uniqueDeep = @() @@ -1142,7 +1148,8 @@ function Resolve-SourceAttributes { } # Extract extra Properties for main object enrichment (Hierarchical, CodeLength, etc.) - $extraProps = @{} + # Ordered so PS emits the same property order as the Python port (dict preserves insertion order). + $extraProps = [ordered]@{} $propsNode = $srcEl.SelectSingleNode("md:Properties", $srcNs) if ($propsNode) { $propsToExtract = @("Hierarchical","FoldersOnTop","CodeLength","DescriptionLength","CodeType","CodeAllowedLength", @@ -1375,28 +1382,45 @@ function Borrow-MainAttribute { # Step 3: Build the adopted content and insert into main object XML $objFile = Join-Path (Join-Path $extDir $dirName) "${objName}.xml" + # Read existing object XML (needed for dedup + enrichment) + $objContent = [System.IO.File]::ReadAllText($objFile, (New-Object System.Text.UTF8Encoding($true))) + + # Dedup: skip attributes/TS already present in object's ChildObjects (idempotent re-borrow) + $existingChildNames = @{} + if ($objContent -match '(?s)(.*?)') { + foreach ($nm in [regex]::Matches($Matches[1], '(\w+)')) { + $existingChildNames[$nm.Groups[1].Value] = $true + } + } + $insertAttrs = @($srcAttrs | Where-Object { -not $existingChildNames.ContainsKey($_.Name) }) + $insertTS = @($srcTS | Where-Object { -not $existingChildNames.ContainsKey($_.Name) }) + # Generate full object XML with attributes and TS $contentSb = New-Object System.Text.StringBuilder - foreach ($attr in $srcAttrs) { + foreach ($attr in $insertAttrs) { $attrXml = Build-AdoptedAttributeXml $attr.Name $attr.Uuid $attr.TypeXml "`t`t`t" $contentSb.AppendLine($attrXml) | Out-Null } - foreach ($ts in $srcTS) { + foreach ($ts in $insertTS) { $tsXml = Build-AdoptedTabularSectionXml $ts.Name $ts.Uuid $ts.GeneratedTypes $ts.Attributes "`t`t`t" $contentSb.AppendLine($tsXml) | Out-Null } $adoptedContent = $contentSb.ToString().TrimEnd() - # Read existing object XML and inject - $objContent = [System.IO.File]::ReadAllText($objFile, (New-Object System.Text.UTF8Encoding($true))) - - # Inject extra properties after ExtendedConfigurationObject + # Inject extra properties into the object's OWN Properties only — idempotent and anchored to the + # first ExtendedConfigurationObject (the object's). On re-borrow, adopted attributes each have their + # own ExtendedConfigurationObject; a global replace would push object props inside every . if ($extraProps.Count -gt 0) { + $objPropsBlock = "" + if ($objContent -match '(?s)(.*?)') { $objPropsBlock = $Matches[1] } $propsSb = New-Object System.Text.StringBuilder foreach ($pName in $extraProps.Keys) { + if ($objPropsBlock -match "<$pName>") { continue } $propsSb.Append("`r`n`t`t`t<${pName}>$($extraProps[$pName])") | Out-Null } - $objContent = $objContent -replace '()', "`$1$($propsSb.ToString())" + if ($propsSb.Length -gt 0) { + $objContent = ([regex]'').Replace($objContent, "$($propsSb.ToString())", 1) + } } # Replace empty ChildObjects with adopted content diff --git a/.claude/skills/cfe-borrow/scripts/cfe-borrow.py b/.claude/skills/cfe-borrow/scripts/cfe-borrow.py index 7ba8ade9..ebc213db 100644 --- a/.claude/skills/cfe-borrow/scripts/cfe-borrow.py +++ b/.claude/skills/cfe-borrow/scripts/cfe-borrow.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# cfe-borrow v1.3 — Borrow objects from configuration into extension (CFE) +# cfe-borrow v1.4 — Borrow objects from configuration into extension (CFE) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse @@ -14,6 +14,36 @@ XR_NS = "http://v8.1c.ru/8.3/xcf/readable" XSI_NS = "http://www.w3.org/2001/XMLSchema-instance" V8_NS = "http://v8.1c.ru/8.1/data/core" +# Form data-binding tags (value = attribute path). A binding survives only if its root +# attribute is borrowed into the form's ; otherwise it must be stripped or the +# platform rejects the form with "Неверный путь к данным" on load. +FORM_BINDING_DATA_TAGS = ["DataPath", "TitleDataPath", "FooterDataPath", "HeaderDataPath", "MultipleValueDataPath", "MultipleValuePresentDataPath"] +# Picture-path binding tags (value = picture index path, never a data attribute) — always stripped in the skeleton. +FORM_BINDING_PICTURE_TAGS = ["RowPictureDataPath", "MultipleValuePictureDataPath"] + + +def strip_form_bindings(xml, keep_objekt): + """Strip data-binding tags whose root attribute isn't borrowed. + keep_objekt=True (BorrowMainAttribute): keep Объект.* data bindings, strip the rest. + keep_objekt=False (default skeleton): strip all bindings. Picture-path tags are always stripped.""" + for tag in FORM_BINDING_DATA_TAGS: + if keep_objekt: + xml = re.sub(rf'\s*<{tag}>(?!Объект\.)[^<]*', '', xml) + else: + xml = re.sub(rf'\s*<{tag}>[^<]*', '', xml) + for tag in FORM_BINDING_PICTURE_TAGS: + xml = re.sub(rf'\s*<{tag}>[^<]*', '', xml) + return xml + + +def decode_numeric_entities(s): + """lxml emits numeric character refs (&#xNNNN;) for non-ASCII in some self-closed + elements where the PowerShell port writes literal characters. Normalize numeric refs + back to literal so PS↔PY output matches. Named entities (& < ...) are left intact.""" + s = re.sub(r'&#x([0-9A-Fa-f]+);', lambda m: chr(int(m.group(1), 16)), s) + s = re.sub(r'&#(\d+);', lambda m: chr(int(m.group(1))), s) + return s + def localname(el): return etree.QName(el.tag).localname @@ -644,27 +674,21 @@ def main(): first_level = {} deep_paths = [] - for m in re.finditer(r'[^<]*\b\u041e\u0431\u044a\u0435\u043a\u0442\.(\w+(?:\.\w+)*)', content): - path = m.group(1) - segments = path.split(".") - seg0 = segments[0] - if seg0 in STANDARD_FIELDS: - continue - first_level[seg0] = True - if len(segments) >= 2: - seg1 = segments[1] - if seg1 in STANDARD_FIELDS: + # Scan every data-binding tag (DataPath/TitleDataPath/FooterDataPath/HeaderDataPath/MultipleValue*) + # for Объект.* references — picture-path tags carry picture indices, not data attributes. + for tag in FORM_BINDING_DATA_TAGS: + for m in re.finditer(r'<' + tag + r'>[^<]*\bОбъект\.(\w+(?:\.\w+)*)', content): + path = m.group(1) + segments = path.split(".") + seg0 = segments[0] + if seg0 in STANDARD_FIELDS: continue - deep_paths.append({"ObjectAttr": seg0, "SubAttr": seg1}) - - # Also collect from TitleDataPath - for m in re.finditer(r'[^<]*\b\u041e\u0431\u044a\u0435\u043a\u0442\.(\w+(?:\.\w+)*)', content): - path = m.group(1) - segments = path.split(".") - seg0 = segments[0] - if seg0 in STANDARD_FIELDS: - continue - first_level[seg0] = True + first_level[seg0] = True + if len(segments) >= 2: + seg1 = segments[1] + if seg1 in STANDARD_FIELDS: + continue + deep_paths.append({"ObjectAttr": seg0, "SubAttr": seg1}) # Deduplicate deep paths seen = set() @@ -941,26 +965,40 @@ def main(): # Step 3: Build the adopted content and insert into main object XML obj_file = os.path.join(ext_dir, dir_name, f"{obj_name}.xml") - # Generate full object XML with attributes and TS - content_parts = [] - for attr in src_attrs: - attr_xml = build_adopted_attribute_xml(attr["Name"], attr["Uuid"], attr["TypeXml"], "\t\t\t") - content_parts.append(attr_xml) - for ts in src_ts: - ts_xml = build_adopted_tabular_section_xml(ts["Name"], ts["Uuid"], ts["GeneratedTypes"], ts["Attributes"], "\t\t\t") - content_parts.append(ts_xml) - adopted_content = "\n".join(content_parts).rstrip() - - # Read existing object XML and inject + # Read existing object XML (needed for dedup + enrichment) with open(obj_file, "r", encoding="utf-8-sig") as fh: obj_content = fh.read() - # Inject extra properties after ExtendedConfigurationObject + # Dedup: skip attributes/TS already present in object's ChildObjects (idempotent re-borrow) + existing_child_names = set() + m_co = re.search(r'(?s)(.*?)', obj_content) + if m_co: + for nm in re.findall(r'(\w+)', m_co.group(1)): + existing_child_names.add(nm) + insert_attrs = [a for a in src_attrs if a["Name"] not in existing_child_names] + insert_ts = [t for t in src_ts if t["Name"] not in existing_child_names] + + # Generate full object XML with attributes and TS + content_parts = [] + for attr in insert_attrs: + content_parts.append(build_adopted_attribute_xml(attr["Name"], attr["Uuid"], attr["TypeXml"], "\t\t\t")) + for ts in insert_ts: + content_parts.append(build_adopted_tabular_section_xml(ts["Name"], ts["Uuid"], ts["GeneratedTypes"], ts["Attributes"], "\t\t\t")) + adopted_content = "\n".join(content_parts).rstrip() + + # Inject extra properties into the object's OWN Properties only — idempotent and anchored to the + # first ExtendedConfigurationObject (the object's). On re-borrow, adopted attributes each have their + # own ExtendedConfigurationObject; a global replace would push object props inside every . if extra_props: + m_props = re.search(r'(?s)(.*?)', obj_content) + obj_props_block = m_props.group(1) if m_props else "" props_xml = "" for p_name, p_val in extra_props.items(): + if f"<{p_name}>" in obj_props_block: + continue props_xml += f"\r\n\t\t\t<{p_name}>{p_val}" - obj_content = obj_content.replace("", f"{props_xml}") + if props_xml: + obj_content = obj_content.replace("", f"{props_xml}", 1) # Replace empty ChildObjects with adopted content if adopted_content: @@ -1149,25 +1187,21 @@ def main(): continue if not reached_visual: # Form-level properties before AutoCommandBar (WindowOpeningMode, AutoFillCheck, etc.) - form_props.append(etree.tostring(fc, encoding="unicode")) + form_props.append(decode_numeric_entities(etree.tostring(fc, encoding="unicode"))) ns_strip_pattern = re.compile(r'\s+xmlns(?::\w+)?="[^"]*"') # AutoCommandBar: keep ChildItems (buttons with CommandName->0), Autofill->false auto_cmd_xml = "" if src_auto_cmd is not None: - auto_cmd_xml = etree.tostring(src_auto_cmd, encoding="unicode") + auto_cmd_xml = decode_numeric_entities(etree.tostring(src_auto_cmd, encoding="unicode")) auto_cmd_xml = ns_strip_pattern.sub("", auto_cmd_xml) auto_cmd_xml = re.sub(r'[^<]*', '0', auto_cmd_xml) auto_cmd_xml = auto_cmd_xml.replace('true', 'false') # Strip ExcludedCommand (references to standard commands invalid in extension) auto_cmd_xml = re.sub(r'\s*[^<]*', '', auto_cmd_xml) - # Strip DataPath in AutoCommandBar buttons - if borrow_main_attr: - # Keep only Объект.* DataPaths - auto_cmd_xml = re.sub(r'\s*(?!\u041e\u0431\u044a\u0435\u043a\u0442\.)[^<]*', '', auto_cmd_xml) - else: - auto_cmd_xml = re.sub(r'\s*[^<]*', '', auto_cmd_xml) + # Strip data-binding tags whose root attribute isn't borrowed + auto_cmd_xml = strip_form_bindings(auto_cmd_xml, borrow_main_attr) # ChildItems: copy full tree, clean up base-config references child_items_xml = "" @@ -1178,20 +1212,12 @@ def main(): break if src_child_items is not None: - child_items_xml = etree.tostring(src_child_items, encoding="unicode") + child_items_xml = decode_numeric_entities(etree.tostring(src_child_items, encoding="unicode")) child_items_xml = ns_strip_pattern.sub("", child_items_xml) # Replace all CommandName values with 0 child_items_xml = re.sub(r'[^<]*', '0', child_items_xml) - # Strip DataPath / TitleDataPath / RowPictureDataPath - if borrow_main_attr: - # Keep only Объект.* DataPaths — strip form-attribute DataPaths (not borrowed) - child_items_xml = re.sub(r'\s*(?!\u041e\u0431\u044a\u0435\u043a\u0442\.)[^<]*', '', child_items_xml) - child_items_xml = re.sub(r'\s*(?!\u041e\u0431\u044a\u0435\u043a\u0442\.)[^<]*', '', child_items_xml) - child_items_xml = re.sub(r'\s*[^<]*', '', child_items_xml) - else: - child_items_xml = re.sub(r'\s*[^<]*', '', child_items_xml) - child_items_xml = re.sub(r'\s*[^<]*', '', child_items_xml) - child_items_xml = re.sub(r'\s*[^<]*', '', child_items_xml) + # Strip data-binding tags whose root attribute isn't borrowed + child_items_xml = strip_form_bindings(child_items_xml, borrow_main_attr) # Strip ExcludedCommand in nested AutoCommandBars (references to standard commands invalid in extension) child_items_xml = re.sub(r'\s*[^<]*', '', child_items_xml) # Strip TypeLink blocks with human-readable DataPath (Items.XXX) diff --git a/tests/skills/cases/cfe-borrow/form-bindings.json b/tests/skills/cases/cfe-borrow/form-bindings.json new file mode 100644 index 00000000..d69a4479 --- /dev/null +++ b/tests/skills/cases/cfe-borrow/form-bindings.json @@ -0,0 +1,41 @@ +{ + "name": "Заимствование формы: вырезание привязок (Multiple*/Footer) + идемпотентность повторного заимствования", + "preRun": [ + { + "script": "meta-compile/scripts/meta-compile", + "input": { "type": "Catalog", "name": "Товары", "attributes": [ { "name": "Артикул", "type": "String", "length": 25 } ] }, + "args": { "-JsonPath": "{inputFile}", "-OutputDir": "{workDir}" } + }, + { + "script": "form-add/scripts/form-add", + "args": { "-ObjectPath": "{workDir}/Catalogs/Товары.xml", "-FormName": "ФормаЭлемента" } + }, + { + "script": "form-compile/scripts/form-compile", + "input": { + "title": "Тест", + "elements": [ + { "input": "Артикул", "path": "Объект.Артикул" }, + { "input": "Метки", "path": "Метки", "multipleValueDataPath": "Метки", "multipleValuePresentDataPath": "Метки" }, + { "input": "Подвал", "path": "ПолеПодвала", "footerDataPath": "ПолеПодвала", "footerText": "Итого" } + ], + "attributes": [ + { "name": "Объект", "type": "CatalogObject.Товары", "main": true }, + { "name": "Метки", "type": "string(50)" }, + { "name": "ПолеПодвала", "type": "string(50)" } + ] + }, + "args": { "-JsonPath": "{inputFile}", "-OutputPath": "{workDir}/Catalogs/Товары/Forms/ФормаЭлемента/Ext/Form.xml" } + }, + { + "script": "cfe-init/scripts/cfe-init", + "args": { "-Name": "Тест", "-OutputDir": "{workDir}/ext", "-ConfigPath": "{workDir}" } + }, + { + "script": "cfe-borrow/scripts/cfe-borrow", + "args": { "-ExtensionPath": "{workDir}/ext", "-ConfigPath": "{workDir}", "-Object": "Catalog.Товары.Form.ФормаЭлемента", "-BorrowMainAttribute": "Form" } + } + ], + "params": { "extensionPath": "ext", "object": "Catalog.Товары.Form.ФормаЭлемента" }, + "args_extra": ["-BorrowMainAttribute", "Form"] +} diff --git a/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Catalogs/Товары.xml b/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Catalogs/Товары.xml new file mode 100644 index 00000000..53dd9147 --- /dev/null +++ b/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Catalogs/Товары.xml @@ -0,0 +1,373 @@ + + + + + + UUID-002 + UUID-003 + + + UUID-004 + UUID-005 + + + UUID-006 + UUID-007 + + + UUID-008 + UUID-009 + + + UUID-010 + UUID-011 + + + + Товары + + + ru + Товары + + + + false + HierarchyFoldersAndItems + false + 2 + true + true + + ToItems + 9 + 25 + String + Variable + WholeCatalog + false + true + AsDescription + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + Auto + InDialog + false + BothWays + + Catalog.Товары.StandardAttribute.Description + Catalog.Товары.StandardAttribute.Code + + Begin + DontUse + Directly + Catalog.Товары.Form.ФормаЭлемента + + + + + + + + + + false + + + Automatic + Use + + + + + + DontUse + Auto + DontUse + false + false + + + + + Артикул + + + ru + Артикул + + + + + xs:string + + 25 + Variable + + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + ForItem + DontIndex + Use + Use + + +
ФормаЭлемента
+
+
+
diff --git a/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Catalogs/Товары/Ext/ObjectModule.bsl b/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Catalogs/Товары/Ext/ObjectModule.bsl new file mode 100644 index 00000000..e69de29b diff --git a/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Catalogs/Товары/Forms/ФормаЭлемента.xml b/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Catalogs/Товары/Forms/ФормаЭлемента.xml new file mode 100644 index 00000000..e64cb98b --- /dev/null +++ b/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Catalogs/Товары/Forms/ФормаЭлемента.xml @@ -0,0 +1,21 @@ + + +
+ + ФормаЭлемента + + + ru + ФормаЭлемента + + + + Managed + false + + PlatformApplication + MobilePlatformApplication + + +
+
\ No newline at end of file diff --git a/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Catalogs/Товары/Forms/ФормаЭлемента/Ext/Form.xml b/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Catalogs/Товары/Forms/ФормаЭлемента/Ext/Form.xml new file mode 100644 index 00000000..63fcb7fe --- /dev/null +++ b/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Catalogs/Товары/Forms/ФормаЭлемента/Ext/Form.xml @@ -0,0 +1,76 @@ + +
+ + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Тест</v8:content> + </v8:item> + + false + + + + Объект.Артикул + + + + + Метки + Метки + Метки + + + + + ПолеПодвала + ПолеПодвала + + + ru + Итого + + + + + + + + + + cfg:CatalogObject.Товары + + true + true + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Метки</v8:content> + </v8:item> + + + xs:string + + 50 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Поле подвала</v8:content> + </v8:item> + + + xs:string + + 50 + Variable + + + + + diff --git a/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Catalogs/Товары/Forms/ФормаЭлемента/Ext/Form/Module.bsl b/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Catalogs/Товары/Forms/ФормаЭлемента/Ext/Form/Module.bsl new file mode 100644 index 00000000..8ead4cec --- /dev/null +++ b/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Catalogs/Товары/Forms/ФормаЭлемента/Ext/Form/Module.bsl @@ -0,0 +1,19 @@ +#Область ОбработчикиСобытийФормы + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовФормы + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +#КонецОбласти + +#Область ОбработчикиОповещений + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +#КонецОбласти \ No newline at end of file diff --git a/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Configuration.xml b/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Configuration.xml new file mode 100644 index 00000000..5405b1b5 --- /dev/null +++ b/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Configuration.xml @@ -0,0 +1,252 @@ + + + + + + UUID-002 + UUID-003 + + + UUID-004 + UUID-005 + + + UUID-006 + UUID-007 + + + UUID-008 + UUID-009 + + + UUID-010 + UUID-011 + + + UUID-012 + UUID-013 + + + UUID-014 + UUID-015 + + + + TestConfig + + + ru + TestConfig + + + + + Version8_3_24 + ManagedApplication + + PlatformApplication + + Russian + + + + + false + false + false + + + + + + + + + + + + + + + + + + + + + + Biometrics + true + + + Location + false + + + BackgroundLocation + false + + + BluetoothPrinters + false + + + WiFiPrinters + false + + + Contacts + false + + + Calendars + false + + + PushNotifications + false + + + LocalNotifications + false + + + InAppPurchases + false + + + PersonalComputerFileExchange + false + + + Ads + false + + + NumberDialing + false + + + CallProcessing + false + + + CallLog + false + + + AutoSendSMS + false + + + ReceiveSMS + false + + + SMSLog + false + + + Camera + false + + + Microphone + false + + + MusicLibrary + false + + + PictureAndVideoLibraries + false + + + AudioPlaybackAndVibration + false + + + BackgroundAudioPlaybackAndVibration + false + + + InstallPackages + false + + + OSBackup + true + + + ApplicationUsageStatistics + false + + + BarcodeScanning + false + + + BackgroundAudioRecording + false + + + AllFilesAccess + false + + + Videoconferences + false + + + NFC + false + + + DocumentScanning + false + + + SpeechToText + false + + + Geofences + false + + + IncomingShareRequests + false + + + AllIncomingShareRequestsTypesProcessing + false + + + + + + Normal + + + Language.Русский + + + + + + Managed + NotAutoFree + DontUse + DontUse + TaxiEnableVersion8_2 + DontUse + Version8_3_24 + + + + Русский + Товары + + + \ No newline at end of file diff --git a/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Ext/Catalogs/Товары.xml b/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Ext/Catalogs/Товары.xml new file mode 100644 index 00000000..495b109a --- /dev/null +++ b/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Ext/Catalogs/Товары.xml @@ -0,0 +1,53 @@ + + + + + + UUID-002 + UUID-003 + + + UUID-004 + UUID-005 + + + UUID-006 + UUID-007 + + + UUID-008 + UUID-009 + + + UUID-010 + UUID-011 + + + + Adopted + Товары + + UUID-012 + false + true + 9 + 25 + String + Variable + + +
ФормаЭлемента
+ + + + + Adopted + Артикул + + UUID-014 + xs:string25Variable + + +
+
+
\ No newline at end of file diff --git a/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Ext/Catalogs/Товары/Forms/ФормаЭлемента.xml b/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Ext/Catalogs/Товары/Forms/ФормаЭлемента.xml new file mode 100644 index 00000000..4e3c364d --- /dev/null +++ b/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Ext/Catalogs/Товары/Forms/ФормаЭлемента.xml @@ -0,0 +1,13 @@ + + +
+ + + Adopted + ФормаЭлемента + + UUID-002 + Managed + + +
\ No newline at end of file diff --git a/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Ext/Catalogs/Товары/Forms/ФормаЭлемента/Ext/Form.xml b/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Ext/Catalogs/Товары/Forms/ФормаЭлемента/Ext/Form.xml new file mode 100644 index 00000000..7383403f --- /dev/null +++ b/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Ext/Catalogs/Товары/Forms/ФормаЭлемента/Ext/Form.xml @@ -0,0 +1,77 @@ + +
+ + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Тест</v8:content> + </v8:item> + + false + + + + Объект.Артикул + + + + + + + + + + + ru + Итого + + + + + + + + + cfg:CatalogObject.Товары + true + true + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Тест</v8:content> + </v8:item> + + false + + + + Объект.Артикул + + + + + + + + + + + ru + Итого + + + + + + + + + cfg:CatalogObject.Товары + true + true + + + + \ No newline at end of file diff --git a/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Ext/Catalogs/Товары/Forms/ФормаЭлемента/Ext/Form/Module.bsl b/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Ext/Catalogs/Товары/Forms/ФормаЭлемента/Ext/Form/Module.bsl new file mode 100644 index 00000000..e69de29b diff --git a/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Ext/ClientApplicationInterface.xml b/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Ext/ClientApplicationInterface.xml new file mode 100644 index 00000000..3c1161b2 --- /dev/null +++ b/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Ext/ClientApplicationInterface.xml @@ -0,0 +1,18 @@ + + + + + UUID-002 + + + + + UUID-004 + + + + + + + + \ No newline at end of file diff --git a/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Ext/Configuration.xml b/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Ext/Configuration.xml new file mode 100644 index 00000000..5c0f84b5 --- /dev/null +++ b/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Ext/Configuration.xml @@ -0,0 +1,72 @@ + + + + + + UUID-002 + UUID-003 + + + UUID-004 + UUID-005 + + + UUID-006 + UUID-007 + + + UUID-008 + UUID-009 + + + UUID-010 + UUID-011 + + + UUID-012 + UUID-013 + + + UUID-014 + UUID-015 + + + + Adopted + Тест + + + ru + Тест + + + + Customization + true + Тест_ + Version8_3_24 + ManagedApplication + + PlatformApplication + + Russian + + Role.Тест_ОсновнаяРоль + + + + Language.Русский + + + + + + TaxiEnableVersion8_2 + + + Русский + Тест_ОсновнаяРоль + Товары + + + \ No newline at end of file diff --git a/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Ext/Languages/Русский.xml b/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Ext/Languages/Русский.xml new file mode 100644 index 00000000..c21624f5 --- /dev/null +++ b/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Ext/Languages/Русский.xml @@ -0,0 +1,13 @@ + + + + + + Adopted + Русский + + UUID-002 + ru + + + \ No newline at end of file diff --git a/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Ext/Roles/Тест_ОсновнаяРоль.xml b/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Ext/Roles/Тест_ОсновнаяРоль.xml new file mode 100644 index 00000000..ec9dfbaf --- /dev/null +++ b/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Ext/Roles/Тест_ОсновнаяРоль.xml @@ -0,0 +1,10 @@ + + + + + Тест_ОсновнаяРоль + + + + + \ No newline at end of file diff --git a/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Languages/Русский.xml b/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Languages/Русский.xml new file mode 100644 index 00000000..37c60d78 --- /dev/null +++ b/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Languages/Русский.xml @@ -0,0 +1,16 @@ + + + + + Русский + + + ru + Русский + + + + ru + + + \ No newline at end of file