From 33633aaf0e88c1b663476b4ce06d55718fa3ca74 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Sun, 23 Aug 2026 12:45:36 +0300 Subject: [PATCH] =?UTF-8?q?feat(db-repo):=20=D0=BF=D0=BE=D0=B4=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D1=8F=D1=82=D1=8C=20=D1=87=D0=B0=D1=81=D1=82=D1=8C=20?= =?UTF-8?q?=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA=D1=82=D0=B0=20=D0=B2=D0=BB=D0=B0?= =?UTF-8?q?=D0=B4=D0=B5=D0=BB=D1=8C=D1=86=D0=B5=D0=BC=20=D0=B2=D0=BC=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D0=BE=20=D0=BE=D1=82=D0=BA=D0=B0=D0=B7=D0=B0=20?= =?UTF-8?q?=D0=BF=D0=BB=D0=B0=D1=82=D1=84=D0=BE=D1=80=D0=BC=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Модель может попросить захватить реквизит, табличную часть, измерение или ресурс. Платформа на это отвечает «Загруженный список объектов пуст» — без имени объекта и без причины, отладить такой ответ нечем. Навык распознаёт вложенные виды подчинённых и подменяет их объектом-владельцем, сообщая о подмене. Это не меняет смысл запроса: владелец — минимально возможная единица захвата для того, что просили, потому что своей сущности у части объекта нет. Отказ стоил бы лишнего круга без пользы. Заодно убран comma-return у двух функций: в связке с @() у вызывающего он даёт вложенный массив, из-за чего список объектов склеивался в один fullName. Co-Authored-By: Claude Opus 5 --- .claude/skills/db-repo/scripts/db-repo.ps1 | 45 ++++++++++++++++++++-- 1 file changed, 42 insertions(+), 3 deletions(-) diff --git a/.claude/skills/db-repo/scripts/db-repo.ps1 b/.claude/skills/db-repo/scripts/db-repo.ps1 index a54c0ec20..56780a8b4 100644 --- a/.claude/skills/db-repo/scripts/db-repo.ps1 +++ b/.claude/skills/db-repo/scripts/db-repo.ps1 @@ -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