cfe-borrow · diff

git:20260922.2184cd2 to git:20260923.26bef6a

76 added, 89 removed. Audit A to A.

---
name: cfe-borrow
- description: Заимствование объектов из конфигурации 1С в расширение (CFE). Используй когда нужно перехватить метод, изменить форму или добавить реквизит к существующему объекту конфигурации
- argument-hint: -ExtensionPath <path> -ConfigPath <path> -Object "Catalog.Контрагенты.Form.ФормаЭлемента" -BorrowMainAttribute
+ description: Заимствовать объект верхнего уровня из конфигурации 1С в расширение или обновить ранее заимствованный объект, сохранив его идентификаторы и локальные перекрытия.
+ argument-hint: <extension:Configuration> <parent:Kind.Name>
allowed-tools:
- - Bash
- Read
- Glob
---
- # /cfe-borrow — Заимствование объектов из конфигурации
+ # Заимствование объекта в расширение
## MCP routing
- - **Канонической операции заимствования на поверхности нет.** Разбор трёх
- ролей (`own`, `borrowed`, корень расширения), проекция в `props` и форма
- будущей операции `object.borrow` держит отдельная
- [задача #935](https://github.com/IngvarConsulting/unica/issues/935).
- Согласованы проверенный адрес родителя и обязательность заимствования
- объектов верхнего уровня для v0.13. Повтор обновляет свойства из родителя,
- сохраняя локальные перекрытия и идентификаторы; реализация отслеживается
- в той же задаче. Заимствование форм отложено в
- [#937](https://github.com/IngvarConsulting/unica/issues/937) и v0.13 не блокирует.
- Остальной контракт уточняется; операция ещё не реализована.
- - Не зови внутренние адаптеры напрямую: они спрятаны за MCP `unica`.
- - Готовность проверяет `unica.check`, результат читает `unica.view` по адресу.
-
- Что делать сейчас: сформировать дескриптор заимствованного объекта по формату
- ниже (`ObjectBelonging>Adopted` плюс `ExtendedConfigurationObject` с UUID
- объекта родителя), зарегистрировать его в `ChildObjects` корня расширения,
- затем проверить `unica.check` и прочитать `unica.view`. Признак заимствования —
- именно `ExtendedConfigurationObject`: корень расширения тоже `Adopted`, и
- читать его как заимствованный объект — дефект.
-
- Если нужна операция — сообщи о пробеле контракта Unica MCP и сошлись на
- [задачу #935](https://github.com/IngvarConsulting/unica/issues/935).
-
- ## Примеры дескриптора
-
- Ниже — то, что должен нести записанный дескриптор заимствованного объекта в
- наборе расширения. UUID берётся из дескриптора того же объекта у родителя.
+ Используй `unica.apply` с операцией `object.borrow`. В `at` укажи корень
+ расширения, в `from` — проверенный адрес объекта родительской конфигурации.
+ Имена наборов возьми из `unica.view {}` и прочитай родителя через `unica.view`.
+ Родитель должен быть зарегистрирован в своей конфигурации и доступен для
+ чтения. Одинаковое имя объекта само по себе не доказывает связь.
- ### Заимствованный объект метаданных
+ Всегда сначала выполняй `dryRun: true`. Проверь `changed`, `effects` и
+ `data.borrowing`: там указаны родитель, адрес результата, создание или
+ обновление, изменяемые свойства и защищённые перекрытия. Применяй тот же
+ вызов с `dryRun: false` и `ifRev` из предпросмотра, когда пользователь
+ поручил внести эту правку. Ревизия охватывает расширение и выбранного
+ родителя; после `stale_revision` нужен новый предпросмотр.
- ```xml
- <MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" version="2.20">
- <Catalog uuid="<uuid объекта в расширении>">
- <InternalInfo/>
- <Properties>
- <ObjectBelonging>Adopted</ObjectBelonging>
- <Name>Контрагенты</Name>
- <Comment/>
- <ExtendedConfigurationObject><uuid объекта у родителя></ExtendedConfigurationObject>
- </Properties>
- <ChildObjects/>
- </Catalog>
- </MetaDataObject>
- ```
+ Первое заимствование создаёт собственные идентификаторы объекта расширения
+ и регистрирует его в корне. Явный повтор обновляет перенесённые свойства,
+ сохраняет идентификаторы, локальное содержимое вне переносимых свойств и
+ свойства с признаками перекрытия. Составное переносимое свойство, например
+ `DefinedType.Type`, обновляется целиком, если оно не защищено перекрытием. Если изменений нет, файлы не переписываются. Повтор не меняет
+ родителя и набор перекрытий; повреждённые идентификаторы требуют отдельного
+ восстановления.
- Имя обязано совпадать с именем у родителя, а сам объект — быть зарегистрирован
- в `ChildObjects` корня расширения.
+ `from` выбирает родителя для этого вызова. Постоянную привязку наборов и
+ автоматическую синхронизацию операция не создаёт. При нескольких копиях
+ родителя с теми же идентификаторами последующее чтение может сообщить
+ неоднозначность.
- ### Заимствованный объект с перекрытым свойством
+ ## Предпросмотр и чтение
- Перекрытия несёт `InternalInfo` списком, а не флагом. Префикс `xr` объявляется
- на корне дескриптора — фрагмент ниже без этого объявления не разбирается:
+ Пример использует наборы `parent` и `ext`; подставь имена своего проекта.
- ```xml
- <MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses"
- xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" version="2.20">
- <Catalog uuid="<uuid объекта в расширении>">
- <InternalInfo>
- <xr:PropertyState>
- <xr:Property>Synonym</xr:Property>
- <xr:State>Extended</xr:State>
- </xr:PropertyState>
- </InternalInfo>
- <Properties>
- <ObjectBelonging>Adopted</ObjectBelonging>
- <Name>Контрагенты</Name>
- <ExtendedConfigurationObject><uuid объекта у родителя></ExtendedConfigurationObject>
- </Properties>
- </Catalog>
- </MetaDataObject>
+ ```json
+ {
+ "jsonrpc": "2.0",
+ "method": "tools/call",
+ "params": {
+ "name": "unica.apply",
+ "arguments": {
+ "at": "ext:Configuration",
+ "ops": [
+ {"op": "object.borrow", "args": {"from": "parent:Catalog.Items"}}
+ ],
+ "dryRun": true
+ }
+ }
+ }
```
- Платформа объявляет на корне весь свой набор пространств имён; здесь показаны
- только те два, без которых пример не читается.
-
- Платформенной улики на эту форму у объекта метаданных пока нет: её снимает
- круговой путь из [задачи #935](https://github.com/IngvarConsulting/unica/issues/935).
- Пока улики нет, считай
- перекрытие непроверенным фактом и говори об этом в ответе.
-
- ### Заимствованная форма
-
- Дескриптор формы устроен так же: `Adopted` плюс `ExtendedConfigurationObject`
- формы родителя. Реквизиты и элементы формы заимствуются вместе с ней; выборочно
- перенести часть реквизитов поверхность не умеет — это тот же пробел контракта.
-
- ## Верификация
-
- Проверка расширения — `unica.check` на корне набора-расширения (`ext` — имя набора типа `EXTENSION` в `v8project.yaml`); валидатор `cfe` выбирается по виду набора, вердикт в `data.status`.
+ После применения прочитай результат:
```json
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
- "name": "unica.check",
- "arguments": {
- "at": "ext:Configuration"
- }
+ "name": "unica.view",
+ "arguments": {"at": "ext:Catalog.Items"}
}
}
```
+
+ `props.belonging` различает свой и заимствованный объект. У заимствованного
+ объекта `parentId` хранит идентификатор родителя; `extends` появляется только
+ после проверки полного адреса, по которому родитель читается.
+ `parentStatus` сообщает `resolved`, `not_found`, `ambiguous` или `unavailable`.
+ Недоступный родитель не скрывает сведения об исправном объекте расширения.
+ Корень расширения не является заимствованным объектом.
+
+ Список `overrides` показывает защищённые свойства. Если он не помещается
+ в компактный ответ, `overridesComplete: false` и `overridesCount` сообщают
+ неполноту и количество; отсутствие строки не означает отсутствие перекрытий.
+
+ ## Перекрытия и границы
+
+ При первом заимствовании необязательный `args.overrides` задаёт имена свойств,
+ которые нужно защитить от последующего обновления. Подтверждены выгрузкой
+ платформы `Catalog.DescriptionLength` (`Extended`) и `CommonModule.Server`
+ (`Notify`); например, `"overrides": ["DescriptionLength"]` для справочника.
+ Начальное значение берётся у родителя, дальнейшая правка локального значения
+ выполняется отдельно. Не копируй один XML-маркер на все свойства: платформа
+ удаляет неподходящие сочетания, в частности `Synonym/Extended`.
+
+ Повтор сохраняет существующие состояния `Extended`, `Notify` и `MultiState`.
+ Локальные `Comment` и `Synonym` не запрашиваются как контролируемые свойства.
+ Неподдерживаемый профиль или повреждение приводят к отказу без записи;
+ обходить отказ прямым вызовом внутреннего адаптера нельзя.
+
+ Операция переносит дескриптор объекта верхнего уровня. Формы, их реквизиты
+ и элементы остаются в [задаче #937](https://github.com/IngvarConsulting/unica/issues/937).
+ Проверяй расширение через `unica.check` на `ext:Configuration` и через цикл
+ загрузки, проверки и выгрузки 1С перед поставкой.