Skip to content

fix(partial-load): include metadata XML descriptor and full object tree#9

Open
steel-code-agent wants to merge 1 commit into
alkoleft:masterfrom
SteelMorgan:agent/partial-load-designer-xml-20260513
Open

fix(partial-load): include metadata XML descriptor and full object tree#9
steel-code-agent wants to merge 1 commit into
alkoleft:masterfrom
SteelMorgan:agent/partial-load-designer-xml-20260513

Conversation

@steel-code-agent

@steel-code-agent steel-code-agent commented May 13, 2026

Copy link
Copy Markdown

Что нашли

На реальном проекте в формате 1С Designer Hierarchical (платформа 8.3.27.2074) v8-runner build стабильно падает при partial-load, если изменён только .bsl-модуль (типичная правка любого CommonModule, ObjectModule, ManagerModule, модуля формы):

Неверное свойство объекта метаданных. Свойство <имя> не входит в состав объекта метаданных Configuration.

При этом в EDT-проектах проблема не воспроизводится, потому что в EDT-режиме конвертация EDT → Designer в plan_edt_export_step пересоздаёт сразу и XML, и BSL — оба попадают в список изменений и оба уходят в list-файл независимо. В чистом Designer-проекте разработчик правит только BSL, поэтому XML-дескриптор объекта должен подтянуть сам код partial-load.

В чём причина

В Hierarchical Designer-формате XML-дескриптор объекта лежит на уровень выше каталога объекта:

CommonModules/MyModule.xml          <- дескриптор (тип + имя объекта)
CommonModules/MyModule/Ext/Module.bsl

Старый код в 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».

Что в патче

  • Введён whitelist 43 типов метаданных верхнего уровня (CommonModules, Documents, Catalogs, Reports, Enums, AccumulationRegisters, …).
  • На каждое BSL-изменение через locate_metadata_object находится корневой объект <MetadataType>/<ObjectName> и в list-файл добавляются:
    • XML-дескриптор <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...>), поэтому фикс улучшает оба бэкенда одинаково.

Тесты

  • Старый набор тестов на синтетический Plain-подобный layout (/tmp/src/Catalogs.Items/...) заменён на тесты с реальными Hierarchical-путями.
  • Новые кейсы:
    • locate_metadata_object_for_common_module_designer_layout
    • locate_metadata_object_for_document_object_module
    • locate_metadata_object_for_form_module_walks_up_to_document (форма приводит к XML своего владельца — документа)
    • locate_metadata_object_returns_none_when_no_metadata_type_in_path
    • decide_partial_load_for_common_module_adds_xml_and_object_dir_recursively
    • decide_partial_load_for_document_object_module_includes_all_object_files
    • decide_partial_load_for_form_module_pulls_in_owning_document
    • decide_bsl_outside_metadata_whitelist_adds_only_the_file
  • Сохранены регрессии: Configuration.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, тот же сервер):

build-00-configuration-load.log:
Неверное свойство объекта метаданных. Свойство биг_ОКХ_Сервер не входит в состав объекта метаданных Configuration.

После патча:

[Конфигуратор] Загрузка изменений в базу          → exit_code=0
[Конфигуратор] Применение изменений               → exit_code=0
✓ partial load of 2 files
Build completed successfully

В list-файле для одного изменённого CommonModules/<name>/Ext/Module.bsl теперь оказываются 2 записи: сам BSL + CommonModules/<name>.xml.

🤖 Generated with Claude Code

Summary by CodeRabbit

Примечания к выпуску

  • Исправления ошибок

    • Улучшена обработка изменений файлов при частичной загрузке проекта.
    • События удаления файлов и изменения конфигурации теперь правильно инициируют полную перезагрузку.
  • Оптимизация

    • Оптимизирована логика определения списков файлов для частичной загрузки при работе с метаданными.

Review Change Stack

При 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>
@coderabbitai

coderabbitai Bot commented May 13, 2026

Copy link
Copy Markdown

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 2b70d6d9-7513-42f7-8fb0-377bf1cf61b3

📥 Commits

Reviewing files that changed from the base of the PR and between 43674ee and 19ac7a5.

📒 Files selected for processing (1)
  • src/change_detection/partial_load.rs

Обзор

В этом PR переработана логика определения списков файлов для частичной загрузки путём введения белого списка типов метаданных Designer. Новая машинерия разрешения владения распознаёт изменённые файлы .bsl и рекурсивно включает файлы их директорий владения, при этом тесты переписаны для валидации этого поведения.

Изменения

Разрешение владения метаданными и расширение частичной загрузки

Слой / Файлы Описание
Основа: импорты и белый список типов метаданных
src/change_detection/partial_load.rs
Обновлены импорты std::path для включения Component; введён константный белый список METADATA_TYPES, содержащий известные имена директорий типов метаданных Designer для распознавания допустимых контейнеров владения.
Машинерия разрешения владения
src/change_detection/partial_load.rs
Добавлены новые вспомогательные функции MetadataOwner, locate_metadata_object (разбирает компоненты пути для поиска владельца и создания дескриптора XML), is_metadata_type и collect_object_directory (рекурсивное перечисление файлов). Обновлена документация.
Логика расширения BSL
src/change_detection/partial_load.rs
Переработана функция expand_files для разрешения владения изменённых файлов .bsl; для признанных файлов расширяет список, включая XML владельца и всё содержимое его директории; для файлов вне списка сохраняет только изменённый файл.
Тестовая валидация
src/change_detection/partial_load.rs
Переписан модуль тестов с использованием новой функции locate_metadata_object; обновлены ожидаемые наборы путей; все фиксчуры адаптированы к новому макету метаданных с проверкой рекурсивного включения и поведения вне белого списка.

Оценка объёма проверки кода

🎯 4 (Комплексный) | ⏱️ ~45 минут

Стихотворение

🐰 Белый список метаданных волшебный,
Разрешает владение, решенье безмятежный,
BSL файлы теперь находят дом,
С XML друзьями и директорий кругом,
Тесты переписаны, всё светло и ясно! ✨

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The pull request title accurately summarizes the main change: it describes the addition of metadata XML descriptor and full object tree inclusion in the partial-load logic for Designer format, which is the core fix in this changeset.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants