mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-09-02 00:10:50 +03:00
feat(skills): порядок объектов метаданных в ChildObjects
Навыки-создатели дописывали новый объект в конец группы своего вида, а стандарт требует порядка по имени (АПК:1108). Замеры на 8 боевых выгрузках: 103 385 объектов лежат по алфавиту, нарушают его ровно дописки в хвост. Стенд подтвердил, что беспорядок вечен: платформа нормализует порядок ВИДОВ (возвращает канонический), но порядок имён внутри вида не трогает. Настройка newObjectPosition в .v8-project.json (end по умолчанию | byName) — решение проекта, а не вызова: читают её meta-compile, role-compile, xdto-compile, cfe-borrow и cf-edit add-childObject. Компаратор при этом константа, моделирующая дерево Конфигуратора: ключ «ранг+символ» без культурных таблиц, одинаковый в обоих портах на любой ОС. На корпусе он даёт 4 нарушения на 125 088 пар против 2866 у ordinal-сравнения, которым cf-edit и cfe-borrow сортировали до сих пор. Subsystem не упорядочивается автоматически нигде: пока подсистемы не перечислены в <SubsystemsOrder>, порядок дерева задаёт порядок разделов в панели, а платформа этот список сама не заводит. Настройка не чинит накопленное, поэтому cf-edit получил операцию sort-childObjects (вся конфигурация или названные виды). Она переставляет значения узлов, а не узлы, поэтому диф — чистая перестановка строк. Имя вида принимается в любом регистре, во множественном числе и по-русски; неизвестный вид — отказ со списком допустимых. Попутно: - PS-порты создателей переведены с DOM-сериализации на текстовую вставку: на выгрузке не в каноне Конфигуратора они переписывали заголовок без просьбы; - PS-сторона семьи detect_xml_style/finalize_xml_bytes закрыта в cf-edit и cfe-borrow — правка чужого файла наследует его BOM/EOL/заголовок; - xdto-compile присоединён к семье Register-InChildObjects вместо инлайн-копии; - закрыт ложный успех в py subsystem-compile: <ChildObjects /> с пробелом ET разбирает, а текстовые ветки не находили — файл писался без вставки; - cfe-borrow py не импортировал json, из-за чего резолвер молча возвращал end; - cf-edit add-childObject ставил объект в конец блока, за пределы своей группы, когда видов старше в файле не было. Проверки: 906/906 на PowerShell и 903/906 на Python, 10 гардов, верификация эталонов платформой без падений, раундтрип отсортированной конфигурации на 8.3.24 и 8.3.27, сортировка боевой выгрузки ACC (1,4 МБ) и расширения из корпуса. Задачу принёс PR #85; часть кода взята оттуда. Co-Authored-By: Sergei Pleshanov <72200277+Abacadabras@users.noreply.github.com> 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
Sergei Pleshanov
Claude Opus 5
parent
7409bacd47
commit
c7b0dce151
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env python3
|
||||
# subsystem-compile v1.30 — Create 1C subsystem from JSON definition
|
||||
# subsystem-compile v1.31 — Create 1C subsystem from JSON definition
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
import argparse
|
||||
import json
|
||||
@@ -489,16 +489,19 @@ def register_in_childobjects(parent_xml_path, parent_tag, child_tag, child_name)
|
||||
# Правку ведём по сырому тексту, а не сериализацией ET: она не сохраняет отступы
|
||||
# и теряет xmlns, объявленные только внутри значений атрибутов (#38).
|
||||
entry = f'<{child_tag}>{esc_xml_text(child_name)}</{child_tag}>'
|
||||
if '<ChildObjects/>' in raw_text:
|
||||
empty = re.search(r'<ChildObjects\s*/>', raw_text)
|
||||
if empty is not None:
|
||||
replacement = '<ChildObjects>' + eol + f'\t\t\t{entry}' + eol + '\t\t</ChildObjects>'
|
||||
raw_text = raw_text.replace('<ChildObjects/>', replacement, 1)
|
||||
elif '</ChildObjects>' in raw_text:
|
||||
raw_text = raw_text[:empty.start()] + replacement + raw_text[empty.end():]
|
||||
else:
|
||||
# Отступ вставки берём у закрывающего тега +1 уровень: подстановка
|
||||
# по голому '</ChildObjects>' удваивала бы уже присутствующий отступ
|
||||
# строки (получалось 5 табов вместо 3 — PS-порт через DOM даёт 3).
|
||||
raw_text = re.sub(r'([ \t]*)</ChildObjects>',
|
||||
lambda m: m.group(1) + '\t' + entry + eol + m.group(1) + '</ChildObjects>',
|
||||
raw_text, count=1)
|
||||
cm = re.search(r'([ \t]*)</ChildObjects>', raw_text)
|
||||
if cm is None:
|
||||
return 'no-childobj'
|
||||
raw_text = (raw_text[:cm.start()] + cm.group(1) + '\t' + entry + eol
|
||||
+ cm.group(1) + '</ChildObjects>' + raw_text[cm.end():])
|
||||
|
||||
write_utf8_bom(parent_xml_path, raw_text)
|
||||
return 'added'
|
||||
|
||||
Reference in New Issue
Block a user