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:
Nick Shirokov
2026-08-29 22:09:38 +03:00
co-authored by Claude Opus 5
parent 1bc943e846
commit 989b3490bc
42 changed files with 1428 additions and 24 deletions
@@ -1,5 +1,5 @@
{
"name": "sort-childObjects без значения: справочники и роли упорядочены, подсистемы не тронуты",
"name": "sort-childObjects без значения: имена внутри видов упорядочены, группы видов приведены к канону, подсистемы по имени не тронуты",
"setup": "fixture:unsorted-childobjects",
"input": [
{
@@ -9,11 +9,12 @@
"expect": {
"stdoutContains": [
"Sorted: Catalog (3)",
"Sorted: Role (2)"
"Sorted: Role (2)",
"Reordered type groups"
],
"fileContains": {
"file": "Configuration.xml",
"text": "<Catalog>Альфа</Catalog>\r\n\t\t\t<Catalog>Бета</Catalog>\r\n\t\t\t<Catalog>Гамма</Catalog>\r\n\t\t\t<Role>Каппа</Role>\r\n\t\t\t<Role>Омега</Role>\r\n\t\t\t<Subsystem>Яблоко</Subsystem>\r\n\t\t\t<Subsystem>Банан</Subsystem>"
"text": "<Language>Русский</Language>\r\n\t\t\t<Subsystem>Яблоко</Subsystem>\r\n\t\t\t<Subsystem>Банан</Subsystem>\r\n\t\t\t<Role>Каппа</Role>\r\n\t\t\t<Role>Омега</Role>\r\n\t\t\t<Catalog>Альфа</Catalog>\r\n\t\t\t<Catalog>Бета</Catalog>\r\n\t\t\t<Catalog>Гамма</Catalog>"
},
"preserves": {
"file": "Configuration.xml",