test(cfe-borrow): платформенная верификация кейсов на связи параметров выбора

Прогон verify-snapshots вскрыл, что два новых кейса опирались на вход, который
платформа не принимает — падала конфигурация-источник, а не расширение.

form-choice-link-items: путь «Items.Ячейка.CurrentData.Склад» был невалиден,
потому что Ячейка — поле ввода, а не таблица. Кейс пересобран на настоящей
табличной части: путь корректен, связь по-прежнему вырезается, фикстура
грузится. Кейс продолжает падать на коде до правки.

form-choice-link-dangling: вход намеренно содержит путь на несуществующий
реквизит объекта — в валидной конфигурации такой формы не бывает, а проверяется
именно поведение навыка на таком пути. Помечен skipPlatformVerify с причиной.

После правок verify-snapshots --skill cfe-borrow: 21 прошло, 0 упало,
1 пропущен по объявленной причине. cfe-validate — 7 из 7.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-08-14 17:46:55 +03:00
co-authored by Claude Opus 5
parent 6c491c4f2e
commit ace9e29e91
5 changed files with 277 additions and 116 deletions
@@ -97,5 +97,6 @@
"<ChoiceParameterLinks>"
]
}
}
},
"skipPlatformVerify": "вход намеренно содержит путь, который платформа отвергает: в валидной конфигурации форма не может ссылаться на несуществующий реквизит объекта, а проверяется именно поведение навыка на таком пути. Расширение на выходе валидно, но verify-snapshots грузит и конфигурацию-источник"
}
@@ -3,49 +3,30 @@
"preRun": [
{
"script": "meta-compile/scripts/meta-compile",
"input": {
"type": "Catalog",
"name": "Склады"
},
"args": {
"-JsonPath": "{inputFile}",
"-OutputDir": "{workDir}"
}
"input": { "type": "Catalog", "name": "Склады" },
"args": { "-JsonPath": "{inputFile}", "-OutputDir": "{workDir}" }
},
{
"script": "meta-compile/scripts/meta-compile",
"input": { "type": "Catalog", "name": "Ячейки" },
"args": { "-JsonPath": "{inputFile}", "-OutputDir": "{workDir}" }
},
{
"script": "meta-compile/scripts/meta-compile",
"input": {
"type": "Catalog",
"name": "Ячейки"
"type": "Document", "name": "Размещение",
"tabularSections": {
"Строки": [
"Склад: CatalogRef.Склады",
"Ячейка: CatalogRef.Ячейки"
]
}
},
"args": {
"-JsonPath": "{inputFile}",
"-OutputDir": "{workDir}"
}
},
{
"script": "meta-compile/scripts/meta-compile",
"input": {
"type": "Document",
"name": "Размещение",
"attributes": [
{
"name": "Ячейка",
"type": "CatalogRef.Ячейки"
}
]
},
"args": {
"-JsonPath": "{inputFile}",
"-OutputDir": "{workDir}"
}
"args": { "-JsonPath": "{inputFile}", "-OutputDir": "{workDir}" }
},
{
"script": "form-add/scripts/form-add",
"args": {
"-ObjectPath": "{workDir}/Documents/Размещение.xml",
"-FormName": "ФормаДокумента"
}
"args": { "-ObjectPath": "{workDir}/Documents/Размещение.xml", "-FormName": "ФормаДокумента" }
},
{
"script": "form-compile/scripts/form-compile",
@@ -53,49 +34,32 @@
"title": "Размещение",
"elements": [
{
"input": "Ячейка",
"path": "Объект.Ячейка",
"choiceParameterLinks": [
"table": "Строки", "path": "Объект.Строки",
"columns": [
{ "input": "Склад", "path": "Объект.Строки.Склад" },
{
"name": "Отбор.Владелец",
"dataPath": "Items.Ячейка.CurrentData.Склад"
"input": "Ячейка", "path": "Объект.Строки.Ячейка",
"choiceParameterLinks": [
{ "name": "Отбор.Владелец", "dataPath": "Items.Строки.CurrentData.Склад" }
]
}
]
}
],
"attributes": [
{
"name": "Объект",
"type": "DocumentObject.Размещение",
"main": true
}
]
"attributes": [ { "name": "Объект", "type": "DocumentObject.Размещение", "main": true } ]
},
"args": {
"-JsonPath": "{inputFile}",
"-OutputPath": "{workDir}/Documents/Размещение/Forms/ФормаДокумента/Ext/Form.xml"
}
"args": { "-JsonPath": "{inputFile}", "-OutputPath": "{workDir}/Documents/Размещение/Forms/ФормаДокумента/Ext/Form.xml" }
},
{
"script": "cfe-init/scripts/cfe-init",
"args": {
"-Name": "Тест",
"-OutputDir": "{workDir}/ext",
"-ConfigPath": "{workDir}"
}
"args": { "-Name": "Тест", "-OutputDir": "{workDir}/ext", "-ConfigPath": "{workDir}" }
}
],
"params": {
"extensionPath": "ext",
"object": "Document.Размещение.Form.ФормаДокумента"
},
"params": { "extensionPath": "ext", "object": "Document.Размещение.Form.ФормаДокумента" },
"expect": {
"fileNotContains": {
"file": "ext/Documents/Размещение/Forms/ФормаДокумента/Ext/Form.xml",
"text": [
"<xr:Link>",
"Items.Ячейка.CurrentData.Склад"
]
"text": ["<xr:Link>", "Items.Строки.CurrentData.Склад"]
}
}
}
@@ -78,46 +78,135 @@
<ExecuteAfterWriteDataHistoryVersionProcessing>false</ExecuteAfterWriteDataHistoryVersionProcessing>
</Properties>
<ChildObjects>
<Attribute uuid="UUID-012">
<Form>ФормаДокумента</Form>
<TabularSection uuid="UUID-012">
<InternalInfo>
<xr:GeneratedType name="DocumentTabularSection.Размещение.Строки" category="TabularSection">
<xr:TypeId>UUID-013</xr:TypeId>
<xr:ValueId>UUID-014</xr:ValueId>
</xr:GeneratedType>
<xr:GeneratedType name="DocumentTabularSectionRow.Размещение.Строки" category="TabularSectionRow">
<xr:TypeId>UUID-015</xr:TypeId>
<xr:ValueId>UUID-016</xr:ValueId>
</xr:GeneratedType>
</InternalInfo>
<Properties>
<Name>Ячейка</Name>
<Name>Строки</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Ячейка</v8:content>
<v8:content>Строки</v8:content>
</v8:item>
</Synonym>
<Comment/>
<Type>
<v8:Type>cfg:CatalogRef.Ячейки</v8:Type>
</Type>
<PasswordMode>false</PasswordMode>
<Format/>
<EditFormat/>
<ToolTip/>
<MarkNegatives>false</MarkNegatives>
<Mask/>
<MultiLine>false</MultiLine>
<ExtendedEdit>false</ExtendedEdit>
<MinValue xsi:nil="true"/>
<MaxValue xsi:nil="true"/>
<FillFromFillingValue>false</FillFromFillingValue>
<FillValue xsi:nil="true"/>
<FillChecking>DontCheck</FillChecking>
<ChoiceFoldersAndItems>Items</ChoiceFoldersAndItems>
<ChoiceParameterLinks/>
<ChoiceParameters/>
<QuickChoice>Auto</QuickChoice>
<CreateOnInput>Auto</CreateOnInput>
<ChoiceForm/>
<LinkByType/>
<ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput>
<Indexing>DontIndex</Indexing>
<FullTextSearch>Use</FullTextSearch>
<DataHistory>Use</DataHistory>
<StandardAttributes>
<xr:StandardAttribute name="LineNumber">
<xr:LinkByType/>
<xr:FillChecking>DontCheck</xr:FillChecking>
<xr:MultiLine>false</xr:MultiLine>
<xr:FillFromFillingValue>false</xr:FillFromFillingValue>
<xr:CreateOnInput>Auto</xr:CreateOnInput>
<xr:MaxValue xsi:nil="true"/>
<xr:ToolTip/>
<xr:ExtendedEdit>false</xr:ExtendedEdit>
<xr:Format/>
<xr:ChoiceForm/>
<xr:QuickChoice>Auto</xr:QuickChoice>
<xr:ChoiceHistoryOnInput>Auto</xr:ChoiceHistoryOnInput>
<xr:EditFormat/>
<xr:PasswordMode>false</xr:PasswordMode>
<xr:DataHistory>Use</xr:DataHistory>
<xr:MarkNegatives>false</xr:MarkNegatives>
<xr:MinValue xsi:nil="true"/>
<xr:Synonym/>
<xr:Comment/>
<xr:FullTextSearch>Use</xr:FullTextSearch>
<xr:ChoiceParameterLinks/>
<xr:FillValue xsi:nil="true"/>
<xr:Mask/>
<xr:ChoiceParameters/>
</xr:StandardAttribute>
</StandardAttributes>
</Properties>
</Attribute>
<Form>ФормаДокумента</Form>
<ChildObjects>
<Attribute uuid="UUID-017">
<Properties>
<Name>Склад</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Склад</v8:content>
</v8:item>
</Synonym>
<Comment/>
<Type>
<v8:Type>cfg:CatalogRef.Склады</v8:Type>
</Type>
<PasswordMode>false</PasswordMode>
<Format/>
<EditFormat/>
<ToolTip/>
<MarkNegatives>false</MarkNegatives>
<Mask/>
<MultiLine>false</MultiLine>
<ExtendedEdit>false</ExtendedEdit>
<MinValue xsi:nil="true"/>
<MaxValue xsi:nil="true"/>
<FillChecking>DontCheck</FillChecking>
<ChoiceFoldersAndItems>Items</ChoiceFoldersAndItems>
<ChoiceParameterLinks/>
<ChoiceParameters/>
<QuickChoice>Auto</QuickChoice>
<CreateOnInput>Auto</CreateOnInput>
<ChoiceForm/>
<LinkByType/>
<ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput>
<Indexing>DontIndex</Indexing>
<FullTextSearch>Use</FullTextSearch>
<DataHistory>Use</DataHistory>
</Properties>
</Attribute>
<Attribute uuid="UUID-018">
<Properties>
<Name>Ячейка</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Ячейка</v8:content>
</v8:item>
</Synonym>
<Comment/>
<Type>
<v8:Type>cfg:CatalogRef.Ячейки</v8:Type>
</Type>
<PasswordMode>false</PasswordMode>
<Format/>
<EditFormat/>
<ToolTip/>
<MarkNegatives>false</MarkNegatives>
<Mask/>
<MultiLine>false</MultiLine>
<ExtendedEdit>false</ExtendedEdit>
<MinValue xsi:nil="true"/>
<MaxValue xsi:nil="true"/>
<FillChecking>DontCheck</FillChecking>
<ChoiceFoldersAndItems>Items</ChoiceFoldersAndItems>
<ChoiceParameterLinks/>
<ChoiceParameters/>
<QuickChoice>Auto</QuickChoice>
<CreateOnInput>Auto</CreateOnInput>
<ChoiceForm/>
<LinkByType/>
<ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput>
<Indexing>DontIndex</Indexing>
<FullTextSearch>Use</FullTextSearch>
<DataHistory>Use</DataHistory>
</Properties>
</Attribute>
</ChildObjects>
</TabularSection>
</ChildObjects>
</Document>
</MetaDataObject>
@@ -9,21 +9,58 @@
<AutoTitle>false</AutoTitle>
<AutoCommandBar name="ФормаКоманднаяПанель" id="-1"/>
<ChildItems>
<InputField name="Ячейка" id="1">
<DataPath>Объект.Ячейка</DataPath>
<ChoiceParameterLinks>
<xr:Link>
<xr:Name>Отбор.Владелец</xr:Name>
<xr:DataPath xsi:type="xs:string">Items.Ячейка.CurrentData.Склад</xr:DataPath>
<xr:ValueChange>Clear</xr:ValueChange>
</xr:Link>
</ChoiceParameterLinks>
<ContextMenu name="ЯчейкаКонтекстноеМеню" id="2"/>
<ExtendedTooltip name="ЯчейкаРасширеннаяПодсказка" id="3"/>
</InputField>
<Table name="Строки" id="1">
<DataPath>Объект.Строки</DataPath>
<ContextMenu name="СтрокиКонтекстноеМеню" id="2"/>
<AutoCommandBar name="СтрокиКоманднаяПанель" id="3"/>
<ExtendedTooltip name="СтрокиРасширеннаяПодсказка" id="4"/>
<SearchStringAddition name="СтрокиСтрокаПоиска" id="5">
<AdditionSource>
<Item>Строки</Item>
<Type>SearchStringRepresentation</Type>
</AdditionSource>
<ContextMenu name="СтрокиСтрокаПоискаКонтекстноеМеню" id="6"/>
<ExtendedTooltip name="СтрокиСтрокаПоискаРасширеннаяПодсказка" id="7"/>
</SearchStringAddition>
<ViewStatusAddition name="СтрокиСостояниеПросмотра" id="8">
<AdditionSource>
<Item>Строки</Item>
<Type>ViewStatusRepresentation</Type>
</AdditionSource>
<ContextMenu name="СтрокиСостояниеПросмотраКонтекстноеМеню" id="9"/>
<ExtendedTooltip name="СтрокиСостояниеПросмотраРасширеннаяПодсказка" id="10"/>
</ViewStatusAddition>
<SearchControlAddition name="СтрокиУправлениеПоиском" id="11">
<AdditionSource>
<Item>Строки</Item>
<Type>SearchControl</Type>
</AdditionSource>
<ContextMenu name="СтрокиУправлениеПоискомКонтекстноеМеню" id="12"/>
<ExtendedTooltip name="СтрокиУправлениеПоискомРасширеннаяПодсказка" id="13"/>
</SearchControlAddition>
<ChildItems>
<InputField name="Склад" id="14">
<DataPath>Объект.Строки.Склад</DataPath>
<ContextMenu name="СкладКонтекстноеМеню" id="15"/>
<ExtendedTooltip name="СкладРасширеннаяПодсказка" id="16"/>
</InputField>
<InputField name="Ячейка" id="17">
<DataPath>Объект.Строки.Ячейка</DataPath>
<ChoiceParameterLinks>
<xr:Link>
<xr:Name>Отбор.Владелец</xr:Name>
<xr:DataPath xsi:type="xs:string">Items.Строки.CurrentData.Склад</xr:DataPath>
<xr:ValueChange>Clear</xr:ValueChange>
</xr:Link>
</ChoiceParameterLinks>
<ContextMenu name="ЯчейкаКонтекстноеМеню" id="18"/>
<ExtendedTooltip name="ЯчейкаРасширеннаяПодсказка" id="19"/>
</InputField>
</ChildItems>
</Table>
</ChildItems>
<Attributes>
<Attribute name="Объект" id="4">
<Attribute name="Объект" id="20">
<Type>
<v8:Type>cfg:DocumentObject.Размещение</v8:Type>
</Type>
@@ -9,10 +9,45 @@
<AutoTitle>false</AutoTitle>
<AutoCommandBar name="ФормаКоманднаяПанель" id="-1"/>
<ChildItems>
<InputField name="Ячейка" id="1">
<ContextMenu name="ЯчейкаКонтекстноеМеню" id="2"/>
<ExtendedTooltip name="ЯчейкаРасширеннаяПодсказка" id="3"/>
</InputField>
<Table name="Строки" id="1">
<ContextMenu name="СтрокиКонтекстноеМеню" id="2"/>
<AutoCommandBar name="СтрокиКоманднаяПанель" id="3"/>
<ExtendedTooltip name="СтрокиРасширеннаяПодсказка" id="4"/>
<SearchStringAddition name="СтрокиСтрокаПоиска" id="5">
<AdditionSource>
<Item>Строки</Item>
<Type>SearchStringRepresentation</Type>
</AdditionSource>
<ContextMenu name="СтрокиСтрокаПоискаКонтекстноеМеню" id="6"/>
<ExtendedTooltip name="СтрокиСтрокаПоискаРасширеннаяПодсказка" id="7"/>
</SearchStringAddition>
<ViewStatusAddition name="СтрокиСостояниеПросмотра" id="8">
<AdditionSource>
<Item>Строки</Item>
<Type>ViewStatusRepresentation</Type>
</AdditionSource>
<ContextMenu name="СтрокиСостояниеПросмотраКонтекстноеМеню" id="9"/>
<ExtendedTooltip name="СтрокиСостояниеПросмотраРасширеннаяПодсказка" id="10"/>
</ViewStatusAddition>
<SearchControlAddition name="СтрокиУправлениеПоиском" id="11">
<AdditionSource>
<Item>Строки</Item>
<Type>SearchControl</Type>
</AdditionSource>
<ContextMenu name="СтрокиУправлениеПоискомКонтекстноеМеню" id="12"/>
<ExtendedTooltip name="СтрокиУправлениеПоискомРасширеннаяПодсказка" id="13"/>
</SearchControlAddition>
<ChildItems>
<InputField name="Склад" id="14">
<ContextMenu name="СкладКонтекстноеМеню" id="15"/>
<ExtendedTooltip name="СкладРасширеннаяПодсказка" id="16"/>
</InputField>
<InputField name="Ячейка" id="17">
<ContextMenu name="ЯчейкаКонтекстноеМеню" id="18"/>
<ExtendedTooltip name="ЯчейкаРасширеннаяПодсказка" id="19"/>
</InputField>
</ChildItems>
</Table>
</ChildItems>
<Attributes/>
<BaseForm version="2.17">
@@ -25,10 +60,45 @@
<AutoTitle>false</AutoTitle>
<AutoCommandBar name="ФормаКоманднаяПанель" id="-1"/>
<ChildItems>
<InputField name="Ячейка" id="1">
<ContextMenu name="ЯчейкаКонтекстноеМеню" id="2"/>
<ExtendedTooltip name="ЯчейкаРасширеннаяПодсказка" id="3"/>
</InputField>
<Table name="Строки" id="1">
<ContextMenu name="СтрокиКонтекстноеМеню" id="2"/>
<AutoCommandBar name="СтрокиКоманднаяПанель" id="3"/>
<ExtendedTooltip name="СтрокиРасширеннаяПодсказка" id="4"/>
<SearchStringAddition name="СтрокиСтрокаПоиска" id="5">
<AdditionSource>
<Item>Строки</Item>
<Type>SearchStringRepresentation</Type>
</AdditionSource>
<ContextMenu name="СтрокиСтрокаПоискаКонтекстноеМеню" id="6"/>
<ExtendedTooltip name="СтрокиСтрокаПоискаРасширеннаяПодсказка" id="7"/>
</SearchStringAddition>
<ViewStatusAddition name="СтрокиСостояниеПросмотра" id="8">
<AdditionSource>
<Item>Строки</Item>
<Type>ViewStatusRepresentation</Type>
</AdditionSource>
<ContextMenu name="СтрокиСостояниеПросмотраКонтекстноеМеню" id="9"/>
<ExtendedTooltip name="СтрокиСостояниеПросмотраРасширеннаяПодсказка" id="10"/>
</ViewStatusAddition>
<SearchControlAddition name="СтрокиУправлениеПоиском" id="11">
<AdditionSource>
<Item>Строки</Item>
<Type>SearchControl</Type>
</AdditionSource>
<ContextMenu name="СтрокиУправлениеПоискомКонтекстноеМеню" id="12"/>
<ExtendedTooltip name="СтрокиУправлениеПоискомРасширеннаяПодсказка" id="13"/>
</SearchControlAddition>
<ChildItems>
<InputField name="Склад" id="14">
<ContextMenu name="СкладКонтекстноеМеню" id="15"/>
<ExtendedTooltip name="СкладРасширеннаяПодсказка" id="16"/>
</InputField>
<InputField name="Ячейка" id="17">
<ContextMenu name="ЯчейкаКонтекстноеМеню" id="18"/>
<ExtendedTooltip name="ЯчейкаРасширеннаяПодсказка" id="19"/>
</InputField>
</ChildItems>
</Table>
</ChildItems>
<Attributes/>
</BaseForm>