fix(partial-load): include metadata XML descriptor and full object tree#9
Conversation
При partial-load Designer выгрузки в Hierarchical-формате конфигуратор
определяет тип и имя объекта по XML-дескриптору (`<MetadataType>/<Name>.xml`),
который лежит на уровень выше каталога объекта. Старый код добавлял в
list-файл только сам BSL (плюс sibling `Module.xml` рядом с BSL, которого
в Designer-формате не существует), поэтому Designer трактовал строку
`CommonModules/<name>/Ext/Module.bsl` как property-путь Configuration и
падал с ошибкой «Свойство <name> не входит в состав объекта метаданных
Configuration».
Что сделано:
- Введён whitelist 43 типов метаданных верхнего уровня
(CommonModules, Documents, Catalogs, …).
- На каждое BSL-изменение находится корневой объект
`<MetadataType>/<ObjectName>` и в list добавляются:
* XML-дескриптор `<MetadataType>/<ObjectName>.xml`
* рекурсивно все файлы внутри каталога объекта
(включая формы, дополнительные модули, шаблоны).
- Старая EDT-ориентированная логика `sibling_xml`/`object_dir` удалена
вместе с синтетическими тестами на `Catalogs.Items/...` — partial-load
всегда работает в Hierarchical Designer-формате
(в EDT-режиме конвертация EDT→Designer выполняется выше, в
`plan_edt_export_step`).
- Обновлены unit-тесты: добавлены кейсы для CommonModule, Document
ObjectModule, Form Module, BSL вне whitelist + сохранены проверки
threshold/deleted/Configuration.xml/symlink-escape.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (1)
ОбзорВ этом PR переработана логика определения списков файлов для частичной загрузки путём введения белого списка типов метаданных Designer. Новая машинерия разрешения владения распознаёт изменённые файлы ИзмененияРазрешение владения метаданными и расширение частичной загрузки
Оценка объёма проверки кода🎯 4 (Комплексный) | ⏱️ ~45 минут Стихотворение
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Что нашли
На реальном проекте в формате 1С Designer Hierarchical (платформа 8.3.27.2074)
v8-runner buildстабильно падает при partial-load, если изменён только.bsl-модуль (типичная правка любого CommonModule, ObjectModule, ManagerModule, модуля формы):При этом в EDT-проектах проблема не воспроизводится, потому что в EDT-режиме конвертация EDT → Designer в
plan_edt_export_stepпересоздаёт сразу и XML, и BSL — оба попадают в список изменений и оба уходят в list-файл независимо. В чистом Designer-проекте разработчик правит только BSL, поэтому XML-дескриптор объекта должен подтянуть сам код partial-load.В чём причина
В Hierarchical Designer-формате XML-дескриптор объекта лежит на уровень выше каталога объекта:
Старый код в
src/change_detection/partial_load.rsискал XML по EDT-логике — рядом с BSL (sibling_xml), то есть вCommonModules/MyModule/Ext/Module.xml, которого в Designer-формате не существует. В list-файл попадал только сам BSL + каталог-родитель. Без XML-дескриптора Designer не может определить тип/имя объекта по пути BSL и интерпретирует строку как property Configuration → отсюда «не входит в состав объекта метаданных Configuration».Что в патче
CommonModules,Documents,Catalogs,Reports,Enums,AccumulationRegisters, …).locate_metadata_objectнаходится корневой объект<MetadataType>/<ObjectName>и в list-файл добавляются:<MetadataType>/<ObjectName>.xml,<MetadataType>/<ObjectName>/(формы, дополнительные модули, шаблоны).sibling_xml/object_dirвместе с синтетическими тестами наCatalogs.Items/...—partial_load.rsтеперь работает только с Hierarchical Designer-форматом. В EDT-режиме это безопасно:partial_load::decide()всегда получает пути из сгенерированной Designer-копии (workPath/designer/<source-set>/, см.source_sets.rs:45-54), реальный EDT-исходник сюда не доходит.Поведение IBCMD-бэкенда
config_import_partialвplatform/ibcmd.rsиспользует тот же набор путей, что и Designer (--base-dir <dir> --partial <files...>), поэтому фикс улучшает оба бэкенда одинаково.Тесты
/tmp/src/Catalogs.Items/...) заменён на тесты с реальными Hierarchical-путями.locate_metadata_object_for_common_module_designer_layoutlocate_metadata_object_for_document_object_modulelocate_metadata_object_for_form_module_walks_up_to_document(форма приводит к XML своего владельца — документа)locate_metadata_object_returns_none_when_no_metadata_type_in_pathdecide_partial_load_for_common_module_adds_xml_and_object_dir_recursivelydecide_partial_load_for_document_object_module_includes_all_object_filesdecide_partial_load_for_form_module_pulls_in_owning_documentdecide_bsl_outside_metadata_whitelist_adds_only_the_fileConfiguration.xml→ full, deletions → full, threshold exceeded → full, symlink escape → full, write_list_file / relative_paths.cargo test --bin v8-runner change_detection::partial_load— 16/16 зелёные.Проверка на реальном проекте
До патча (тот же BSL, тот же сервер):
После патча:
В list-файле для одного изменённого
CommonModules/<name>/Ext/Module.bslтеперь оказываются 2 записи: сам BSL +CommonModules/<name>.xml.🤖 Generated with Claude Code
Summary by CodeRabbit
Примечания к выпуску
Исправления ошибок
Оптимизация