mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-09-02 16:20:54 +03:00
feat(cf-edit): sort-childObjects без аргумента выравнивает и порядок групп видов
Настройка newObjectPosition не чинит накопленное, а собранная навыками конфигурация могла держать группы видов не в каноне — первая же выгрузка платформы давала диф. Теперь вызов без значения приводит в порядок и сами группы. Вызов с явным видом этого не делает: назвали вид — операция остаётся точечной и трогает только имена внутри него. Приём тот же, что уже работал для имён: переставляется содержимое существующих узлов, а не сами узлы, поэтому отступы и структура файла не меняются, а диф остаётся перестановкой строк. Отличие в том, что меняется и имя тега: в py это присваивание el.tag, в PS имя элемента неизменяемо, поэтому узел заменяется через ReplaceChild — он сохраняет окружающие пробельные узлы на месте (тот же приём, что в meta-edit.ps1). Проверки: порты дают байт-в-байт одинаковый файл; повторный прогон пишет Modified: 0 и не меняет ни байта; на боевой выгрузке УТ (13 979 строк) команда сообщает Modified: 0 — там уже канон, и Bot остался между DefinedType и CommonCommand. Раундтрип через платформу 8.3.24: отсортированная конфигурация вернулась побайтово той же, то есть наш канон совпадает с платформенным и сортировка не создаёт работы следующей выгрузке. Правило видов с осмысленным порядком продолжает действовать для ИМЁН: в раундтрипе языки остались как были. Положение самой группы оно не регулирует — это порядок платформы. Три прежних кейса фиксировали поведение «группы не трогаем» и переписаны по факту. 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
1bc943e846
commit
989b3490bc
@@ -51,6 +51,8 @@ Batch: `"Catalog.Товары ;; Document.Заказ ;; Enum.ВидыОплат"
|
||||
|
||||
Виды, где порядок несёт смысл, пропускаются, пока не названы явно: `CommonAttribute` (порядок разделителей задаёт порядок параметров сеанса), `Subsystem` и `CommandGroup` (порядок в панели), `Language` (порядок мультиязычных строк).
|
||||
|
||||
Вызов **без значения** дополнительно ставит сами группы видов в канонический порядок — тот, в котором их пишет платформа. Вызов с явным видом этого не делает: он трогает только имена внутри названного вида.
|
||||
|
||||
## add-defaultRole / remove-defaultRole / set-defaultRoles
|
||||
|
||||
Имя роли: `ПолныеПрава` или `Role.ПолныеПрава` (префикс `Role.` добавляется автоматически).
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# cf-edit v1.25 — Edit 1C configuration root (Configuration.xml)
|
||||
# cf-edit v1.26 — Edit 1C configuration root (Configuration.xml)
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
[CmdletBinding(PositionalBinding=$false)]
|
||||
param(
|
||||
@@ -595,6 +595,44 @@ function Do-SortChildObjects([string]$batchVal) {
|
||||
$script:modifyCount++
|
||||
Info "Sorted: $typeName ($($els.Count))"
|
||||
}
|
||||
|
||||
if ($requested.Count -gt 0) { return }
|
||||
|
||||
# Без аргумента приводим в порядок и сами группы видов: собранная навыками конфигурация
|
||||
# может держать их не в каноне, и первая же выгрузка платформы даст диф. Переставляем
|
||||
# содержимое существующих узлов, а не узлы, поэтому отступы и структура файла не меняются —
|
||||
# в дифе только перестановка строк. Имя тега у XmlElement неизменяемо, поэтому там, где вид
|
||||
# меняется, узел заменяется через ReplaceChild: он сохраняет окружающие пробельные узлы.
|
||||
$elems = @()
|
||||
foreach ($child in $script:childObjsEl.ChildNodes) {
|
||||
if ($child.NodeType -eq 'Element') { $elems += $child }
|
||||
}
|
||||
$tags = @(); $texts = @()
|
||||
foreach ($e in $elems) { $tags += $e.get_LocalName(); $texts += $e.InnerText }
|
||||
$rank = @()
|
||||
for ($i = 0; $i -lt $tags.Count; $i++) {
|
||||
$r = $script:typeOrder.IndexOf($tags[$i])
|
||||
if ($r -lt 0) { $r = $script:typeOrder.Count }
|
||||
$rank += $r
|
||||
}
|
||||
# Порядок стабильный: вторым ключом идёт исходная позиция
|
||||
$order = @(0..($tags.Count - 1) | Sort-Object @{e={$rank[$_]}}, @{e={$_}})
|
||||
$same = $true
|
||||
for ($i = 0; $i -lt $order.Count; $i++) { if ($order[$i] -ne $i) { $same = $false; break } }
|
||||
if ($same) { return }
|
||||
|
||||
for ($i = 0; $i -lt $elems.Count; $i++) {
|
||||
$srcIdx = $order[$i]
|
||||
if ($tags[$i] -ceq $tags[$srcIdx]) {
|
||||
$elems[$i].InnerText = $texts[$srcIdx]
|
||||
continue
|
||||
}
|
||||
$newEl = $script:xmlDoc.CreateElement($tags[$srcIdx], $script:mdNs)
|
||||
$newEl.InnerText = $texts[$srcIdx]
|
||||
[void]$script:childObjsEl.ReplaceChild($newEl, $elems[$i])
|
||||
}
|
||||
$script:modifyCount++
|
||||
Info "Reordered type groups: $($elems.Count) entries"
|
||||
}
|
||||
|
||||
# Стиль существующего файла для round-trip-сохранения: BOM / EOL / регистр encoding /
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env python3
|
||||
# cf-edit v1.25 — Edit 1C configuration root (Configuration.xml)
|
||||
# cf-edit v1.26 — Edit 1C configuration root (Configuration.xml)
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
|
||||
import argparse
|
||||
@@ -896,6 +896,27 @@ def main():
|
||||
modify_count += 1
|
||||
info(f"Sorted: {type_name} ({len(els)})")
|
||||
|
||||
if requested:
|
||||
# Вид назван явно — точечная операция: взаимный порядок групп не трогаем.
|
||||
return
|
||||
|
||||
# Без аргумента приводим в порядок и сами группы видов: собранная навыками
|
||||
# конфигурация может держать их не в каноне, и первая же выгрузка платформы даст
|
||||
# диф. Переставляем содержимое существующих узлов, а не узлы, поэтому отступы и
|
||||
# структура файла не меняются — в дифе только перестановка строк.
|
||||
elems = [c for c in child_objs_el if isinstance(c.tag, str)]
|
||||
pairs = [(localname(c), c.text or "") for c in elems]
|
||||
ranked = sorted(range(len(pairs)),
|
||||
key=lambda i: (TYPE_ORDER.index(pairs[i][0]) if pairs[i][0] in TYPE_ORDER else len(TYPE_ORDER), i))
|
||||
wanted = [pairs[i] for i in ranked]
|
||||
if wanted == pairs:
|
||||
return
|
||||
for el, (tag, text) in zip(elems, wanted):
|
||||
el.tag = f'{{{MD_NS}}}{tag}'
|
||||
el.text = text
|
||||
modify_count += 1
|
||||
info(f"Reordered type groups: {len(elems)} entries")
|
||||
|
||||
def do_remove_child_object(batch_val):
|
||||
nonlocal remove_count
|
||||
if child_objs_el is None:
|
||||
|
||||
Reference in New Issue
Block a user