feat(db-repo): подменять часть объекта владельцем вместо отказа платформы

Модель может попросить захватить реквизит, табличную часть, измерение или
ресурс. Платформа на это отвечает «Загруженный список объектов пуст» — без
имени объекта и без причины, отладить такой ответ нечем.

Навык распознаёт вложенные виды подчинённых и подменяет их объектом-владельцем,
сообщая о подмене. Это не меняет смысл запроса: владелец — минимально возможная
единица захвата для того, что просили, потому что своей сущности у части объекта
нет. Отказ стоил бы лишнего круга без пользы.

Заодно убран comma-return у двух функций: в связке с @() у вызывающего он даёт
вложенный массив, из-за чего список объектов склеивался в один fullName.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-08-23 12:45:36 +03:00
co-authored by Claude Opus 5
parent 3e816d3e12
commit 33633aaf0e
+42 -3
View File
@@ -1,4 +1,4 @@
# db-repo v1.1 — 1C configuration repository operations
# db-repo v1.2 — 1C configuration repository operations
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
# NB: движок только 1cv8 — ibcmd работу с хранилищем не поддерживает (нет такого режима).
<#
@@ -554,7 +554,7 @@ function Get-RepositoryArgs {
$a += "/ConfigurationRepositoryF`"$($Repo.Path)`""
if ($Repo.User) { $a += "/ConfigurationRepositoryN`"$($Repo.User)`"" }
if ($Repo.Password) { $a += "/ConfigurationRepositoryP`"$($Repo.Password)`"" }
return ,$a
return $a
}
# --- Список объектов ---
@@ -587,6 +587,45 @@ function Get-RequestedObjects {
return @($list | Select-Object -Unique)
}
# Подчинённые сущности, которые НЕ являются объектами хранилища: в XML владельца они записаны
# вложенным определением, своего файла и UUID у них нет — захватывать нечего. Отдельными объектами
# регистрируются только те, кто записан ССЫЛКОЙ по имени: форма, макет, команда.
# Платформа на такой запрос отвечает «Загруженный список объектов пуст» — без имени и без причины.
$script:InlineChildKinds = @(
'Реквизит', 'Attribute',
'СтандартныйРеквизит', 'StandardAttribute',
'РеквизитАдресации', 'AddressingAttribute',
'ТабличнаяЧасть', 'TabularSection',
'Измерение', 'Dimension',
'Ресурс', 'Resource',
'Графа', 'Column',
'ЗначениеПеречисления', 'EnumValue',
'ПризнакУчета', 'ПризнакУчёта', 'AccountingFlag',
'ПризнакУчетаСубконто', 'ПризнакУчётаСубконто', 'ExtDimensionAccountingFlag'
)
function Resolve-LockableObjects {
# Заменяет части объекта на сам объект. Это не сужение и не расширение запроса: владелец —
# минимально возможная единица захвата для того, что просили.
param([string[]]$Names)
$out = New-Object System.Collections.Generic.List[string]
$notes = New-Object System.Collections.Generic.List[string]
foreach ($n in $Names) {
$segs = $n -split '\.'
$resolved = $n
if ($segs.Count -ge 3 -and $script:InlineChildKinds -contains $segs[2]) {
$resolved = "$($segs[0]).$($segs[1])"
$notes.Add("$n -> $resolved")
}
if (-not $out.Contains($resolved)) { $out.Add($resolved) }
}
if ($notes.Count -gt 0) {
Write-Host "[note] части объекта отдельно не захватываются — взят объект-владелец:" -ForegroundColor Yellow
foreach ($x in $notes) { Write-Host " $x" -ForegroundColor Yellow }
}
return $out.ToArray()
}
function New-ObjectsListXml {
# Пишет платформенный XML со списком объектов, возвращает путь к файлу.
param([string[]]$Names, [string]$Path)
@@ -932,7 +971,7 @@ if ($cmd -eq 'update' -and -not $repo.FromRegistry -and -not $RepositoryPath) {
}
$objectAware = @('lock', 'unlock', 'commit', 'update')
$requested = @(Get-RequestedObjects)
$requested = @(Resolve-LockableObjects (Get-RequestedObjects))
if ($requested.Count -gt 0 -and $objectAware -notcontains $cmd) {
Write-Host "Error: -Objects/-ObjectsFile does not apply to '$cmd'" -ForegroundColor Red
exit 1