cfe-borrow — Claude Code skill for 1C extensions
This skill adopts objects from a 1C configuration into a CFE extension. Use it to work with an existing form, add attributes, or intercept a method.
/plugin marketplace add Nikolay-Shirokov/cc-1c-skills
/plugin install 1c-skills@cc-1c-skillsWhat cfe-borrow does
The skill creates XML metadata for adopted objects and registers them in the extension. You can target an object, form, attribute, or table section; adopting a child object also adopts its parent. Pass multiple targets separated by ;;.
For forms, -BorrowMainAttribute Form keeps the data bindings for attributes already shown on the form. The All option adopts every object attribute and table section. You can then add an extension attribute with /meta-edit and place it on the form with /form-edit.
Create the extension with /cfe-init first, and make sure it has a valid Configuration.xml. Repeated runs preserve extension-owned attributes and module code. The platform rejects custom attributes in adopted table sections for some object types; for business processes and tasks, this restriction applies before platform version 8.3.25.
What it helps with
- adopt a configuration object into a CFE extension
- preserve form data bindings while adopting a form
- add an extension-owned attribute to a table section
- adopt several configuration objects in one call
Example prompts for the agent
- Adopt an existing object form and keep its attribute bindings with
-BorrowMainAttribute Form. - Adopt a document table section so I can add an extension-owned attribute to it.
- Adopt several configuration objects in one call, separated by
;;.
How to install cfe-borrow
1Plugin marketplace
/plugin marketplace add Nikolay-Shirokov/cc-1c-skills/plugin install 1c-skills@cc-1c-skillsThis installs the whole 1c-skills plugin with all its skills
2Skills CLI (Vercel)
npx skills add Nikolay-Shirokov/cc-1c-skills --skill cfe-borrow -a claude-code3Manually: put the files in place
~/.claude/skills/cfe-borrow/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/cfe-borrow/
1Skills CLI (Vercel)
npx skills add Nikolay-Shirokov/cc-1c-skills --skill cfe-borrow -a codex2Manually: put the files in place
.agents/skills/cfe-borrow/SKILL.mdFor all projects use ~/.agents/skills/
Manually: put the files in place
.cursor/skills/cfe-borrow/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install Nikolay-Shirokov/cc-1c-skills cfe-borrow2Manually: put the files in place
.github/skills/cfe-borrow/SKILL.mdPlatform CLI
gemini skills install https://github.com/Nikolay-Shirokov/cc-1c-skills --path .claude/skills/cfe-borrowManually: put the files in place
.devin/skills/cfe-borrow/SKILL.mdThe legacy .windsurf/skills/ path still works
Claude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about cfe-borrow
How do I install cfe-borrow in Claude Code?
Add the marketplace with /plugin marketplace add Nikolay-Shirokov/cc-1c-skills, then install the plugin with /plugin install 1c-skills@cc-1c-skills.
What does cfe-borrow do?
It adopts objects from a 1C configuration into a CFE extension and creates their XML metadata. It can also preserve a form’s existing attribute bindings.
What must be ready before I use cfe-borrow?
Create the extension with /cfe-init and ensure it contains a valid Configuration.xml. The skill also needs paths to the extension and source configuration.
Source text
SKILL.md · MIT
---
name: cfe-borrow
description: Заимствование объектов из конфигурации 1С в расширение (CFE). Используй когда нужно перехватить метод, изменить форму или добавить реквизит к существующему объекту конфигурации
argument-hint: -ExtensionPath <path> -ConfigPath <path> -Object "Catalog.Контрагенты.Form.ФормаЭлемента" -BorrowMainAttribute Form
allowed-tools:
- Bash
- Read
- Glob
---
# /cfe-borrow — Заимствование объектов из конфигурации
Заимствует объекты из основной конфигурации в расширение. Создаёт XML-файлы с `ObjectBelonging=Adopted` и `ExtendedConfigurationObject`, добавляет запись в ChildObjects расширения.
## Предусловие
Расширение должно быть создано (`/cfe-init`) и содержать валидный `Configuration.xml`.
### Авто-определение ConfigPath
Если пользователь не указал `-ConfigPath` — попробуй определить автоматически:
1. Прочитай `.v8-project.json` из корня проекта
2. Разреши целевую базу (по имени, ветке или `default` — алгоритм из `/db-list`)
3. Если у базы есть поле `configSrc` — используй как `-ConfigPath`
4. Если `configSrc` нет — спроси у пользователя
## Параметры
| Параметр | Описание |
|----------|----------|
| `ExtensionPath` | Путь к каталогу расширения (обязат.) |
| `ConfigPath` | Путь к конфигурации-источнику (обязат.) |
| `Object` | Что заимствовать (обязат.), batch через `;;` |
| `Module` | Создать пустые модули объекта: `ObjectModule`, `ManagerModule`, `RecordSetModule`, `ValueManagerModule` (через запятую) или `None`. У типов с единственным модулем (`CommonModule`, `HTTPService`, `WebService`) он создаётся и без параметра |
| `BorrowMainAttribute` | Заимствовать основной реквизит формы: `Form` — реквизиты, используемые на форме, `All` — все реквизиты объекта. Не указан — не заимствует. Требует форму в -Object |
## Формат -Object
- `Catalog.Контрагенты` — справочник
- `CommonModule.РаботаСФайлами` — общий модуль
- `Document.РеализацияТоваров` — документ
- `Enum.ВидыОплат` — перечисление
- `Catalog.Контрагенты.Form.ФормаЭлемента` — форма объекта (заимствование формы)
- `CommonForm.ВыборПериода` — общая форма, вместе с содержимым (как форма объекта). С `-BorrowMainAttribute` владелец берётся из типа основного реквизита: объект (`DataProcessorObject.X` и т.п.), основная таблица динамического списка или константы набора констант
- `Document.ЗаказКлиента.TabularSection.Товары`, `Document.ЗаказКлиента.Attribute.Комментарий`, `Document.ЗаказКлиента.TabularSection.Товары.Attribute.Цена`, `InformationRegister.Цены.Dimension.Номенклатура` — отдельный дочерний объект (реквизит, табличная часть, реквизит табличной части, измерение…), без формы. Виды: `Attribute`, `TabularSection`, `Dimension`, `Resource`, `AddressingAttribute`, `AccountingFlag`
- `Catalog.X ;; CommonModule.Y ;; Enum.Z` — несколько объектов
### Заимствование форм
Формат `Тип.Имя.Form.ИмяФормы` заимствует форму конкретного объекта. Если родительский объект ещё не заимствован — он будет заимствован автоматически.
Создаётся:
1. **Метаданные формы** — `Forms/ИмяФормы.xml` с `ObjectBelonging=Adopted`, `FormType=Managed`
2. **Form.xml** — `Forms/ИмяФормы/Ext/Form.xml` с копией исходной формы + `<BaseForm>` (начальное состояние)
3. **Module.bsl** — пустой файл `Forms/ИмяФормы/Ext/Form/Module.bsl`
4. **Регистрация** — `<Form>` в ChildObjects родительского объекта
### Заимствование основного реквизита формы (-BorrowMainAttribute)
**Когда нужно**: пользователь хочет добавить новый реквизит в существующий объект конфигурации и вывести его на заимствованную форму. Без `-BorrowMainAttribute` форма заимствуется "пустой" — только визуальные элементы, без привязки к данным объекта. С `-BorrowMainAttribute` форма сохраняет привязки к реквизитам объекта (DataPath), что позволяет затем добавить на неё новые элементы через `/form-edit`.
**Два режима**:
- `Form` — заимствует только те реквизиты объекта, которые уже выведены на форму. Оптимальный выбор для большинства случаев
- `All` — заимствует все реквизиты и табличные части объекта. Используй если планируешь выводить на форму реквизиты, которых на ней ещё нет
Объект, чьи реквизиты заимствуются, — тот, что в типе основного реквизита формы. Обычно это владелец формы; если другой (форма обработки с основным реквизитом `DocumentObject.X`), заимствуется он сам и его реквизиты.
**Типовой сценарий** (добавление реквизита + вывод на форму):
1. `/cfe-borrow` с `-BorrowMainAttribute` — заимствовать форму с реквизитами
2. `/meta-edit` — добавить новый реквизит в объект расширения
3. `/form-edit` — вывести реквизит на заимствованную форму
**Защита существующих данных**: уже заимствованный объект не перезаписывается — добавляется только недостающее. Повторный вызов безопасен: собственные реквизиты расширения, заимствованные дочерние объекты и код в модулях сохраняются.
### Заимствование реквизитов и табличных частей без формы
Формат `Тип.Имя.<Вид>.<Имя>` (и `Тип.Имя.TabularSection.<ТЧ>.Attribute.<Реквизит>`) заимствует один дочерний объект — реквизит, табличную часть, реквизит табличной части, измерение и т.п.:
- родительский объект заимствуется автоматически, для реквизита табличной части — и сама табличная часть
- табличная часть приходит без реквизитов. Форма, заимствованная позже с `-BorrowMainAttribute`, дозаимствует в неё недостающие реквизиты, собственные реквизиты сохраняются
- объект из ссылочного типа реквизита (`CatalogRef.Номенклатура`) заимствуется оболочкой — пустым, без реквизитов и форм
- вид не из списка или дочерний объект, которого нет в источнике, — ошибка, расширение не меняется
Коду модулей расширения реквизиты источника доступны и без заимствования — заимствуй их, только когда табличная часть нужна под собственные реквизиты или реквизит выводит своя форма расширения.
**Собственный реквизит табличной части** — когда форма не нужна (например, реквизит использует только код):
1. `/cfe-borrow -Object "Document.ЗаказКлиента.TabularSection.Товары"`
2. `/meta-edit` на `Documents/ЗаказКлиента.xml` расширения: `-Operation add-ts-attribute -Value "Товары.пд_Скидка: Number(15,2)"`
У плана видов характеристик, плана счетов и плана видов расчёта собственный реквизит в заимствованную табличную часть платформа не примет (отказ при обновлении конфигурации БД), у бизнес-процесса и задачи — только с платформы 8.3.25. Навык такую табличную часть заимствует, но выводит `[WARN]` — собственных реквизитов в неё не добавляй.
**Своя форма расширения** видит только заимствованные реквизиты объекта: путь `Объект.Склад` к незаимствованному реквизиту — «Неверный путь к данным». Заимствуй выводимые реквизиты по одному (`Document.ЗаказКлиента.Attribute.Склад ;; Document.ЗаказКлиента.TabularSection.Товары.Attribute.Цена`), саму форму создай через `/form-add` и `/form-compile`.
## Команда
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/cfe-borrow.ps1" -ExtensionPath src\cfe\extname -ConfigPath src\cf -Object "Catalog.Контрагенты"
```
## Примеры
```powershell
# Заимствовать один объект
... -ExtensionPath src\cfe\extname -ConfigPath src\cf -Object "Catalog.Контрагенты"
# Заимствовать справочник вместе с модулями объекта и менеджера
... -ExtensionPath src\cfe\extname -ConfigPath src\cf -Object "Catalog.Контрагенты" -Module ObjectModule,ManagerModule
# Общий модуль без файла модуля
... -ExtensionPath src\cfe\extname -ConfigPath src\cf -Object "CommonModule.РаботаСФайлами" -Module None
# Заимствовать форму (автоматически заимствует родительский объект)
... -ExtensionPath src\cfe\extname -ConfigPath src\cf -Object "Catalog.Контрагенты.Form.ФормаЭлемента"
# Несколько объектов за раз
... -ExtensionPath src\cfe\extname -ConfigPath src\cf -Object "Catalog.Контрагенты ;; CommonModule.ОбщийМодуль ;; Enum.ВидыОплат"
# Заимствовать форму с основным реквизитом (реквизиты по DataPath формы)
... -ExtensionPath src\cfe\extname -ConfigPath src\cf -Object "Catalog.Номенклатура.Form.ФормаЭлемента" -BorrowMainAttribute Form
# Заимствовать форму с ВСЕМИ реквизитами объекта
... -ExtensionPath src\cfe\extname -ConfigPath src\cf -Object "Catalog.Номенклатура.Form.ФормаЭлемента" -BorrowMainAttribute All
# Табличная часть без формы — под собственные реквизиты
... -ExtensionPath src\cfe\extname -ConfigPath src\cf -Object "Document.ЗаказКлиента.TabularSection.Товары"
# Реквизит документа и реквизит табличной части — для своей формы расширения
... -ExtensionPath src\cfe\extname -ConfigPath src\cf -Object "Document.ЗаказКлиента.Attribute.Склад ;; Document.ЗаказКлиента.TabularSection.Товары.Attribute.Цена"
```
## Верификация
```
/cfe-validate <ExtensionPath> -ConfigPath <ConfigPath>
```
Конфигурацию-источник передавай и валидатору: заимствованные формы он проверяет по ней.
© Nikolay Shirokov · MIT · Nikolay-Shirokov/cc-1c-skills