feat(form-validate,cfe-borrow): проверка висячих привязок + идемпотентность re-borrow + добор по Field

Три доработки по форме, полезные модели, использующей навыки.

form-validate v1.7→v1.8 (5a): Check 5 генерализован с одного <DataPath> на все
8 тегов-привязок (DataPath/TitleDataPath/FooterDataPath/HeaderDataPath/
MultipleValue*DataPath/RowPicture*). Висячая привязка (корень не в <Attributes>)
теперь ловится при validate, а не всплывает на дорогом db-load. Skip-правила
(companion-элементы, базовые элементы id<1000000 в BaseForm, opaque-формы)
сохранены без изменений. Заодно фикс бага Check 12 в py-порте
(type_invalid → type_error_count, краш на невалидном cfg:-типе в config-контексте).

cfe-borrow v1.4→v1.5:
- #4: borrow_form переиспользует uuid обёртки Forms/<Name>.xml, если файл уже
  существует, вместо генерации нового → повторное заимствование формы
  байт-идемпотентно (агент может ретраить без дрейфа identity).
- #1: collect для -BorrowMainAttribute дополнен сканом <Field>Объект.X</Field>
  (поля фильтров/условного оформления/динсписков) — набор заимствованных
  реквизитов теперь совпадает с Конфигуратором (добавился УдалитьЮрФизЛицо).

Тесты: form-validate/dangling-binding (фикстура broken-dangling-binding,
expectError+stdoutContains); cfe-borrow/form-bindings + idempotent:true.
Регресс 6/6 cfe-borrow + 11/11 form-validate на обоих рантаймах, E2E-load OK.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-06-23 12:38:39 +03:00
co-authored by Claude Opus 4.8
parent 4767800fce
commit 36c2fd9233
7 changed files with 213 additions and 107 deletions
@@ -37,5 +37,6 @@
}
],
"params": { "extensionPath": "ext", "object": "Catalog.Товары.Form.ФормаЭлемента" },
"args_extra": ["-BorrowMainAttribute", "Form"]
"args_extra": ["-BorrowMainAttribute", "Form"],
"idempotent": true
}
@@ -0,0 +1,7 @@
{
"name": "Ошибка: висячая привязка данных (MultipleValueDataPath без реквизита)",
"setup": "fixture:broken-dangling-binding",
"params": { "formPath": "DataProcessors/Тест/Forms/Форма" },
"expectError": true,
"expect": { "stdoutContains": "MultipleValueDataPath" }
}
@@ -0,0 +1,24 @@
<?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">
<AutoCommandBar name="ФормаКоманднаяПанель" id="-1">
<Autofill>true</Autofill>
</AutoCommandBar>
<ChildItems>
<InputField name="ПолеМеток" id="2">
<DataPath>Метки</DataPath>
<MultipleValueDataPath>Метки.Значение</MultipleValueDataPath>
<MultipleValuePresentDataPath>Метки.Представление</MultipleValuePresentDataPath>
<ContextMenu name="ПолеМетокКонтекстноеМеню" id="3"/>
<ExtendedTooltip name="ПолеМетокРасширеннаяПодсказка" id="4"/>
</InputField>
</ChildItems>
<Attributes>
<Attribute name="Объект" id="1">
<Type>
<v8:Type>cfg:DataProcessorObject.Тест</v8:Type>
</Type>
<MainAttribute>true</MainAttribute>
<SavedData>true</SavedData>
</Attribute>
</Attributes>
</Form>