mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-09-02 08:20:49 +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,5 +1,5 @@
|
||||
#!/usr/bin/env python3
|
||||
# subsystem-compile v1.31 — Create 1C subsystem from JSON definition
|
||||
# subsystem-compile v1.32 — Create 1C subsystem from JSON definition
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
import argparse
|
||||
import json
|
||||
@@ -450,6 +450,26 @@ def write_child_subsystem_stub(child_path, child_name, format_version):
|
||||
write_utf8_bom(child_path, '\r\n'.join(lines))
|
||||
|
||||
|
||||
# Канонический порядок видов в <ChildObjects> — эталон в docs/1c-configuration-spec.md,
|
||||
# таблица «Порядок типов в ChildObjects». Нужен, чтобы новая группа вида вставала на своё
|
||||
# место: иначе платформа переставит её при первой же выгрузке и даст диф на ровном месте.
|
||||
# Реестр карт: tests/skills/check-type-maps.mjs.
|
||||
CHILD_OBJECT_TYPES = [
|
||||
'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',
|
||||
]
|
||||
|
||||
|
||||
def register_in_childobjects(parent_xml_path, parent_tag, child_tag, child_name):
|
||||
"""Регистрация объекта в <ChildObjects> родительского XML.
|
||||
|
||||
@@ -494,14 +514,32 @@ def register_in_childobjects(parent_xml_path, parent_tag, child_tag, child_name)
|
||||
replacement = '<ChildObjects>' + eol + f'\t\t\t{entry}' + eol + '\t\t</ChildObjects>'
|
||||
raw_text = raw_text[:empty.start()] + replacement + raw_text[empty.end():]
|
||||
else:
|
||||
# Отступ вставки берём у закрывающего тега +1 уровень: подстановка
|
||||
# по голому '</ChildObjects>' удваивала бы уже присутствующий отступ
|
||||
# строки (получалось 5 табов вместо 3 — PS-порт через DOM даёт 3).
|
||||
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():])
|
||||
# В корне подсистема встаёт перед первой группой вида старше по CHILD_OBJECT_TYPES:
|
||||
# так она попадает и в канонический порядок видов, и в конец своей группы, если та уже
|
||||
# есть. Дописать в конец блока нельзя вдвойне: платформа переставит новую группу при
|
||||
# первой же выгрузке, а существующую подсистема покинула бы, уехав за виды ниже.
|
||||
# Во вложенном Subsystem.xml порядок видов неприменим — потомок там всегда один.
|
||||
anchor = None
|
||||
if parent_tag == 'Configuration' and child_tag in CHILD_OBJECT_TYPES:
|
||||
own_idx = CHILD_OBJECT_TYPES.index(child_tag)
|
||||
type_rx = re.compile(r'(?m)^([ \t]*)<(\w+)>[^<]*</\2>')
|
||||
for m in type_rx.finditer(raw_text):
|
||||
other = m.group(2)
|
||||
if other in CHILD_OBJECT_TYPES and CHILD_OBJECT_TYPES.index(other) > own_idx:
|
||||
anchor = m
|
||||
break
|
||||
if anchor is not None:
|
||||
raw_text = (raw_text[:anchor.start()] + anchor.group(1) + entry + eol
|
||||
+ raw_text[anchor.start():])
|
||||
else:
|
||||
# Отступ вставки берём у закрывающего тега +1 уровень: подстановка
|
||||
# по голому '</ChildObjects>' удваивала бы уже присутствующий отступ
|
||||
# строки (получалось 5 табов вместо 3 — PS-порт через DOM даёт 3).
|
||||
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