feat(form-validate): silent-skip числовых и UUID-DataPath в Check 5

В реальных выгрузках ERP/БП встречаются непрозрачные платформенные
DataPath, которые невозможно проверить из одного Form.xml:
- bare numeric ("10", "1000003") — внутренние индексы платформы
- "N/M:<uuid>" — ссылка на метаданные по UUID

Раньше Check 5 ругался на них "attribute not found". Теперь такие
пути пропускаются без счёта в paths checked и без ошибки.

Реалистичные пользовательские опечатки (кириллица в имени атрибута)
продолжают ловиться обычной проверкой attrMap.

Добавлен тест-кейс datapath-opaque-refs, версия v1.5 → v1.6.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-05-15 11:40:27 +03:00
parent 54cbc69a59
commit 8b0f55f1cc
4 changed files with 55 additions and 2 deletions
@@ -1,4 +1,4 @@
# form-validate v1.5 — Validate 1C managed form
# form-validate v1.6 — Validate 1C managed form
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
param(
[Parameter(Mandatory)]
@@ -366,6 +366,13 @@ if (-not $stopped) {
$dataPath = $dpNode.InnerText.Trim()
if (-not $dataPath) { continue }
# Opaque platform-internal DataPath shapes — not validatable from Form.xml alone:
# - bare numeric (e.g. "10", "1000003") — internal index
# - "N/M:<uuid>" — metadata reference by UUID
if ($dataPath -match '^\d+$' -or $dataPath -match '^\d+/\d+:[0-9a-fA-F-]+$') {
continue
}
$pathChecked++
# Extract root segment of path, strip array indices like [0]
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
# form-validate v1.5 — Validate 1C managed form
# form-validate v1.6 — Validate 1C managed form
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse
@@ -376,6 +376,12 @@ def main():
if not data_path:
continue
# Opaque platform-internal DataPath shapes — not validatable from Form.xml alone:
# - bare numeric (e.g. "10", "1000003") — internal index
# - "N/M:<uuid>" — metadata reference by UUID
if re.match(r'^\d+$', data_path) or re.match(r'^\d+/\d+:[0-9a-fA-F-]+$', data_path):
continue
path_checked += 1
clean_path = re.sub(r'\[\d+\]', '', data_path)
@@ -0,0 +1,5 @@
{
"name": "Числовые и UUID DataPath не вызывают ложных ошибок",
"setup": "fixture:datapath-opaque-refs",
"params": { "formPath": "DataProcessors/Opaque/Forms/Форма" }
}
@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>
<Form xmlns="http://v8.1c.ru/8.3/xcf/logform" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.17">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Тест</v8:content>
</v8:item>
</Title>
<AutoCommandBar name="ФормаКоманднаяПанель" id="-1"/>
<ChildItems>
<InputField name="ПривязкаПоUUID" id="1">
<DataPath>1/0:a917a122-f663-4c45-8de0-fd5104007de3</DataPath>
<ContextMenu name="ПривязкаПоUUIDКонтекстноеМеню" id="2"/>
<ExtendedTooltip name="ПривязкаПоUUIDРасширеннаяПодсказка" id="3"/>
</InputField>
<LabelField name="ЧисловаяПривязка" id="4">
<DataPath>10</DataPath>
<ContextMenu name="ЧисловаяПривязкаКонтекстноеМеню" id="5"/>
<ExtendedTooltip name="ЧисловаяПривязкаРасширеннаяПодсказка" id="6"/>
</LabelField>
<InputField name="Нормальное" id="7">
<DataPath>Объект.Наименование</DataPath>
<ContextMenu name="НормальноеКонтекстноеМеню" id="8"/>
<ExtendedTooltip name="НормальноеРасширеннаяПодсказка" id="9"/>
</InputField>
</ChildItems>
<Attributes>
<Attribute name="Объект" id="10">
<Type>
<v8:Type>cfg:DataProcessorObject.Opaque</v8:Type>
</Type>
<MainAttribute>true</MainAttribute>
</Attribute>
</Attributes>
</Form>