feat(meta-validate): базовая проверка нераспознанных валидных типов + прощающий ввод плоских объектов (Фаза 1.4, v1.9)

20 валидных типов метаданных без глубоких правил (Subsystem/Role/CommonForm/
CommonCommand/CommandGroup/CommonAttribute/CommonTemplate/CommonPicture/
SessionParameter/SettingsStorage/FilterCriterion/FunctionalOption/
FunctionalOptionsParameter/Language/Style/StyleItem/WSReference/XDTOPackage/
DocumentNumerator/Sequence) раньше падали как "Unrecognized" + exit 1 — ложная
ошибка на валидном объекте. Теперь для них базовая структурная проверка
(root/uuid + Name-идентификатор) с ранним выходом, без type-specific правил.
Имена типов взяты из LocalName реальных файлов корпуса. По-настоящему неизвестный
тип по-прежнему отвергается.

Побочно: прощающий ввод для плоских объектов (один .xml без папки —
SessionParameter, CommonAttribute, DefinedType, ...) — раньше не находились по
голому имени Dir/Name (fallback покрывал только папочные Dir/Name/Name.xml),
добавлено дописывание .xml.

Тесты (фикстуры не самописные): valid-sessionparameter-basic (meta-compile preRun) +
real-erp-sessionparameter (external, скип на Mac) + error-unknown-type (реальный
каталог корпуса с переименованным корневым тип-элементом). meta-validate 21/21 ps1+py.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-07-11 21:05:51 +03:00
co-authored by Claude Opus 4.8
parent b9ed48ccf2
commit 9b5908c3b2
6 changed files with 181 additions and 4 deletions
@@ -1,4 +1,4 @@
# meta-validate v1.8 — Validate 1C metadata object structure
# meta-validate v1.9 — Validate 1C metadata object structure
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
param(
[Parameter(Mandatory)]
@@ -65,6 +65,12 @@ if (Test-Path $ObjectPath -PathType Container) {
}
}
# File not found — прощающий ввод для плоских объектов (SessionParameter, CommonAttribute,
# DefinedType, WSReference, … — один .xml без папки): дописать .xml к голому имени
if (-not (Test-Path $ObjectPath) -and -not [System.IO.Path]::HasExtension($ObjectPath)) {
if (Test-Path "$ObjectPath.xml") { $ObjectPath = "$ObjectPath.xml" }
}
# File not found — check Dir/Name/Name.xml → Dir/Name.xml
if (-not (Test-Path $ObjectPath)) {
$fileName = [System.IO.Path]::GetFileNameWithoutExtension($ObjectPath)
@@ -162,6 +168,15 @@ $validTypes = @(
"HTTPService","WebService","DefinedType"
)
# Валидные типы метаданных без глубоких правил валидации — раньше падали как "Unrecognized"
# (ложная ошибка на валидном объекте). Для них выполняется базовая структурная проверка (root/uuid/Name).
$structuralOnlyTypes = @(
"Subsystem","Role","CommonForm","CommonCommand","CommandGroup","CommonAttribute",
"CommonTemplate","CommonPicture","SessionParameter","SettingsStorage","FilterCriterion",
"FunctionalOption","FunctionalOptionsParameter","Language","Style","StyleItem",
"WSReference","XDTOPackage","DocumentNumerator","Sequence"
)
# GeneratedType categories by type
$generatedTypeCategories = @{
"Catalog" = @("Object","Ref","Selection","List","Manager")
@@ -355,7 +370,7 @@ if ($childElements.Count -eq 0) {
$typeNode = $childElements[0]
$mdType = $typeNode.LocalName
if ($validTypes -notcontains $mdType) {
if (($validTypes -notcontains $mdType) -and ($structuralOnlyTypes -notcontains $mdType)) {
Report-Error "1. Unrecognized metadata type: $mdType"
& $finalize
exit 1
@@ -383,6 +398,20 @@ if ($check1Ok) {
Report-OK "1. Root structure: MetaDataObject/$mdType, version $version"
}
# --- Structural-only types: базовая проверка (Name), без type-specific правил ---
if ($structuralOnlyTypes -contains $mdType) {
if ($objName -eq "(unknown)") {
Report-Error "3. Properties: missing or empty Name"
} elseif ($objName -notmatch $identPattern) {
Report-Error "3. Properties: Name '$objName' is not a valid 1C identifier"
} else {
Report-OK "3. Properties: Name=`"$objName`" (базовая структурная проверка для $mdType)"
}
& $finalize
if ($script:errors -gt 0) { exit 1 }
exit 0
}
if ($script:stopped) { & $finalize; exit 1 }
# --- Check 2: InternalInfo ---