diff --git a/.claude/skills/form-add/SKILL.md b/.claude/skills/form-add/SKILL.md
index 7970b9055..b5570c07c 100644
--- a/.claude/skills/form-add/SKILL.md
+++ b/.claude/skills/form-add/SKILL.md
@@ -62,10 +62,15 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/form-add.ps1" -Obje
| DocumentJournal, FilterCriterion | List, Custom |
| Enum | List, Choice, Custom |
| SettingsStorage | Save, Load, Custom |
+| Table (таблица внешнего источника) | `tableDataType=ObjectData` — Object, List, Choice, Custom; `NonobjectData` — Record, List, Choice, Custom |
Недопустимое сочетание отклоняется со списком доступных для этого типа. У константы собственных
форм нет — для неё используется общая форма (`CommonForm`).
+Таблица внешнего источника адресуется файлом таблицы:
+`ExternalDataSources/<Источник>/Tables/<Таблица>.xml`. Ссылки в такой форме трёхчастные;
+без `-Purpose` берётся форма объекта, а у таблицы с составным ключом — форма записи.
+
## Примеры
```
diff --git a/.claude/skills/form-add/scripts/form-add.ps1 b/.claude/skills/form-add/scripts/form-add.ps1
index 63a1ca22d..107660776 100644
--- a/.claude/skills/form-add/scripts/form-add.ps1
+++ b/.claude/skills/form-add/scripts/form-add.ps1
@@ -1,4 +1,4 @@
-# form-add v1.28 — Add managed form to 1C config object
+# form-add v1.29 — Add managed form to 1C config object
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
[CmdletBinding(PositionalBinding=$false)]
param(
@@ -370,6 +370,15 @@ $formKinds = @{
"Load" = @{ MainAttr = $null; AttrName = $null; Slot = "DefaultLoadForm" }
"Custom" = @{ MainAttr = $null; AttrName = $null; Slot = $null }
}
+ # Таблица внешнего источника — единственный вид, чьё имя в ссылках трёхчастное
+ # (Источник.Таблица): подставляется {2}, а не {1}.
+ "Table" = @{
+ "Object" = @{ MainAttr = "ExternalDataSourceTableObject.{2}"; AttrName = "Объект"; Slot = "DefaultObjectForm"; SavedData = $true; Primary = $true }
+ "Record" = @{ MainAttr = "ExternalDataSourceTableRecordManager.{2}"; AttrName = "Запись"; Slot = "DefaultRecordForm"; SavedData = $true }
+ "List" = @{ MainAttr = "DynamicList"; AttrName = "Список"; Slot = "DefaultListForm" }
+ "Choice" = @{ MainAttr = "DynamicList"; AttrName = "Список"; Slot = "DefaultChoiceForm" }
+ "Custom" = @{ MainAttr = $null; AttrName = $null; Slot = $null }
+ }
}
# Виды, у которых свойство DefaultForm есть, но собственных форм не бывает — отказ с причиной,
@@ -422,6 +431,25 @@ if (-not $objectName) {
Write-Host ""
Write-Host "=== form-add ==="
Write-Host ""
+# Ссылка на объект и имя для типов формы. У всех видов это "Вид.Имя", и только
+# у таблицы внешнего источника — "ExternalDataSource.<Источник>.Table.<Таблица>", а в именах
+# типов — "<Источник>.<Таблица>". Имя источника в самом файле таблицы не хранится —
+# единственное место, где навык смотрит на путь: ExternalDataSources/<Источник>/Tables/<Таблица>.xml
+$objectQualifiedName = $objectName
+$objectRef = "$objectType.$objectName"
+if ($objectType -eq "Table") {
+ $tablesDir = Split-Path -Parent $objectXmlFull.Path
+ $edsSource = Split-Path -Leaf (Split-Path -Parent $tablesDir)
+ if (-not $edsSource -or (Split-Path -Leaf $tablesDir) -ne "Tables") {
+ Write-Error "Таблица внешнего источника ожидается по пути ExternalDataSources/<Источник>/Tables/<Таблица>.xml, а не '$($objectXmlFull.Path)'"
+ exit 1
+ }
+ $objectQualifiedName = "$edsSource.$objectName"
+ $objectRef = "ExternalDataSource.$edsSource.Table.$objectName"
+ $tdtNode = $xmlDoc.SelectSingleNode("//md:Table/md:Properties/md:TableDataType", $nsMgr)
+ $tableDataType = if ($tdtNode) { $tdtNode.InnerText.Trim() } else { "ObjectData" }
+}
+
Write-Host "Object: $objectType.$objectName"
# --- Фаза 2: Валидация Purpose ---
@@ -457,8 +485,14 @@ if ($Purpose) {
}
}
if (-not $Purpose) {
- foreach ($p in $kindPurposes.Keys) {
- if ($kindPurposes[$p].Primary) { $Purpose = $p; break }
+ if ($objectType -eq "Table" -and $tableDataType -eq "NonobjectData") {
+ # Пометка Primary в таблице видов одна на вид, а у таблицы с составным ключом
+ # формы объекта не бывает — основной становится форма записи.
+ $Purpose = "Record"
+ } else {
+ foreach ($p in $kindPurposes.Keys) {
+ if ($kindPurposes[$p].Primary) { $Purpose = $p; break }
+ }
}
}
$purposeKey = $null
@@ -472,6 +506,20 @@ if (-not $purposeKey) {
$Purpose = $purposeKey
$purposeRule = $kindPurposes[$Purpose]
+# У таблицы внешнего источника набор назначений зависит от вида данных (замерено на
+# 8.3.24.1691): ObjectData — Object/List/Choice, NonobjectData — Record/List/Choice. Неверная пара
+# не отвергается схемой формы, а валит загрузку всей конфигурации «Исключением XDTO» без причины.
+if ($objectType -eq "Table") {
+ if ($tableDataType -eq "NonobjectData" -and $Purpose -eq "Object") {
+ Write-Error "Таблица '$objectName' с составным ключом (TableDataType=NonobjectData): формы объекта у неё нет — используйте -Purpose Record."
+ exit 1
+ }
+ if ($tableDataType -ne "NonobjectData" -and $Purpose -eq "Record") {
+ Write-Error "Таблица '$objectName' с ключом из одного поля (TableDataType=ObjectData): формы записи у неё нет — используйте -Purpose Object."
+ exit 1
+ }
+}
+
# Гард от повторения дефекта: запись таблицы обязана быть заполненной. Пустой MainAttr — это
# произвольная форма (законное состояние), а вот наполовину заполненная запись означала бы, что
# таблицу правили невнимательно, и в XML уйдёт мусор вроде `cfg:.Журнал`.
@@ -561,13 +609,13 @@ $formXmlPath = Join-Path $formExtDir "Form.xml"
# реквизита брался из отдельной карты, и отсутствие вида в ней давало `cfg:.Имя` — молча.
$attributesBlock = ""
if ($purposeRule.MainAttr) {
- $mainAttrType = $purposeRule.MainAttr -f $objectType, $objectName
+ $mainAttrType = $purposeRule.MainAttr -f $objectType, $objectName, $objectQualifiedName
$mainAttrName = $purposeRule.AttrName
# Динамический список несёт MainTable, остальные типы — SavedData по записи таблицы.
$tailLines = ""
if ($mainAttrType -eq "DynamicList") {
- $mainTable = "$objectType.$objectName"
+ $mainTable = $objectRef
$tailLines = "`n`t`t`t`n`t`t`t`t$mainTable`n`t`t`t"
} elseif ($purposeRule.SavedData) {
$tailLines = "`n`t`t`ttrue"
@@ -713,7 +761,7 @@ if ($insertBefore) {
$existingForms = $childObjects.SelectNodes("md:Form", $nsMgr)
$isFirstFormForPurpose = $false
$defaultPropName = $null
-$defaultValue = "$objectType.$objectName.Form.$FormName"
+$defaultValue = "$objectRef.Form.$FormName"
# Свойство «основная форма» — из записи таблицы. Раньше выбиралось по одному Purpose без учёта
# вида, и для журнала писалось DefaultListForm, которого у журнала нет: слот не находился, навык
diff --git a/.claude/skills/form-add/scripts/form-add.py b/.claude/skills/form-add/scripts/form-add.py
index bc06e70c9..74282882a 100644
--- a/.claude/skills/form-add/scripts/form-add.py
+++ b/.claude/skills/form-add/scripts/form-add.py
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
-# form-add v1.28 — Add managed form to 1C config object (Python port)
+# form-add v1.29 — Add managed form to 1C config object (Python port)
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse
@@ -559,6 +559,17 @@ def main():
"Load": {"main_attr": None, "attr_name": None, "slot": "DefaultLoadForm"},
"Custom": {"main_attr": None, "attr_name": None, "slot": None},
},
+ # Таблица внешнего источника — единственный вид, чьё имя в ссылках трёхчастное
+ # (Источник.Таблица): подставляется {2}, а не {1}.
+ "Table": {
+ "Object": {"main_attr": "ExternalDataSourceTableObject.{2}", "attr_name": "Объект",
+ "slot": "DefaultObjectForm", "saved_data": True, "primary": True},
+ "Record": {"main_attr": "ExternalDataSourceTableRecordManager.{2}", "attr_name": "Запись",
+ "slot": "DefaultRecordForm", "saved_data": True},
+ "List": {"main_attr": "DynamicList", "attr_name": "Список", "slot": "DefaultListForm"},
+ "Choice": {"main_attr": "DynamicList", "attr_name": "Список", "slot": "DefaultChoiceForm"},
+ "Custom": {"main_attr": None, "attr_name": None, "slot": None},
+ },
}
# Виды, у которых свойство DefaultForm есть, но собственных форм не бывает.
@@ -604,6 +615,26 @@ def main():
sys.exit(1)
object_name = name_node.text
+ # Ссылка на объект и имя для типов формы. У всех видов это "Вид.Имя", и только
+ # у таблицы внешнего источника — "ExternalDataSource.<Источник>.Table.<Таблица>", а в именах
+ # типов — "<Источник>.<Таблица>". Имя источника в самом файле таблицы не хранится —
+ # единственное место, где навык смотрит на путь: ExternalDataSources/<Источник>/Tables/<Таблица>.xml
+ object_qualified_name = object_name
+ object_ref = f"{object_type}.{object_name}"
+ table_data_type = "ObjectData"
+ if object_type == "Table":
+ tables_dir = os.path.dirname(object_xml_full)
+ eds_source = os.path.basename(os.path.dirname(tables_dir))
+ if not eds_source or os.path.basename(tables_dir) != "Tables":
+ print("Таблица внешнего источника ожидается по пути "
+ f"ExternalDataSources/<Источник>/Tables/<Таблица>.xml, а не '{object_xml_full}'", file=sys.stderr)
+ sys.exit(1)
+ object_qualified_name = f"{eds_source}.{object_name}"
+ object_ref = f"ExternalDataSource.{eds_source}.Table.{object_name}"
+ tdt_node = root.find(".//md:Table/md:Properties/md:TableDataType", NSMAP)
+ if tdt_node is not None and tdt_node.text:
+ table_data_type = tdt_node.text.strip()
+
print()
print("=== form-add ===")
print()
@@ -641,10 +672,15 @@ def main():
purpose = purpose_synonyms[purpose_probe]
if not purpose:
- for k, rule in kind_purposes.items():
- if rule.get("primary"):
- purpose = k
- break
+ if object_type == "Table" and table_data_type == "NonobjectData":
+ # Пометка primary в таблице видов одна на вид, а у таблицы с составным ключом
+ # формы объекта не бывает — основной становится форма записи.
+ purpose = "Record"
+ else:
+ for k, rule in kind_purposes.items():
+ if rule.get("primary"):
+ purpose = k
+ break
purpose_key = None
for k in kind_purposes:
if k.lower() == purpose.lower():
@@ -657,6 +693,19 @@ def main():
purpose = purpose_key
purpose_rule = kind_purposes[purpose]
+ # У таблицы внешнего источника набор назначений зависит от вида данных (замерено на
+ # 8.3.24.1691): ObjectData — Object/List/Choice, NonobjectData — Record/List/Choice. Неверная пара
+ # не отвергается схемой формы, а валит загрузку всей конфигурации «Исключением XDTO» без причины.
+ if object_type == "Table":
+ if table_data_type == "NonobjectData" and purpose == "Object":
+ print(f"Таблица '{object_name}' с составным ключом (TableDataType=NonobjectData): "
+ "формы объекта у неё нет — используйте -Purpose Record.", file=sys.stderr)
+ sys.exit(1)
+ if table_data_type != "NonobjectData" and purpose == "Record":
+ print(f"Таблица '{object_name}' с ключом из одного поля (TableDataType=ObjectData): "
+ "формы записи у неё нет — используйте -Purpose Object.", file=sys.stderr)
+ sys.exit(1)
+
# Гард от повторения дефекта: запись таблицы обязана быть заполненной. Пустой main_attr —
# это произвольная форма (законное состояние), а наполовину заполненная запись означала бы,
# что таблицу правили невнимательно, и в XML уйдёт мусор вроде `cfg:.Журнал`.
@@ -724,13 +773,13 @@ def main():
# реквизита брался из отдельной карты, и отсутствие вида в ней давало `cfg:.Имя` — молча.
attributes_block = ''
if purpose_rule.get("main_attr"):
- main_attr_type = purpose_rule["main_attr"].format(object_type, object_name)
+ main_attr_type = purpose_rule["main_attr"].format(object_type, object_name, object_qualified_name)
main_attr_name = purpose_rule["attr_name"]
# Динамический список несёт MainTable, остальные типы — SavedData по записи таблицы.
tail_lines = ''
if main_attr_type == "DynamicList":
- main_table = f"{object_type}.{object_name}"
+ main_table = object_ref
tail_lines = ('\t\t\t\n'
f'\t\t\t\t{main_table}\n'
'\t\t\t\n')
@@ -857,7 +906,7 @@ def main():
# --- SetDefault ---
is_first_form_for_purpose = False
- default_value = f"{object_type}.{object_name}.Form.{form_name}"
+ default_value = f"{object_ref}.Form.{form_name}"
# Свойство «основная форма» — из записи таблицы. Раньше выбиралось по одному purpose без
# учёта вида, и для журнала писалось DefaultListForm, которого у журнала нет: слот не
diff --git a/.claude/skills/form-validate/scripts/form-validate.ps1 b/.claude/skills/form-validate/scripts/form-validate.ps1
index 85a8940a7..dc2ae3b7a 100644
--- a/.claude/skills/form-validate/scripts/form-validate.ps1
+++ b/.claude/skills/form-validate/scripts/form-validate.ps1
@@ -1,4 +1,4 @@
-# form-validate v1.18 — Validate 1C managed form
+# form-validate v1.19 — Validate 1C managed form
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
[CmdletBinding(PositionalBinding=$false)]
param(
@@ -928,6 +928,8 @@ $validCfgPrefixes = @(
"ConstantsSet","DataProcessorObject","DocumentObject","DocumentRef"
"DynamicList","EnumRef","ExchangePlanObject","ExchangePlanRef"
"ExternalDataProcessorObject","ExternalReportObject"
+ "ExternalDataSourceTableObject","ExternalDataSourceTableRecordManager"
+ "ExternalDataSourceTableRef"
"InformationRegisterRecordManager","InformationRegisterRecordSet"
"ReportObject","TaskObject","TaskRef"
)
diff --git a/.claude/skills/form-validate/scripts/form-validate.py b/.claude/skills/form-validate/scripts/form-validate.py
index 1b0e36af8..d3d577f07 100644
--- a/.claude/skills/form-validate/scripts/form-validate.py
+++ b/.claude/skills/form-validate/scripts/form-validate.py
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
-# form-validate v1.18 — Validate 1C managed form
+# form-validate v1.19 — Validate 1C managed form
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse
@@ -66,6 +66,8 @@ VALID_CFG_PREFIXES = {
'ConstantsSet', 'DataProcessorObject', 'DocumentObject', 'DocumentRef',
'DynamicList', 'EnumRef', 'ExchangePlanObject', 'ExchangePlanRef',
'ExternalDataProcessorObject', 'ExternalReportObject',
+ 'ExternalDataSourceTableObject', 'ExternalDataSourceTableRecordManager',
+ 'ExternalDataSourceTableRef',
'InformationRegisterRecordManager', 'InformationRegisterRecordSet',
'ReportObject', 'TaskObject', 'TaskRef',
}
diff --git a/.claude/skills/meta-compile/reference/external-data-source.md b/.claude/skills/meta-compile/reference/external-data-source.md
index 73173c47b..513ffdc6e 100644
--- a/.claude/skills/meta-compile/reference/external-data-source.md
+++ b/.claude/skills/meta-compile/reference/external-data-source.md
@@ -143,4 +143,5 @@ uuid, а таблицы, которых нет в описании, остану
## Не поддерживается
- **Кубы OLAP** (`Cube`, `DimensionTable`, `Dimension`, `Resource`).
-- **Формы и модули** таблиц — формы добавляют `form-add` и `form-compile`.
+- **Формы и модули** таблиц — форму добавляет навык `form-add`, содержимое собирает `form-compile`.
+ Набор назначений зависит от `tableDataType`: `ObjectData` — Object/List/Choice, `NonobjectData` — Record/List/Choice.
diff --git a/docs/1c-form-spec.md b/docs/1c-form-spec.md
index 6c0943e34..387f6af6c 100644
--- a/docs/1c-form-spec.md
+++ b/docs/1c-form-spec.md
@@ -161,6 +161,7 @@ CommonForms регистрируются в `Configuration.xml`:
| BusinessProcess | DefaultObjectForm, DefaultListForm, DefaultChoiceForm |
| Task | DefaultObjectForm, DefaultListForm, DefaultChoiceForm |
| Constant | DefaultForm — но собственных форм у константы нет, свойство указывает на общую форму |
+| Table | DefaultObjectForm, DefaultRecordForm, DefaultListForm, DefaultChoiceForm |
| CommonForm | — (регистрируется в Configuration.xml, нет DefaultForm) |
> Report.DefaultForm может указывать на общую форму: `CommonForm.ФормаОтчета`.
@@ -171,13 +172,13 @@ CommonForms регистрируются в `Configuration.xml`:
| Назначение | Свойство объекта | Главный реквизит | Для каких типов |
|------------|------------------|------------------|-----------------|
-| Форма объекта | DefaultObjectForm | `{Тип}Object.{Имя}` | Catalog, Document, ChartOfAccounts, ChartOfCharacteristicTypes, ChartOfCalculationTypes, ExchangePlan, BusinessProcess, Task |
+| Форма объекта | DefaultObjectForm | `{Тип}Object.{Имя}` | Catalog, Document, ChartOfAccounts, ChartOfCharacteristicTypes, ChartOfCalculationTypes, ExchangePlan, BusinessProcess, Task, Table |
| Форма обработки/отчёта | DefaultForm | `{Тип}Object.{Имя}` | DataProcessor, Report, ExternalDataProcessor, ExternalReport |
| Форма группы | DefaultFolderForm | `{Тип}Object.{Имя}` | Catalog, ChartOfCharacteristicTypes |
| Форма списка | DefaultListForm (у DocumentJournal и FilterCriterion — DefaultForm) | `DynamicList` + `MainTable` | все типы со списком |
| Форма выбора | DefaultChoiceForm | `DynamicList` + `MainTable` | Catalog, Document, ChartOf*, ExchangePlan, BusinessProcess, Task, Enum |
| Форма выбора группы | DefaultFolderChoiceForm | `DynamicList` + `MainTable` | Catalog, ChartOfCharacteristicTypes |
-| Форма записи | DefaultRecordForm | `InformationRegisterRecordManager.{Имя}` | InformationRegister |
+| Форма записи | DefaultRecordForm | `InformationRegisterRecordManager.{Имя}` или `ExternalDataSourceTableRecordManager.{Источник}.{Имя}` | InformationRegister, Table |
| Форма набора записей | — (свойства нет) | `{Тип}RecordSet.{Имя}` | все регистры |
| Форма сохранения/загрузки настроек | DefaultSaveForm / DefaultLoadForm | нет | SettingsStorage |
| Произвольная форма | — (свойства нет) | нет | любой тип с собственными формами |
diff --git a/docs/meta-dsl-spec.md b/docs/meta-dsl-spec.md
index f065af902..871939ae7 100644
--- a/docs/meta-dsl-spec.md
+++ b/docs/meta-dsl-spec.md
@@ -2131,7 +2131,17 @@ ChildObjects и модулей.
- **Кубы OLAP** (`Cube`, `DimensionTable`, `Dimension`, `Resource`) не поддерживаются: проверить их
платформой нечем — SSAS в контейнер не ставится, а эмит вслепую по документации уже давал осечку.
- **Формы, макеты и модули** таблиц компилятор не создаёт — как и у прочих объектов (`form-add`,
- `form-compile`, `template-add`).
+ `form-compile`, `template-add`). У форм таблицы ссылки трёхчастные
+ (`ExternalDataSource.<И>.Table.<Т>.Form.<Ф>`, главный реквизит `ExternalDataSourceTableObject.<И>.<Т>`),
+ а набор назначений зависит от `tableDataType` — замерено на 8.3.24.1691:
+
+ | tableDataType | Допустимые назначения |
+ |---|---|
+ | `ObjectData` (ключ из одного поля) | Object, List, Choice, Custom |
+ | `NonobjectData` (составной ключ) | Record, List, Choice, Custom |
+
+ Неверная пара не отвергается схемой формы — она валит загрузку всей конфигурации
+ «Исключением XDTO при чтении файла», не называя причины, поэтому `form-add` проверяет её сам.
- **Таблица без ключевых полей** собирается: загрузку XML платформа принимает молча, хотя
Конфигуратор интерактивно ключ требует. `meta-validate` предупреждает, но не отвергает — рабочие
конфигурации без ключей существуют. Без ключа недоступны форма записи и набор записей.
diff --git a/tests/skills/cases/form-add/eds-table-forms.json b/tests/skills/cases/form-add/eds-table-forms.json
new file mode 100644
index 000000000..4e8096854
--- /dev/null
+++ b/tests/skills/cases/form-add/eds-table-forms.json
@@ -0,0 +1,51 @@
+{
+ "name": "Таблица внешнего источника: формы списка и объекта с трёхчастными ссылками",
+ "preRun": [
+ {
+ "script": "meta-compile/scripts/meta-compile",
+ "input": {
+ "type": "ExternalDataSource",
+ "name": "PG",
+ "tables": {
+ "products": {
+ "keyFields": ["id"],
+ "tableDataType": "ObjectData",
+ "fields": ["id: Number(10,0)", "name: String(150)"]
+ }
+ }
+ },
+ "args": { "-JsonPath": "{inputFile}", "-OutputDir": "{workDir}" }
+ },
+ {
+ "script": "form-add/scripts/form-add",
+ "args": {
+ "-ObjectPath": "{workDir}/ExternalDataSources/PG/Tables/products.xml",
+ "-FormName": "ФормаСписка",
+ "-Purpose": "List"
+ }
+ }
+ ],
+ "params": {
+ "objectPath": "ExternalDataSources/PG/Tables/products.xml",
+ "formName": "ФормаОбъекта"
+ },
+ "args_extra": ["-Purpose", "Object"],
+ "validatePath": "ExternalDataSources/PG/Tables/products/Forms/ФормаОбъекта",
+ "expect": {
+ "stdoutContains": ["DefaultObjectForm: ExternalDataSource.PG.Table.products.Form.ФормаОбъекта"],
+ "fileContains": [
+ {
+ "file": "ExternalDataSources/PG/Tables/products/Forms/ФормаОбъекта/Ext/Form.xml",
+ "text": "cfg:ExternalDataSourceTableObject.PG.products"
+ },
+ {
+ "file": "ExternalDataSources/PG/Tables/products/Forms/ФормаСписка/Ext/Form.xml",
+ "text": "ExternalDataSource.PG.Table.products"
+ },
+ {
+ "file": "ExternalDataSources/PG/Tables/products.xml",
+ "text": ["
", ""]
+ }
+ ]
+ }
+}
diff --git a/tests/skills/cases/form-add/eds-table-record-form-rejected.json b/tests/skills/cases/form-add/eds-table-record-form-rejected.json
new file mode 100644
index 000000000..898e53227
--- /dev/null
+++ b/tests/skills/cases/form-add/eds-table-record-form-rejected.json
@@ -0,0 +1,30 @@
+{
+ "name": "Форма записи у таблицы с ключом из одного поля — отказ с подсказкой",
+ "preRun": [
+ {
+ "script": "meta-compile/scripts/meta-compile",
+ "input": {
+ "type": "ExternalDataSource",
+ "name": "PG",
+ "tables": {
+ "products": {
+ "keyFields": ["id"],
+ "tableDataType": "ObjectData",
+ "fields": ["id: Number(10,0)"]
+ }
+ }
+ },
+ "args": { "-JsonPath": "{inputFile}", "-OutputDir": "{workDir}" }
+ }
+ ],
+ "params": {
+ "objectPath": "ExternalDataSources/PG/Tables/products.xml",
+ "formName": "ФормаЗаписи"
+ },
+ "args_extra": ["-Purpose", "Record"],
+ "expectError": true,
+ "expect": {
+ "stderrContains": ["формы записи у неё нет", "-Purpose Object"],
+ "filesAbsent": ["ExternalDataSources/PG/Tables/products/Forms/ФормаЗаписи.xml"]
+ }
+}
diff --git a/tests/skills/cases/form-add/snapshots/eds-table-forms/Configuration.xml b/tests/skills/cases/form-add/snapshots/eds-table-forms/Configuration.xml
new file mode 100644
index 000000000..da0e784ee
--- /dev/null
+++ b/tests/skills/cases/form-add/snapshots/eds-table-forms/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
+
+
+
+ Русский
+ PG
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/form-add/snapshots/eds-table-forms/Ext/ClientApplicationInterface.xml b/tests/skills/cases/form-add/snapshots/eds-table-forms/Ext/ClientApplicationInterface.xml
new file mode 100644
index 000000000..3c1161b2d
--- /dev/null
+++ b/tests/skills/cases/form-add/snapshots/eds-table-forms/Ext/ClientApplicationInterface.xml
@@ -0,0 +1,18 @@
+
+
+
+
+ UUID-002
+
+
+
+
+ UUID-004
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/form-add/snapshots/eds-table-forms/ExternalDataSources/PG.xml b/tests/skills/cases/form-add/snapshots/eds-table-forms/ExternalDataSources/PG.xml
new file mode 100644
index 000000000..a1b89619b
--- /dev/null
+++ b/tests/skills/cases/form-add/snapshots/eds-table-forms/ExternalDataSources/PG.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+ UUID-002
+ UUID-003
+
+
+ UUID-004
+ UUID-005
+
+
+ UUID-006
+ UUID-007
+
+
+
+ PG
+
+
+ ru
+ PG
+
+
+
+ Automatic
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/form-add/snapshots/eds-table-forms/ExternalDataSources/PG/Tables/products.xml b/tests/skills/cases/form-add/snapshots/eds-table-forms/ExternalDataSources/PG/Tables/products.xml
new file mode 100644
index 000000000..8209269f8
--- /dev/null
+++ b/tests/skills/cases/form-add/snapshots/eds-table-forms/ExternalDataSources/PG/Tables/products.xml
@@ -0,0 +1,173 @@
+
+
+
+
+
+ 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
+
+
+ UUID-016
+ UUID-017
+
+
+
+ products
+
+
+ ru
+ products
+
+
+
+ Table
+ products
+
+ ObjectData
+
+ ExternalDataSource.PG.Table.products.Field.id
+
+
+
+
+
+ true
+ false
+
+ Auto
+ Begin
+ Directly
+ Auto
+ ExternalDataSource.PG.Table.products.Form.ФормаОбъекта
+
+ ExternalDataSource.PG.Table.products.Form.ФормаСписка
+
+
+
+
+
+
+
+
+ false
+ false
+ Auto
+
+ InDialog
+
+
+ Automatic
+
+
+
+
+ id
+
+
+ ru
+ id
+
+
+
+
+ xs:decimal
+
+ 10
+ 0
+ Any
+
+
+ false
+
+
+
+ false
+
+ false
+ false
+
+
+ false
+ 0
+ DontCheck
+
+
+ Auto
+ Auto
+ Auto
+
+ id
+ false
+ false
+
+
+
+
+ name
+
+
+ ru
+ name
+
+
+
+
+ xs:string
+
+ 150
+ Variable
+
+
+ false
+
+
+
+ false
+
+ false
+ false
+
+
+ false
+
+ DontCheck
+
+
+ Auto
+ Auto
+ Auto
+
+ name
+ false
+ false
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/form-add/snapshots/eds-table-forms/ExternalDataSources/PG/Tables/products/Forms/ФормаОбъекта.xml b/tests/skills/cases/form-add/snapshots/eds-table-forms/ExternalDataSources/PG/Tables/products/Forms/ФормаОбъекта.xml
new file mode 100644
index 000000000..18b123182
--- /dev/null
+++ b/tests/skills/cases/form-add/snapshots/eds-table-forms/ExternalDataSources/PG/Tables/products/Forms/ФормаОбъекта.xml
@@ -0,0 +1,21 @@
+
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/form-add/snapshots/eds-table-forms/ExternalDataSources/PG/Tables/products/Forms/ФормаОбъекта/Ext/Form.xml b/tests/skills/cases/form-add/snapshots/eds-table-forms/ExternalDataSources/PG/Tables/products/Forms/ФормаОбъекта/Ext/Form.xml
new file mode 100644
index 000000000..d96ede5d0
--- /dev/null
+++ b/tests/skills/cases/form-add/snapshots/eds-table-forms/ExternalDataSources/PG/Tables/products/Forms/ФормаОбъекта/Ext/Form.xml
@@ -0,0 +1,16 @@
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/form-add/snapshots/eds-table-forms/ExternalDataSources/PG/Tables/products/Forms/ФормаОбъекта/Ext/Form/Module.bsl b/tests/skills/cases/form-add/snapshots/eds-table-forms/ExternalDataSources/PG/Tables/products/Forms/ФормаОбъекта/Ext/Form/Module.bsl
new file mode 100644
index 000000000..8ead4cec0
--- /dev/null
+++ b/tests/skills/cases/form-add/snapshots/eds-table-forms/ExternalDataSources/PG/Tables/products/Forms/ФормаОбъекта/Ext/Form/Module.bsl
@@ -0,0 +1,19 @@
+#Область ОбработчикиСобытийФормы
+
+#КонецОбласти
+
+#Область ОбработчикиСобытийЭлементовФормы
+
+#КонецОбласти
+
+#Область ОбработчикиКомандФормы
+
+#КонецОбласти
+
+#Область ОбработчикиОповещений
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+#КонецОбласти
\ No newline at end of file
diff --git a/tests/skills/cases/form-add/snapshots/eds-table-forms/ExternalDataSources/PG/Tables/products/Forms/ФормаСписка.xml b/tests/skills/cases/form-add/snapshots/eds-table-forms/ExternalDataSources/PG/Tables/products/Forms/ФормаСписка.xml
new file mode 100644
index 000000000..79ff6a75b
--- /dev/null
+++ b/tests/skills/cases/form-add/snapshots/eds-table-forms/ExternalDataSources/PG/Tables/products/Forms/ФормаСписка.xml
@@ -0,0 +1,21 @@
+
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/form-add/snapshots/eds-table-forms/ExternalDataSources/PG/Tables/products/Forms/ФормаСписка/Ext/Form.xml b/tests/skills/cases/form-add/snapshots/eds-table-forms/ExternalDataSources/PG/Tables/products/Forms/ФормаСписка/Ext/Form.xml
new file mode 100644
index 000000000..5d909ff61
--- /dev/null
+++ b/tests/skills/cases/form-add/snapshots/eds-table-forms/ExternalDataSources/PG/Tables/products/Forms/ФормаСписка/Ext/Form.xml
@@ -0,0 +1,18 @@
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/form-add/snapshots/eds-table-forms/ExternalDataSources/PG/Tables/products/Forms/ФормаСписка/Ext/Form/Module.bsl b/tests/skills/cases/form-add/snapshots/eds-table-forms/ExternalDataSources/PG/Tables/products/Forms/ФормаСписка/Ext/Form/Module.bsl
new file mode 100644
index 000000000..8ead4cec0
--- /dev/null
+++ b/tests/skills/cases/form-add/snapshots/eds-table-forms/ExternalDataSources/PG/Tables/products/Forms/ФормаСписка/Ext/Form/Module.bsl
@@ -0,0 +1,19 @@
+#Область ОбработчикиСобытийФормы
+
+#КонецОбласти
+
+#Область ОбработчикиСобытийЭлементовФормы
+
+#КонецОбласти
+
+#Область ОбработчикиКомандФормы
+
+#КонецОбласти
+
+#Область ОбработчикиОповещений
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+#КонецОбласти
\ No newline at end of file
diff --git a/tests/skills/cases/form-add/snapshots/eds-table-forms/Languages/Русский.xml b/tests/skills/cases/form-add/snapshots/eds-table-forms/Languages/Русский.xml
new file mode 100644
index 000000000..37c60d786
--- /dev/null
+++ b/tests/skills/cases/form-add/snapshots/eds-table-forms/Languages/Русский.xml
@@ -0,0 +1,16 @@
+
+
+
+
+ Русский
+
+
+ ru
+ Русский
+
+
+
+ ru
+
+
+
\ No newline at end of file