cfe-borrow · git:20261022.4fdeafc · 2026-10-22 · sha256 cc8137073f9e3182

cfe-borrow git:20261022.4fdeafcA

Immutable. This exact content never changes and is served at /api/v1/blob/cc8137073f9e3182.

---
name: cfe-borrow
description: Заимствовать объект верхнего уровня, значение перечисления или управляемую форму объекта из конфигурации 1С в расширение и обновить ранее заимствованное, сохранив идентификаторы и локальные данные.
argument-hint: <extension:Configuration> <parent:Kind.Name[.EnumValue.Name|.Form.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` не запрашиваются как контролируемые свойства.
Неподдерживаемый профиль или повреждение приводят к отказу без записи;
обходить отказ прямым вызовом внутреннего адаптера нельзя.

Операция переносит дескриптор объекта верхнего уровня или отдельное значение
перечисления по адресу `parent:Enum.Operations.EnumValue.Costs`. Во втором
случае она заимствует владельца, если его ещё нет, и добавляет только выбранное
значение с собственным UUID и ссылкой на UUID исходного значения. Значение
находится внутри `Enums/Operations.xml`; отдельного файла значения нет.
Повтор сохраняет UUID значения, локальные соседние значения, `Synonym` и
`Comment`, а при отсутствии изменений не переписывает файл. Начальное значение
`Synonym` берётся у родителя; дальнейшие локальные изменения `Synonym` и
`Comment` принадлежат расширению. План и исполнение проверяют те же входы;
отсутствующее значение или собственное одноимённое значение расширения дают
отказ без записи. `overrides` для заимствования значения не поддерживаются,
в том числе пустой список.

Пример операции на корне расширения:

`{"op":"object.borrow","args":{"from":"parent:Enum.Operations.EnumValue.Costs"}}`

## Заимствование формы

Управляемую форму объекта заимствуй по её адресу у родителя, например
`parent:Catalog.Items.Form.ItemForm`. Сначала сделай план без записи:

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

`data.borrowing` описывает форму, а `effects` перечисляют все изменяемые
файлы. Если владельца `Catalog.Items` в расширении ещё нет, операция сначала
заимствует его, как при отдельном вызове, и регистрирует в корне; это видно
только в `effects`. Уже заимствованный владелец должен ссылаться на того же
родителя и быть зарегистрирован в корне расширения, его свойства не
обновляются. Форма получает описание с
`ObjectBelonging Adopted`, `ExtendedConfigurationObject` с UUID формы
родителя и `FormType Managed`, свой минимальный `Ext/Form.xml` и запись
`<Form>` в `ChildObjects` владельца. Исполни план по `executionToken`, как
выше.

Минимальный `Form.xml` равен базовой форме: собственная часть и `BaseForm`
содержат только пустую командную панель и пустые реквизиты, поэтому форма
родителя не меняется. События и команды родителя не копируются: платформа
превратила бы их в перехватчики расширения. Модуль формы не создаётся.
После заимствования `unica.view` читает форму как локальную, без
`content: "inherited"`, и `can` формы не скрывает операции записи
содержимого.

Повтор для уже заимствованной формы ничего не меняет. Описание формы без
`FormType Managed`, форма другого родителя или собственная форма расширения
с тем же именем дают отказ без записи. Форму, заимствованную
без своего `Form.xml`, эта операция не дополняет и отказывает без записи.
Обычная форма, форма, которой нет у владельца родителя, и `overrides` для
формы дают отказ без записи.

Перенос реквизитов и элементов родителя в заимствованную форму остаётся в
[задаче #937](https://github.com/IngvarConsulting/unica/issues/937).
Проверяй расширение через `unica.check` на `ext:Configuration` и через цикл
загрузки, проверки и выгрузки 1С перед поставкой.