mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-09-20 09:15:52 +03:00
feat(skills): новая группа вида встаёт в канонический порядок, а не в конец блока
Навыки-создатели дописывали первый объект нового вида перед </ChildObjects>. Собранная ими конфигурация выходила в неканоническом порядке видов, и первая же загрузка-выгрузка давала диф: на стенде подали Language -> Catalog -> Document -> CommandGroup -> CommonCommand, платформа вернула Language -> CommonCommand -> CommandGroup -> Catalog -> Document. При этом cf-edit add-childObject и cfe-borrow канонический порядок уже держали — очередная «одна работа, разные реализации». Логика перенесена из cf-edit в семью Register-InChildObjects и в вариант nested-parent: запись встаёт перед первой группой вида старше по CHILD_OBJECT_TYPES. Для этого список канонического порядка добавлен в meta-compile, role-compile, xdto-compile и subsystem-compile (оба порта) и заведён в check-type-maps — копий стало 9 вместо 5, зато все под гардом. У подсистем нашлось больше, чем планировалось: вставка шла в конец ВСЕГО блока, поэтому подсистема покидала и собственную группу, если ниже были другие виды. Одно правило закрывает оба случая. Во вложенном Subsystem.xml порядок видов неприменим — потомок там всегда один, поведение не изменилось. Сдвиг эталонов широкий, но проверяемый: 42 файла в 12 навыках, 53 добавленные строки против 53 удалённых с совпадающим мультимножеством — чистая перестановка, все изменённые строки вида <Тег>Имя</Тег>. Из 425 эталонов с ChildObjects неканоничными осталось 15: 11 фикстур сортировки (неканоничны по замыслу) и 4 статические фикстуры на сохранение EOL и разбор форм, которые мы намеренно не переупорядочиваем. Версии подняты в обоих портах и за эту правку, и за предыдущую (карты типов). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QoAJmoNbgWKobA7JGgN5S3
This commit is contained in:
co-authored by
Claude Opus 5
parent
bdd2ed63f9
commit
1bc943e846
@@ -1,4 +1,4 @@
|
||||
# role-compile v1.33 — Compile 1C role from JSON
|
||||
# role-compile v1.34 — Compile 1C role from JSON
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
[CmdletBinding(PositionalBinding=$false)]
|
||||
param(
|
||||
@@ -1262,6 +1262,25 @@ function Compare-MetadataNames([string]$a, [string]$b) {
|
||||
# Регистрация объекта в <ChildObjects> родительского XML. Общая реализация: эталон —
|
||||
# meta-compile, копии — role-compile, xdto-compile. Реестр семьи: tests/skills/check-inline-drift.mjs.
|
||||
# Возвращает исход: added | already | no-childobj | no-config.
|
||||
# Канонический порядок видов в <ChildObjects> — эталон в docs/1c-configuration-spec.md,
|
||||
# таблица «Порядок типов в ChildObjects». Нужен, чтобы новая группа вида вставала на своё
|
||||
# место: иначе платформа переставит её при первой же выгрузке и даст диф на ровном месте.
|
||||
# Реестр карт: tests/skills/check-type-maps.mjs.
|
||||
$childObjectTypes = @(
|
||||
"Language","Subsystem","StyleItem","Style",
|
||||
"CommonPicture","SessionParameter","Role","CommonTemplate",
|
||||
"FilterCriterion","CommonModule","CommonAttribute","ExchangePlan",
|
||||
"XDTOPackage","WebService","HTTPService","WSReference",
|
||||
"EventSubscription","ScheduledJob","SettingsStorage","FunctionalOption",
|
||||
"FunctionalOptionsParameter","DefinedType","Bot","PaletteColor","CommonCommand","CommandGroup",
|
||||
"Constant","CommonForm","Catalog","Document",
|
||||
"DocumentNumerator","Sequence","DocumentJournal","Enum",
|
||||
"Report","DataProcessor","InformationRegister","AccumulationRegister",
|
||||
"ChartOfCharacteristicTypes","ChartOfAccounts","AccountingRegister",
|
||||
"ChartOfCalculationTypes","CalculationRegister",
|
||||
"BusinessProcess","Task","IntegrationService"
|
||||
)
|
||||
|
||||
function Register-InChildObjects([string]$ParentXmlPath, [string]$ParentTag, [string]$ChildTag, [string]$ChildName) {
|
||||
if (-not (Test-Path $ParentXmlPath)) { return "no-config" }
|
||||
|
||||
@@ -1323,10 +1342,28 @@ function Register-InChildObjects([string]$ParentXmlPath, [string]$ParentTag, [st
|
||||
$insertAt = $lastSame + $closeSame.Length
|
||||
$newContent = $configContent.Substring(0, $insertAt) + "$eol`t`t`t$entry" + $configContent.Substring($insertAt)
|
||||
} else {
|
||||
# Объектов этого вида ещё нет: новая строка перед </ChildObjects>,
|
||||
# отступ закрывающего тега переиспользуется
|
||||
$closeAt = $configContent.LastIndexOf("</ChildObjects>", $blockEnd - 1, $block.Length, [System.StringComparison]::Ordinal)
|
||||
$newContent = $configContent.Substring(0, $closeAt) + "`t$entry$eol`t`t" + $configContent.Substring($closeAt)
|
||||
# Группы своего вида ещё нет: ставим её в канонический порядок видов — перед первой
|
||||
# группой вида старше по $childObjectTypes. Дописать в конец блока нельзя: платформа
|
||||
# переставит группу при первой же выгрузке и даст диф на ровном месте.
|
||||
$ownIdx = $childObjectTypes.IndexOf($ChildTag)
|
||||
$anchor = $null
|
||||
if ($ownIdx -ge 0) {
|
||||
$typeRx = [regex]"(?m)^([ \t]*)<(\w+)>[^<]*</\2>"
|
||||
$tm = $typeRx.Match($configContent, $block.Index, $block.Length)
|
||||
while ($tm.Success) {
|
||||
$otherIdx = $childObjectTypes.IndexOf($tm.Groups[2].Value)
|
||||
if ($otherIdx -gt $ownIdx) { $anchor = $tm; break }
|
||||
$tm = $tm.NextMatch()
|
||||
}
|
||||
}
|
||||
if ($anchor) {
|
||||
$newContent = $configContent.Substring(0, $anchor.Index) + $anchor.Groups[1].Value + $entry + $eol + $configContent.Substring($anchor.Index)
|
||||
} else {
|
||||
# Видов старше в файле нет — новая строка перед </ChildObjects>,
|
||||
# отступ закрывающего тега переиспользуется
|
||||
$closeAt = $configContent.LastIndexOf("</ChildObjects>", $blockEnd - 1, $block.Length, [System.StringComparison]::Ordinal)
|
||||
$newContent = $configContent.Substring(0, $closeAt) + "`t$entry$eol`t`t" + $configContent.Substring($closeAt)
|
||||
}
|
||||
}
|
||||
[System.IO.File]::WriteAllText($ParentXmlPath, $newContent, $enc)
|
||||
return "added"
|
||||
|
||||
Reference in New Issue
Block a user