Files
cc-1c-skills/docs/1c-extension-spec.md
T
Nick Shirokov 3565e1c97f fix(cfe): 6 fixes from E2E test — Manager types, borrowed form structure, ConfigPath, guard checks
1. meta-compile + cfe-borrow: add Manager GeneratedType for Report/DataProcessor
2. cfe-borrow: rewrite Form.xml generation — extract only visual elements
   (AutoCommandBar + ChildItems), replace CommandName→0, strip Attributes/Events/Parameters
3. cfe-init: add -ConfigPath to auto-resolve Language UUID and CompatibilityMode
4. form-add: guard against overwriting existing Form.xml and Module.bsl
5. docs: update GeneratedType table for Report/DataProcessor
6. docs: rewrite section 5.4.2 with accurate borrowed form structure

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 16:39:27 +03:00

1174 lines
53 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Спецификация формата выгрузки расширений конфигурации 1С (CFE)
Формат: XML-выгрузка расширения конфигурации 1С:Предприятие 8.3 (Конфигуратор → Конфигурация → Расширения → Выгрузить расширение в файлы).
Версия формата: `2.17` (платформа 8.3.178.3.24).
> **Связанные спецификации:**
> - Корневая структура конфигурации — [1c-configuration-spec.md](1c-configuration-spec.md)
> - Объекты метаданных — [1c-config-objects-spec.md](1c-config-objects-spec.md)
> - Подсистемы — [1c-subsystem-spec.md](1c-subsystem-spec.md)
> - Управляемые формы — [1c-form-spec.md](1c-form-spec.md)
> - Роли — [1c-role-spec.md](1c-role-spec.md)
> - Сводный индекс — [1c-specs-index.md](1c-specs-index.md)
---
## 1. Общая структура выгрузки расширения
```
Configuration.xml # Корневой файл — свойства и состав расширения
ConfigDumpInfo.xml # Служебный файл — версии объектов
Languages/ # Языки (всегда заимствованные)
Roles/ # Роли (собственные)
Subsystems/ # Подсистемы (собственные или заимствованные)
CommonModules/ # Общие модули
CommonPictures/ # Общие картинки
CommonCommands/ # Общие команды
Catalogs/ # Справочники
Documents/ # Документы
Enums/ # Перечисления
... # Другие типы объектов
```
### Ключевые отличия от конфигурации
| Аспект | Конфигурация | Расширение |
|--------|-------------|------------|
| Корневой `Ext/` | Есть (модули, интерфейс, справка) | **Нет** |
| `ObjectBelonging` в Properties | Нет | `Adopted` (всегда) |
| `ConfigurationExtensionPurpose` | Нет | `Patch` / `Customization` / `AddOn` |
| `KeepMappingToExtendedConfigurationObjectsByIDs` | Нет | `true` / `false` |
| `NamePrefix` | Пустой или нет | Префикс для собственных объектов |
| `CompatibilityMode` | Да | Нет (используется `ConfigurationExtensionCompatibilityMode`) |
| Свойства режимов работы | Полный набор | Сокращённый набор |
| Объекты в ChildObjects | Только собственные | Собственные **и заимствованные** |
---
## 2. Configuration.xml — корневой файл расширения
### 2.1. Общая структура
```xml
<?xml version="1.0" encoding="UTF-8"?>
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses"
xmlns:v8="http://v8.1c.ru/8.1/data/core"
xmlns:xr="http://v8.1c.ru/8.3/xcf/readable"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:app="http://v8.1c.ru/8.2/managed-application/core"
... version="2.17">
<Configuration uuid="...">
<InternalInfo>...</InternalInfo>
<Properties>...</Properties>
<ChildObjects>...</ChildObjects>
</Configuration>
</MetaDataObject>
```
Пространства имён и корневой элемент идентичны конфигурации. Атрибут `version` соответствует версии формата выгрузки.
### 2.2. InternalInfo
Содержит 7 записей `xr:ContainedObject` — аналогично конфигурации. ClassId фиксированные, ObjectId уникальны для каждого расширения.
### 2.3. Properties — свойства расширения
Свойства идут в фиксированном порядке. Набор свойств **отличается** от конфигурации — часть свойств специфична для расширений, часть свойств конфигурации отсутствует.
#### Специфичные свойства расширения
| Свойство | Тип | Описание |
|----------|-----|----------|
| `ObjectBelonging` | enum | Всегда `Adopted` — расширение «принято» к основной конфигурации |
| `ConfigurationExtensionPurpose` | enum | Назначение расширения: `Patch` (исправление), `Customization` (адаптация), `AddOn` (дополнение) |
| `KeepMappingToExtendedConfigurationObjectsByIDs` | `xs:boolean` | Сохранять привязку к объектам по идентификаторам |
| `NamePrefix` | `xs:string` | Префикс имён собственных объектов (напр. `Расш1_`, `МоёРасш_`) |
| `ConfigurationExtensionCompatibilityMode` | enum | Режим совместимости расширения (`Version8_3_17`, `Version8_3_24`, ...) |
#### Общие свойства (совпадают с конфигурацией)
| Свойство | Тип | Описание |
|----------|-----|----------|
| `Name` | `xs:string` | Имя расширения (идентификатор) |
| `Synonym` | `LocalString` | Отображаемое имя |
| `Comment` | `xs:string` | Комментарий |
| `DefaultRunMode` | enum | Режим запуска (`ManagedApplication`) |
| `UsePurposes` | list | Назначения (`PlatformApplication`) |
| `ScriptVariant` | enum | Язык скриптов (`Russian` / `English`) |
| `DefaultRoles` | list | Роли по умолчанию |
| `Vendor` | `xs:string` | Поставщик |
| `Version` | `xs:string` | Версия расширения |
| `DefaultLanguage` | ref | Язык по умолчанию (`Language.Русский`) |
| `BriefInformation` | `LocalString` | Краткая информация |
| `DetailedInformation` | `LocalString` | Подробная информация |
| `Copyright` | `LocalString` | Авторские права |
| `VendorInformationAddress` | `LocalString` | Адрес поставщика |
| `ConfigurationInformationAddress` | `LocalString` | Адрес информации |
| `InterfaceCompatibilityMode` | enum | Совместимость интерфейса |
> **Примечание:** Свойства `DefaultRunMode`, `UsePurposes`, `DefaultRoles`, `DefaultLanguage`, `InterfaceCompatibilityMode` **опциональны** — могут отсутствовать в расширении (в отличие от конфигурации, где они обязательны).
#### Свойства конфигурации, отсутствующие в расширении
В расширениях **нет** следующих свойств:
- `CompatibilityMode` (заменено на `ConfigurationExtensionCompatibilityMode`)
- `DataLockControlMode`
- `ObjectAutonumerationMode`
- `ModalityUseMode`
- `SynchronousPlatformExtensionAndAddInCallUseMode`
- `DatabaseTablespacesUseMode`
- `MainClientApplicationWindowMode`
- `UpdateCatalogAddress`
- `IncludeHelpInContents`
- `UseManagedFormInOrdinaryApplication`
- `UseOrdinaryFormInManagedApplication`
- `Content`
- `StandaloneConfigurationRestrictionRoles`
### 2.4. Порядок свойств
```xml
<Properties>
<ObjectBelonging>Adopted</ObjectBelonging>
<Name>ИмяРасширения</Name>
<Synonym>...</Synonym>
<Comment/>
<ConfigurationExtensionPurpose>Patch</ConfigurationExtensionPurpose>
<KeepMappingToExtendedConfigurationObjectsByIDs>true</KeepMappingToExtendedConfigurationObjectsByIDs>
<NamePrefix>Расш1_</NamePrefix>
<ConfigurationExtensionCompatibilityMode>Version8_3_17</ConfigurationExtensionCompatibilityMode>
<DefaultRunMode>ManagedApplication</DefaultRunMode> <!-- опционально -->
<UsePurposes>...</UsePurposes> <!-- опционально -->
<ScriptVariant>Russian</ScriptVariant>
<DefaultRoles>...</DefaultRoles> <!-- опционально -->
<Vendor/>
<Version/>
<DefaultLanguage>Language.Русский</DefaultLanguage> <!-- опционально -->
<BriefInformation/>
<DetailedInformation/>
<Copyright/>
<VendorInformationAddress/>
<ConfigurationInformationAddress/>
<InterfaceCompatibilityMode>TaxiEnableVersion8_2</InterfaceCompatibilityMode> <!-- опционально -->
</Properties>
```
### 2.5. ChildObjects — состав расширения
Содержит как **собственные** объекты расширения, так и **заимствованные** из основной конфигурации. Порядок типов аналогичен конфигурации.
```xml
<ChildObjects>
<Language>Русский</Language> <!-- заимствованный -->
<Subsystem>Расш1_МояПодсистема</Subsystem> <!-- собственный -->
<CommonPicture>Расш1_МояКартинка</CommonPicture> <!-- собственный -->
<Role>Расш1_ОсновнаяРоль</Role> <!-- собственный -->
<CommonModule>Расш1_МодульСервер</CommonModule> <!-- собственный -->
<CommonModule>ОбщийМодульКонфигурации</CommonModule> <!-- заимствованный -->
<Catalog>Контрагенты</Catalog> <!-- заимствованный -->
<Catalog>Расш1_Проекты</Catalog> <!-- собственный -->
<Enum>Расш1_ВидыДокументов</Enum> <!-- собственный -->
<InformationRegister>Расш1_ДатыРабот</InformationRegister> <!-- собственный -->
</ChildObjects>
```
В `ChildObjects` не видно различие между собственными и заимствованными — оно определяется по содержимому XML-файла объекта (свойство `ObjectBelonging` и наличие `ExtendedConfigurationObject`).
**Правило именования:** собственные объекты расширения обычно имеют `NamePrefix` в начале имени (напр. `Расш1_Справочник1`, `Расш1_Проекты`), заимствованные — имя объекта из основной конфигурации без префикса (напр. `Контрагенты`, `Валюты`).
---
## 3. ConfigDumpInfo.xml
Формат идентичен конфигурации:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<ConfigDumpInfo xmlns="http://v8.1c.ru/8.3/xcf/dumpinfo"
xmlns:xen="http://v8.1c.ru/8.3/xcf/enums"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
format="Hierarchical" version="2.17">
<ConfigVersions>
<Metadata name="Configuration.ИмяРасширения" id="uuid" configVersion="sha1"/>
<Metadata name="Language.Русский" id="uuid" configVersion="sha1"/>
<Metadata name="Role.Расш1_ОсновнаяРоль" id="uuid" configVersion="sha1"/>
<!-- ... все объекты расширения ... -->
</ConfigVersions>
</ConfigDumpInfo>
```
Включает записи для **всех** объектов расширения (и собственных, и заимствованных). Атрибут `configVersion` — 40-символьный SHA1-хеш версии объекта.
---
## 4. Заимствованные и собственные объекты
Расширение может содержать два типа объектов:
### 4.1. Заимствованные объекты (Adopted)
Объекты, существующие в основной конфигурации, которые расширение модифицирует или дополняет.
**Признаки:**
- `<ObjectBelonging>Adopted</ObjectBelonging>` в Properties
- `<ExtendedConfigurationObject>uuid</ExtendedConfigurationObject>` — UUID объекта в основной конфигурации
- Минимальный набор свойств (только те, что изменяются)
```xml
<Catalog uuid="81de7e56-...">
<InternalInfo>
<xr:GeneratedType name="CatalogObject.Валюты" category="Object">...</xr:GeneratedType>
<!-- ... стандартные GeneratedType ... -->
</InternalInfo>
<Properties>
<ObjectBelonging>Adopted</ObjectBelonging>
<Name>Валюты</Name>
<Comment/>
<ExtendedConfigurationObject>7aadbb67-...</ExtendedConfigurationObject>
</Properties>
<ChildObjects>
<!-- заимствованные и собственные реквизиты, формы -->
</ChildObjects>
</Catalog>
```
Заимствованные объекты **не содержат** полного набора свойств — только `ObjectBelonging`, `Name`, `Comment`, `ExtendedConfigurationObject` и те свойства, которые расширение изменяет (напр. `CodeLength`, `DefaultListForm`).
### 4.2. Собственные объекты (Own)
Объекты, созданные непосредственно в расширении.
**Признаки:**
- **Нет** элемента `ObjectBelonging`
- **Нет** элемента `ExtendedConfigurationObject`
- Полный набор свойств (как в объектах конфигурации)
- Имя обычно начинается с `NamePrefix` расширения
```xml
<Catalog uuid="7dcd4d14-...">
<InternalInfo>
<xr:GeneratedType name="CatalogObject.Расш5_Справочник1" category="Object">...</xr:GeneratedType>
<!-- ... -->
</InternalInfo>
<Properties>
<Name>Расш5_Справочник1</Name>
<Synonym/>
<Comment/>
<Hierarchical>false</Hierarchical>
<CodeLength>9</CodeLength>
<!-- ... полный набор свойств как в конфигурации ... -->
</Properties>
<ChildObjects/>
</Catalog>
```
Формат полностью совпадает с форматом объектов конфигурации (см. [1c-config-objects-spec.md](1c-config-objects-spec.md)).
---
## 5. Заимствованные дочерние элементы
Дочерние элементы заимствованных объектов (реквизиты, табличные части, значения перечислений) также маркируются как заимствованные или собственные.
### 5.1. Заимствованные реквизиты
```xml
<Attribute uuid="259e5f94-...">
<InternalInfo/>
<Properties>
<ObjectBelonging>Adopted</ObjectBelonging>
<Name>ОсновнаяВалюта</Name>
<Comment/>
<ExtendedConfigurationObject>206abcd3-...</ExtendedConfigurationObject>
<Type>
<v8:Type>cfg:CatalogRef.Валюты</v8:Type>
</Type>
</Properties>
</Attribute>
```
Заимствованный реквизит содержит `ObjectBelonging: Adopted` и `ExtendedConfigurationObject`. Набор свойств минимальный (Name, Comment, ExtendedConfigurationObject, Type).
### 5.2. Собственные реквизиты в заимствованном объекте
```xml
<Attribute uuid="7fabdcb4-...">
<Properties>
<Name>Расш5_Реквизит1</Name>
<Synonym/>
<Comment/>
<Type>
<v8:Type>cfg:CatalogRef.Расш5_Справочник1</v8:Type>
</Type>
<PasswordMode>false</PasswordMode>
<!-- ... полный набор свойств ... -->
</Properties>
</Attribute>
```
Собственный реквизит **не имеет** `ObjectBelonging` и `ExtendedConfigurationObject`. Содержит полный набор свойств.
### 5.3. Заимствованные значения перечислений
```xml
<EnumValue uuid="9bc7380f-...">
<Properties>
<ObjectBelonging>Adopted</ObjectBelonging>
<Name>НаценкаНаКурсДругойВалюты</Name>
<ExtendedConfigurationObject>c9ab3890-...</ExtendedConfigurationObject>
<Synonym>...</Synonym>
<Comment/>
</Properties>
</EnumValue>
```
### 5.4. Формы в расширениях
В расширении существуют **два принципиально разных сценария** работы с формами:
| Сценарий | Описание | `<BaseForm>` | ID элементов | `callType` |
|----------|----------|:------------:|:------------:|:----------:|
| **Собственная форма** на заимствованном объекте | Новая форма, не существующая в базовой конфигурации | Нет | Обычные (1+) | Нет |
| **Заимствованная форма** | Расширение существующей формы базовой конфигурации | Есть | Базовые + 1000000+ | Есть |
> **Как отличить:** Если файл метаданных формы (`.xml`) содержит `<ObjectBelonging>Adopted</ObjectBelonging>` — это заимствованная форма. Собственные формы не имеют `ObjectBelonging`.
#### 5.4.1. Метаданные заимствованной формы
Файл `.xml` в каталоге `Forms/`:
```xml
<Form uuid="8fcebcc1-...">
<InternalInfo/>
<Properties>
<ObjectBelonging>Adopted</ObjectBelonging>
<Name>ФормаСписка</Name>
<Comment/>
<ExtendedConfigurationObject>5f91b00f-...</ExtendedConfigurationObject>
<FormType>Managed</FormType>
</Properties>
</Form>
```
Содержимое формы хранится в `Forms/ФормаСписка/Ext/Form.xml`, модуль формы — в `Forms/ФормаСписка/Ext/Form/Module.bsl`.
#### 5.4.2. Структура Form.xml заимствованной формы
Form.xml заимствованной формы — **двухчастный файл**: Part 1 (результирующая форма) и BaseForm (исходная форма). Обе части содержат **только визуальные элементы** — атрибуты, события, параметры и команды базовой конфигурации **НЕ включаются**.
```xml
<Form xmlns="http://v8.1c.ru/8.3/xcf/logform" ... version="2.17">
<!-- ═══ ЧАСТЬ 1: Результирующая форма (база + изменения расширения) ═══ -->
<AutoCommandBar name="ФормаКоманднаяПанель" id="-1">
<ChildItems>
<!-- Базовые кнопки: CommandName заменён на 0 -->
<Button name="ФормаОбработкаЗагрузитьИзФайла" id="51">
<CommandName>0</CommandName>
...
</Button>
<!-- Кнопки, добавленные расширением: CommandName указывает на команду -->
<Button name="ФормаНоваяКоманда" id="159">
<CommandName>Form.Command.НоваяКоманда</CommandName>
...
</Button>
</ChildItems>
</AutoCommandBar>
<ChildItems>
<!-- Все визуальные элементы: базовые + добавленные расширением -->
</ChildItems>
<Attributes/> <!-- пустой, ИЛИ только реквизиты расширения (id ≥ 1000000) -->
<!-- Events — только обработчики расширения с callType (если есть) -->
<Events>
<Event name="OnCreateAtServer" callType="After">Расш1_ПриСозданииПосле</Event>
</Events>
<!-- Commands — только команды расширения (id ≥ 1000000, если есть) -->
<Commands>
<Command name="НоваяКоманда" id="1000000">
<Action callType="Override">Расш1_НоваяКомандаВместо</Action>
</Command>
</Commands>
<!-- ═══ ЧАСТЬ 2: Исходная форма из базовой конфигурации ═══ -->
<BaseForm version="2.17">
<AutoCommandBar name="ФормаКоманднаяПанель" id="-1">
<ChildItems>
<!-- Только базовые кнопки, все CommandName = 0 -->
<Button name="ФормаОбработкаЗагрузитьИзФайла" id="51">
<CommandName>0</CommandName>
...
</Button>
</ChildItems>
</AutoCommandBar>
<ChildItems>
<!-- Только визуальные элементы базовой конфигурации -->
</ChildItems>
<Attributes/> <!-- всегда пустой -->
<!-- НЕТ Events, Commands, Parameters -->
</BaseForm>
</Form>
```
**Ключевые правила:**
1. **Часть 1** (до `<BaseForm>`) — **результирующая форма**. Содержит визуальные элементы (AutoCommandBar + ChildItems) из базовой конфигурации плюс элементы расширения. Атрибуты базовой конфигурации (DynamicList, QueryText и др.) **не включаются** — только реквизиты расширения (id ≥ 1000000) или пустой `<Attributes/>`. Events и Commands — только добавленные расширением (с `callType`).
2. **Часть 2** (`<BaseForm>`) — **визуальный снимок исходной формы**. Содержит только AutoCommandBar + ChildItems + пустой `<Attributes/>`. НЕ содержит Events, Commands, Parameters. Все `<CommandName>` в кнопках заменены на `0`. Платформа использует BaseForm для контроля совместимости при обновлении конфигурации.
3. **Правило `<CommandName>0</CommandName>`**: во всех кнопках базовой формы (как в Part 1, так и в BaseForm) значение `<CommandName>` заменяется на `0`. Ссылки на команды конфигурации не сохраняются. Только кнопки, добавленные расширением, сохраняют ссылку на команду (напр. `Form.Command.XXX`).
4. Элемент `<BaseForm>` всегда идёт **последним** в `<Form>` и имеет атрибут `version`.
#### 5.4.3. Нумерация ID элементов
| Диапазон | Принадлежность |
|----------|---------------|
| `-1` | Авто-командная панель (`AutoCommandBar`) — фиксированный ID |
| `1` `999999` | Элементы базовой формы (сохраняют оригинальные ID) |
| `1000000`+ | Реквизиты (`Attributes`) и команды (`Commands`), добавленные расширением |
> **Важно:** Визуальные элементы форм (элементы в `ChildItems`), добавленные расширением в тело базовой формы, могут использовать ID из обычного диапазона (продолжая нумерацию базовой формы). Диапазон 1000000+ гарантирован для `Attributes` и `Commands`.
#### 5.4.4. Атрибут callType — перехват событий и команд
В заимствованных формах события и действия команд используют атрибут `callType` для определения момента перехвата:
| Значение | Описание |
|----------|----------|
| `Before` | Обработчик расширения вызывается **до** оригинального обработчика |
| `After` | Обработчик расширения вызывается **после** оригинального обработчика |
| `Override` | Обработчик расширения **заменяет** оригинальный обработчик |
##### События формы (form-level)
```xml
<Events>
<Event name="OnCreateAtServer" callType="After">Расш1_ПриСозданииНаСервереПосле</Event>
<Event name="OnOpen" callType="Before">Расш1_ПриОткрытииПеред</Event>
<Event name="BeforeWriteAtServer" callType="After">Расш1_ПередЗаписьюНаСервереПосле</Event>
<Event name="NotificationProcessing" callType="After">Расш1_ОбработкаОповещенияПосле</Event>
</Events>
```
##### События элементов формы (element-level)
```xml
<InputField name="Банк" id="37">
<Events>
<Event name="OnChange" callType="Before">Расш1_БанкПриИзменении</Event>
<Event name="Clearing" callType="Before">Расш1_БанкОчистка</Event>
</Events>
...
</InputField>
<Table name="СписокСпецификаций" id="102">
<Events>
<Event name="Selection" callType="Before">Расш1_СписокВыборПеред</Event>
</Events>
...
</Table>
```
##### Действия команд (Command Action)
Команда может иметь **несколько элементов `<Action>`** с разными `callType`:
```xml
<!-- Перехват существующей команды базовой формы: до + после -->
<Command name="ПодборИзКлассификатора" id="1000002">
<Action callType="Before">Расш1_ПодборИзКлассификатораПеред</Action>
<Action callType="After">Расш1_ПодборИзКлассификатораПосле</Action>
</Command>
<!-- Полная замена обработчика команды -->
<Command name="НоваяКоманда" id="1000000">
<Action callType="Override">Расш1_НоваяКомандаВместо</Action>
</Command>
<!-- Один перехват (только после) -->
<Command name="ЗапросКорректировки" id="1000005">
<Action callType="After">Расш1_ЗапросКорректировкиПосле</Action>
</Command>
```
> **Отличие от обычной формы:** В обычной форме (конфигурации или собственной форме расширения) у `<Event>` и `<Action>` **нет** атрибута `callType` — обработчик вызывается напрямую.
#### 5.4.5. Собственная форма на заимствованном объекте
Расширение может добавить к заимствованному объекту **собственную форму**, не существующую в базовой конфигурации. Такая форма:
- **Не имеет** `ObjectBelonging` и `ExtendedConfigurationObject` в метаданных формы
- **Не содержит** `<BaseForm>` в Form.xml
- **Не использует** атрибут `callType`
- Использует обычную нумерацию ID (1+)
- Формат полностью совпадает с форматом форм конфигурации (см. [1c-form-spec.md](1c-form-spec.md))
```xml
<!-- Метаданные: Forms/МояФорма.xml — без ObjectBelonging -->
<Form uuid="...">
<Properties>
<Name>Расш1_МояФорма</Name>
<Synonym>...</Synonym>
<Comment/>
<FormType>Managed</FormType>
<UsePurposes>...</UsePurposes>
</Properties>
</Form>
```
```xml
<!-- Содержимое: Forms/МояФорма/Ext/Form.xml — обычная форма без BaseForm -->
<Form ... version="2.17">
<Events>
<Event name="OnCreateAtServer">ПриСозданииНаСервере</Event>
</Events>
<ChildItems>...</ChildItems>
<Attributes>...</Attributes>
</Form>
```
#### 5.4.6. Модуль заимствованной формы
Модуль формы (`Forms/Имя/Ext/Form/Module.bsl`) в заимствованной форме использует те же декораторы перехвата, что и другие модули расширений (см. раздел 7.2):
```bsl
&НаСервере
&Вместо("ЗаполнитьПодменюПараметры")
Процедура Расш1_ЗаполнитьПодменюПараметры()
ПродолжитьВызов();
КонецПроцедуры
&НаКлиенте
&ИзменениеИКонтроль("ПараметрыНаЯзыке")
Функция Расш1_ПараметрыНаЯзыке(КодЯзыка)
// ... тело с #Вставка / #Удаление маркерами ...
КонецФункции
// Обработчик собственной команды расширения (без декоратора)
&НаКлиенте
Процедура Расш1_НоваяКомандаВместо(Команда)
// ...
КонецПроцедуры
```
> **Обработчики событий с `callType`** (определённые в Form.xml секции Events/Action) реализуются в модуле как обычные процедуры **без** аннотаций-декораторов — привязка к событию уже задана в XML через `callType`.
---
## 6. Расширение свойств (xr:PropertyState и xr:ExtendedProperty)
Расширения могут изменять свойства заимствованных реквизитов. Для этого используются специальные XML-конструкции.
### 6.1. PropertyState — уведомление об изменении
Элемент `xr:PropertyState` в `InternalInfo` реквизита указывает, что свойство было изменено расширением.
```xml
<Attribute uuid="a1752169-...">
<InternalInfo>
<xr:PropertyState>
<xr:Property>Type</xr:Property>
<xr:State>Notify</xr:State>
</xr:PropertyState>
</InternalInfo>
<Properties>
<ObjectBelonging>Adopted</ObjectBelonging>
<Name>Наценка</Name>
<ExtendedConfigurationObject>87429f11-...</ExtendedConfigurationObject>
<Type>
<v8:Type>xs:decimal</v8:Type>
<v8:NumberQualifiers>
<v8:Digits>10</v8:Digits>
<v8:FractionDigits>2</v8:FractionDigits>
<v8:AllowedSign>Any</v8:AllowedSign>
</v8:NumberQualifiers>
</Type>
</Properties>
</Attribute>
```
Значения `xr:State`:
| Значение | Описание |
|----------|----------|
| `Notify` | Свойство изменено расширением, платформа выводит предупреждение |
| `MultiState` | Свойство расширено (тип отличается от основной конфигурации) |
### 6.2. ExtendedProperty — расширение типа
Когда расширение изменяет тип реквизита, используется конструкция `xr:ExtendedProperty`:
```xml
<Type xsi:type="xr:ExtendedProperty">
<xr:ExtendValue xsi:type="v8:TypeDescription">
<v8:Type>xs:string</v8:Type>
<v8:StringQualifiers>
<v8:Length>60</v8:Length>
<v8:AllowedLength>Variable</v8:AllowedLength>
</v8:StringQualifiers>
</xr:ExtendValue>
</Type>
```
Свойство `Type` получает атрибут `xsi:type="xr:ExtendedProperty"`, а значение оборачивается в `xr:ExtendValue`. При этом в `InternalInfo` указывается `<xr:State>MultiState</xr:State>`.
---
## 7. Модули в расширениях
### 7.1. Типы модулей
Расширения поддерживают те же типы модулей, что и конфигурация:
| Модуль | Файл | Для каких объектов |
|--------|------|--------------------|
| Модуль объекта | `Ext/ObjectModule.bsl` | Справочники, документы, обработки |
| Модуль менеджера | `Ext/ManagerModule.bsl` | Справочники, документы, регистры |
| Модуль набора записей | `Ext/RecordSetModule.bsl` | Регистры |
| Модуль формы | `Forms/Имя/Ext/Form/Module.bsl` | Формы |
| Общий модуль | `CommonModules/Имя/Ext/Module.bsl` | Общие модули |
| Модуль команды | `Commands/Имя/Ext/CommandModule.bsl` | Команды |
### 7.2. Декораторы перехвата
Модули расширений используют специальные **аннотации-декораторы** для перехвата вызовов процедур основной конфигурации:
| Декоратор | Описание |
|-----------|----------|
| `&Перед("ИмяПроцедуры")` | Выполняется **до** оригинальной процедуры |
| `&После("ИмяПроцедуры")` | Выполняется **после** оригинальной процедуры |
| `&Вместо("ИмяПроцедуры")` | **Заменяет** оригинальную процедуру |
| `&ИзменениеИКонтроль("ИмяПроцедуры")` | Копия с контролем изменений (diff-маркеры) |
#### Пример &Перед / &После
```bsl
&НаКлиенте
&Перед("ПодборИзКлассификатора")
Процедура Расш5_ПодборИзКлассификатораПеред(Команда)
// Код выполняется ДО оригинальной процедуры
КонецПроцедуры
&НаКлиенте
&После("ПодборИзКлассификатора")
Процедура Расш5_ПодборИзКлассификатораПосле(Команда)
// Код выполняется ПОСЛЕ оригинальной процедуры
КонецПроцедуры
```
#### Пример &Вместо
```bsl
&НаСервере
&Вместо("ЗаполнитьПодменюПараметрыПрописиВалюты")
Процедура Расш5_ЗаполнитьПодменюПараметрыПрописиВалюты()
// Полная замена оригинальной процедуры
// ПродолжитьВызов() — вызов оригинальной реализации
ПродолжитьВызов();
КонецПроцедуры
```
#### Пример &ИзменениеИКонтроль
```bsl
&ИзменениеИКонтроль("РеквизитыРедактируемыеВГрупповойОбработке")
Функция Расш5_РеквизитыРедактируемыеВГрупповойОбработке()
Результат = Новый Массив;
Результат.Добавить("СпособУстановкиКурса");
#Удаление
Результат.Добавить("ФормулаРасчетаКурса");
#КонецУдаления
#Вставка
Результат.Добавить("НоваяФормулаРасчетаКурса");
#КонецВставки
Возврат Результат;
КонецФункции
```
### 7.3. Diff-маркеры в коде
Внутри процедур с декоратором `&ИзменениеИКонтроль` используются diff-маркеры для отслеживания изменений:
| Маркер | Описание |
|--------|----------|
| `#Удаление` | Начало блока удалённого кода |
| `#КонецУдаления` | Конец блока удалённого кода |
| `#Вставка` | Начало блока вставленного кода |
| `#КонецВставки` | Конец блока вставленного кода |
Маркеры могут быть вложенными и чередующимися — типичный паттерн «удалить → вставить»:
```bsl
#Удаление
ИначеЕсли Выборка.Дата > Дата Тогда
#КонецУдаления
#Вставка
ИначеЕсли Выборка.Дата < Дата Тогда
#КонецВставки
```
### 7.4. Именование процедур расширения
Собственные процедуры расширения именуются с `NamePrefix`:
- `Расш5_ПрочитатьАрхивВнутр()` — при `NamePrefix = Расш5_`
- `МоёРасш_ПроверитьДату()` — при `NamePrefix = МоёРасш_`
- `Расш1_ПриОпределенииНастроек()` — при `NamePrefix = Расш1_`
---
## 8. Предопределённые элементы в расширениях
Расширения могут добавлять предопределённые элементы к заимствованным справочникам. Файл: `Каталог/Ext/Predefined.xml`.
```xml
<?xml version="1.0" encoding="UTF-8"?>
<PredefinedData xmlns="http://v8.1c.ru/8.3/xcf/predef"
xmlns:v8="http://v8.1c.ru/8.1/data/core"
xmlns:xr="http://v8.1c.ru/8.3/xcf/readable"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:type="CatalogPredefinedItems" version="2.17">
<Item id="9b751d8b-...">
<Name>НовыйЭлемент</Name>
<Code>000000001</Code>
<Description>Новый элемент</Description>
<IsFolder>false</IsFolder>
<ExtensionState>Native</ExtensionState>
</Item>
</PredefinedData>
```
### Отличие от Predefined.xml конфигурации
| Аспект | Конфигурация | Расширение |
|--------|-------------|------------|
| Пространство имён | `http://v8.1c.ru/8.3/xcf/predef` (то же) | То же |
| `ExtensionState` | Нет | `Native` — элемент создан расширением |
---
## 9. Языки (Languages/)
Язык в расширении **всегда** заимствованный:
```xml
<Language uuid="9453bb96-...">
<InternalInfo/>
<Properties>
<ObjectBelonging>Adopted</ObjectBelonging>
<Name>Русский</Name>
<Comment/>
<ExtendedConfigurationObject>0663bf5b-...</ExtendedConfigurationObject>
<LanguageCode>ru</LanguageCode>
</Properties>
</Language>
```
UUID в `ExtendedConfigurationObject` одинаков для всех расширений одной конфигурации — это UUID языка в основной конфигурации.
---
## 10. Роли (Roles/)
### 10.1. Собственная роль расширения (без прав)
Минимальная роль без `Ext/Rights.xml`:
```xml
<Role uuid="c630865b-...">
<Properties>
<Name>Расш1_ОсновнаяРоль</Name>
<Synonym/>
<Comment/>
</Properties>
</Role>
```
Собственные роли расширений в изученных примерах **не имеют** каталога `Ext/` с `Rights.xml`. Права могут задаваться через конфигуратор.
### 10.2. DefaultRoles
Ссылки на роли по умолчанию в Configuration.xml:
```xml
<DefaultRoles>
<xr:Item xsi:type="xr:MDObjectRef">Role.Расш1_ОсновнаяРоль</xr:Item>
</DefaultRoles>
```
---
## 11. Подсистемы (Subsystems/)
### 11.1. Собственная подсистема расширения
```xml
<Subsystem uuid="...">
<Properties>
<Name>Расш1_МояПодсистема</Name>
<Synonym>...</Synonym>
<Comment/>
<Picture>
<xr:Ref>CommonPicture.Расш1_МояКартинка</xr:Ref>
</Picture>
<IncludeHelpInContents>false</IncludeHelpInContents>
<IncludeInCommandInterface>true</IncludeInCommandInterface>
<Content>
<xr:Item xsi:type="xr:MDObjectRef">Catalog.Расш1_Проекты</xr:Item>
<xr:Item xsi:type="xr:MDObjectRef">Catalog.Расш1_Задачи</xr:Item>
<xr:Item xsi:type="xr:MDObjectRef">DataProcessor.Расш1_Обработка1</xr:Item>
<!-- ... -->
</Content>
</Properties>
<ChildObjects/>
</Subsystem>
```
### 11.2. Заимствованная подсистема
```xml
<Subsystem uuid="...">
<Properties>
<ObjectBelonging>Adopted</ObjectBelonging>
<Name>Закупки</Name>
<ExtendedConfigurationObject>f230c0c7-...</ExtendedConfigurationObject>
<Content>
<!-- пустой или с добавленными объектами -->
</Content>
</Properties>
<ChildObjects>
<Subsystem>Расш1_Документы</Subsystem> <!-- дочерняя подсистема -->
</ChildObjects>
</Subsystem>
```
Заимствованная подсистема может содержать элементы `Content` (добавленные расширением команды/объекты) и дочерние подсистемы в `ChildObjects`.
### 11.3. CommandInterface в расширении
Командный интерфейс подсистемы в расширении: `Subsystems/Имя/Ext/CommandInterface.xml`.
```xml
<CommandInterface version="2.17">
<CommandsVisibility>
<xr:Command>
<xr:CommandID>Document.ЗаказНаПеремещение.StandardCommand.OpenList</xr:CommandID>
<xr:Visibility>
<xr:Common>false</xr:Common>
<xr:Value name="Role.Расш1_ОсновнаяРоль">true</xr:Value>
</xr:Visibility>
</xr:Command>
</CommandsVisibility>
<CommandsOrder>
<xr:Group name="NavigationPanelOrdinary">
<xr:CommandID>...</xr:CommandID>
</xr:Group>
</CommandsOrder>
</CommandInterface>
```
---
## 12. Общие модули (CommonModules/)
### 12.1. Заимствованный общий модуль
```xml
<CommonModule uuid="a32b77fa-...">
<Properties>
<ObjectBelonging>Adopted</ObjectBelonging>
<Name>ZipАрхивы</Name>
<ExtendedConfigurationObject>b92e2bb8-...</ExtendedConfigurationObject>
</Properties>
</CommonModule>
```
Модуль расширения: `CommonModules/ZipАрхивы/Ext/Module.bsl` — содержит процедуры с декораторами перехвата.
### 12.2. Собственный общий модуль
Формат аналогичен конфигурации (без `ObjectBelonging` и `ExtendedConfigurationObject`), со всеми свойствами (Server, ExternalConnection, ClientManagedApplication и т.д.).
---
## 13. Другие типы заимствованных объектов
### 13.1. Константы
```xml
<Constant uuid="...">
<InternalInfo>
<xr:GeneratedType name="ConstantManager.ИмяКонстанты" category="ConstantManager">...</xr:GeneratedType>
<xr:GeneratedType name="ConstantValueManager.ИмяКонстанты" category="ConstantValueManager">...</xr:GeneratedType>
<xr:GeneratedType name="ConstantValueKey.ИмяКонстанты" category="ConstantValueKey">...</xr:GeneratedType>
</InternalInfo>
<Properties>
<ObjectBelonging>Adopted</ObjectBelonging>
<Name>ИмяКонстанты</Name>
<ExtendedConfigurationObject>81d26b82-...</ExtendedConfigurationObject>
<Type>
<v8:Type>xs:boolean</v8:Type>
</Type>
</Properties>
</Constant>
```
### 13.2. Функциональные опции
```xml
<FunctionalOption uuid="...">
<Properties>
<ObjectBelonging>Adopted</ObjectBelonging>
<Name>ИмяФункциональнойОпции</Name>
<ExtendedConfigurationObject>d2699502-...</ExtendedConfigurationObject>
<Location>Constant.ИмяКонстанты</Location>
</Properties>
</FunctionalOption>
```
### 13.3. Определяемые типы
Заимствованный (минимальный):
```xml
<DefinedType uuid="...">
<InternalInfo>
<xr:GeneratedType name="DefinedType.ИмяОпределяемогоТипа" category="DefinedType">...</xr:GeneratedType>
</InternalInfo>
<Properties>
<ObjectBelonging>Adopted</ObjectBelonging>
<Name>ИмяОпределяемогоТипа</Name>
</Properties>
</DefinedType>
```
Собственный (с полным описанием типа):
```xml
<DefinedType uuid="...">
<Properties>
<Name>Расш1_Координата</Name>
<Synonym>...</Synonym>
<Type>
<v8:Type>xs:decimal</v8:Type>
<v8:NumberQualifiers>
<v8:Digits>15</v8:Digits>
<v8:FractionDigits>10</v8:FractionDigits>
<v8:AllowedSign>Any</v8:AllowedSign>
</v8:NumberQualifiers>
</Type>
</Properties>
</DefinedType>
```
### 13.4. Элементы стиля
```xml
<StyleItem uuid="...">
<Properties>
<ObjectBelonging>Adopted</ObjectBelonging>
<Name>ИмяЭлементаСтиля</Name>
<ExtendedConfigurationObject>3d428bdf-...</ExtendedConfigurationObject>
<Type>Font</Type>
</Properties>
</StyleItem>
```
Тип: `Color`, `Font`, `Border`.
### 13.5. Общие картинки
```xml
<CommonPicture uuid="...">
<InternalInfo/>
<Properties>
<ObjectBelonging>Adopted</ObjectBelonging>
<Name>ИмяКартинки</Name>
</Properties>
</CommonPicture>
```
Собственные картинки могут иметь каталог `Ext/` с `Picture.xml` и файлом изображения:
```
CommonPictures/Расш1_МояКартинка/
Ext/
Picture.xml # <Picture><xr:Abs>Picture.png</xr:Abs>...</Picture>
Picture/
Picture.png # Файл изображения
```
### 13.6. Общие команды
```xml
<CommonCommand uuid="...">
<Properties>
<ObjectBelonging>Adopted</ObjectBelonging>
<Name>ИмяКоманды</Name>
<Group>FormCommandBarImportant</Group>
</Properties>
</CommonCommand>
```
### 13.7. Планы обмена
```xml
<ExchangePlan uuid="...">
<InternalInfo>
<xr:ThisNode>c335c2b8-...</xr:ThisNode>
<xr:GeneratedType .../>
</InternalInfo>
<Properties>
<ObjectBelonging>Adopted</ObjectBelonging>
<Name>ИмяПланаОбмена</Name>
<ExtendedConfigurationObject>0c01b26a-...</ExtendedConfigurationObject>
</Properties>
<ChildObjects/>
</ExchangePlan>
```
### 13.8. Планы счетов
```xml
<ChartOfAccounts uuid="...">
<InternalInfo>
<xr:GeneratedType .../>
</InternalInfo>
<Properties>
<ObjectBelonging>Adopted</ObjectBelonging>
<Name>Хозрасчетный</Name>
<ExtendedConfigurationObject>3796bdf5-...</ExtendedConfigurationObject>
</Properties>
<ChildObjects/>
</ChartOfAccounts>
```
### 13.9. Регистры сведений
Заимствованный (минимальный):
```xml
<InformationRegister uuid="...">
<InternalInfo>...</InternalInfo>
<Properties>
<ObjectBelonging>Adopted</ObjectBelonging>
<Name>ИмяРегистра</Name>
<ExtendedConfigurationObject>...</ExtendedConfigurationObject>
<InformationRegisterPeriodicity>Quarter</InformationRegisterPeriodicity>
<WriteMode>Independent</WriteMode>
</Properties>
<ChildObjects>
<Resource uuid="...">
<Properties>
<ObjectBelonging>Adopted</ObjectBelonging>
<Name>ИмяРесурса</Name>
<ExtendedConfigurationObject>...</ExtendedConfigurationObject>
<Type>...</Type>
</Properties>
</Resource>
</ChildObjects>
</InformationRegister>
```
Собственный регистр — полный набор свойств, аналогично конфигурации.
---
## 14. Назначения расширений (ConfigurationExtensionPurpose)
| Значение | Русское название | Описание |
|----------|-----------------|----------|
| `Patch` | Исправление | Минимальные исправления ошибок. Наибольшие ограничения |
| `Customization` | Адаптация | Доработка под требования заказчика. Средний уровень ограничений |
| `AddOn` | Дополнение | Добавление новой функциональности. Минимальные ограничения |
Назначение влияет на то, какие модификации допускает платформа при подключении расширения.
---
## 15. Структура каталогов (сводка)
### 15.1. Собственный объект (полная структура)
```
Catalogs/Расш1_Проекты.xml # Метаданные (полные)
Catalogs/Расш1_Проекты/
Ext/
ObjectModule.bsl # Модуль объекта
ManagerModule.bsl # Модуль менеджера
Predefined.xml # Предопределённые (опц.)
Forms/
ФормаЭлемента.xml # Метаданные формы
ФормаЭлемента/
Ext/
Form.xml # Содержимое формы
Form/
Module.bsl # Модуль формы
ФормаСписка.xml
ФормаСписка/
Ext/
Form.xml
Form/
Module.bsl
Templates/
ПФ_MXL_Акт.xml # Метаданные макета
ПФ_MXL_Акт/
Ext/
Template.xml # Содержимое макета
Commands/
ИмяКоманды.xml # Метаданные команды
ИмяКоманды/
Ext/
CommandModule.bsl # Модуль команды
```
### 15.2. Заимствованный объект (минимальная структура)
```
Catalogs/Валюты.xml # Метаданные (сокращённые)
Catalogs/Валюты/
Ext/
ManagerModule.bsl # Расширение модуля менеджера
Predefined.xml # Предопред. элементы (опц.)
Forms/
ФормаСписка.xml # Метаданные (сокращённые)
ФормаСписка/
Ext/
Form.xml # Расширение формы
Form/
Module.bsl # Расширение модуля формы
```
### 15.3. Минимальное расширение (пустое)
```
Configuration.xml # Корневой файл
ConfigDumpInfo.xml # Версии объектов
Languages/
Русский.xml # Язык (заимствованный)
```
### 15.4. Типичное расширение с ролью
```
Configuration.xml
ConfigDumpInfo.xml
Languages/
Русский.xml
Roles/
Расш1_ОсновнаяРоль.xml
```
---
## 16. Отличия заимствованного объекта от обычного (сводная таблица)
| Аспект | Обычный (конфигурация) | Заимствованный (расширение) | Собственный (расширение) |
|--------|----------------------|--------------------------|------------------------|
| `ObjectBelonging` | Нет | `Adopted` | Нет |
| `ExtendedConfigurationObject` | Нет | UUID объекта конфигурации | Нет |
| Набор Properties | Полный | Минимальный + изменённые | Полный |
| InternalInfo | GeneratedType | GeneratedType + PropertyState | GeneratedType |
| Реквизиты в ChildObjects | Полные | Заимствованные + собственные | Полные |
| Модули | Полные | С декораторами перехвата | Полные |
| Формы | Полные | С расширениями (Ext/) | Полные |