---
name: cfe-borrow
description: Заимствовать объект верхнего уровня из конфигурации 1С в расширение или обновить ранее заимствованный объект, сохранив его идентификаторы и локальные перекрытия.
argument-hint: <extension:Configuration> <parent:Kind.Name>
allowed-tools:
  - Read
  - Glob
---

# Заимствование объекта в расширение

## MCP routing

Используй `unica.apply` с операцией `object.borrow`. В `at` укажи корень
расширения, в `from` — проверенный адрес объекта родительской конфигурации.
Имена наборов возьми из `unica.view {}` и прочитай родителя через `unica.view`.
Родитель должен быть зарегистрирован в своей конфигурации и доступен для
чтения. Одинаковое имя объекта само по себе не доказывает связь.

Сначала вызови `unica.apply` с `at` и `ops` для плана без записи. Проверь
`changed`, `effects` и `data.borrowing`: там указаны родитель, адрес результата, создание или
обновление, изменяемые свойства и защищённые перекрытия. Исполняй сохранённый
план вызовом только с `executionToken` из `data.executionToken`, когда
пользователь поручил внести эту правку. План сохраняет прочитанные входы
расширения и родителя, а также ожидаемые изменения. Если эти входы изменились
и получен `stale_revision`, нужен новый план; изменение файла вне входов плана
не мешает исполнению.

Первое заимствование создаёт собственные идентификаторы объекта расширения
и регистрирует его в корне. Явный повтор обновляет перенесённые свойства,
сохраняет идентификаторы, локальное содержимое вне переносимых свойств и
свойства с признаками перекрытия. Составное переносимое свойство, например
`DefinedType.Type`, обновляется целиком, если оно не защищено перекрытием. Если изменений нет, файлы не переписываются. Повтор не меняет
родителя и набор перекрытий; повреждённые идентификаторы требуют отдельного
восстановления.

`from` выбирает родителя для этого вызова. Постоянную привязку наборов и
автоматическую синхронизацию операция не создаёт. При нескольких копиях
родителя с теми же идентификаторами последующее чтение может сообщить
неоднозначность.

## Предпросмотр и чтение

Пример использует наборы `parent` и `ext`; подставь имена своего проекта.

```json
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "unica.apply",
    "arguments": {
      "at": "ext:Configuration",
      "ops": [
        {"op": "object.borrow", "args": {"from": "parent:Catalog.Items"}}
      ]
    }
  }
}
```

После применения прочитай результат:

```json
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "unica.view",
    "arguments": {"at": "ext:Catalog.Items"}
  }
}
```

`props.belonging` различает свой и заимствованный объект. У заимствованного
объекта `parentId` хранит идентификатор родителя; `extends` появляется только
после проверки полного адреса, по которому родитель читается.
`parentStatus` сообщает `resolved`, `not_found`, `ambiguous` или `unavailable`.
Недоступный родитель не скрывает сведения об исправном объекте расширения.
Корень расширения не является заимствованным объектом.

Список `overrides` показывает защищённые свойства. Если он не помещается
в компактный ответ, `overridesComplete: false` и `overridesCount` сообщают
неполноту и количество; отсутствие строки не означает отсутствие перекрытий.

Заимствованный общий модуль платформа может выгрузить без флагов свойств.
Тогда в `props.commonModule` они равны `null`, а `compile.contexts` методов —
`null`, если не записан хотя бы один флаг среды; фильтр `context` такой модуль
отвергает. Значения смотри у родителя по `props.extends`, когда он разрешён.

Заимствованные роль, форму, макет объекта и пакет XDTO платформа может
выгрузить без своего содержимого (`Rights.xml`, `Form.xml`, `Template.xml`,
`Package.bin`). Тогда узел отвечает `props.content: "inherited"` без ветвей
содержимого, вид макета — `null`, адрес внутри содержимого и модуль такой
формы — `not_found`, а `check` — `readable`. Запись прав, элементов, модуля
формы, тела макета и типов отказывает и ведёт к объекту расширения. Само
содержимое читай у родителя по `props.extends` объекта расширения.

## Перекрытия и границы

При первом заимствовании необязательный `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С перед поставкой.
