# Продвинутые конструкции типов

Примитивы (`string(n)`, `number(p,s)`, `boolean`, `date`/`dateTime`, …) и одиночные ссылки (`CatalogRef.Контрагенты`, `DocumentRef.Заказ`, `EnumRef.X`, …) описаны в основной инструкции. Здесь — типы, которые нельзя выразить одним именем: составные типы, наборы типов и платформенные наборы ссылок.

Любая из этих конструкций пишется в поле `type` реквизита, реквизита-параметра или поля.

## Составные типы

Несколько типов на одном реквизите — части перечисляются через разделитель `" | "` (можно `+`). Реквизит сможет принимать значение любого из перечисленных типов:

```json
{ "name": "Плательщик",
  "type": "CatalogRef.Организации | CatalogRef.ИндивидуальныеПредприниматели" }
```

Смешивать можно типы из разных категорий — ссылки, примитивы, наборы типов:

```json
{ "name": "Источник",
  "type": "CatalogRef.Контрагенты | DocumentRef.Заказ | string(150)" }
```

Каждая часть — самостоятельный токен из этого файла или из основной инструкции. Порядок частей произвольный.

## Наборы типов (TypeSet)

«Набор типов» подставляется вместо конкретного типа — это один токен, а не перечисление. Применимо и в составном типе как одна из частей.

| Токен `type` | Смысл |
|------|-------|
| `"DefinedType.ИмяТипа"` | определяемый тип конфигурации |
| `"Characteristic.ИмяПлана"` | тип значения характеристики (по плану видов характеристик) |
| `"AnyRef"` | любая ссылка |
| `"AnyIBRef"` | любая ссылка информационной базы |

Определяемый тип — реквизит принимает то, что задано в определяемом типе конфигурации (например `DefinedType.ДенежнаяСумма`):

```json
{ "name": "Сумма", "type": "DefinedType.ДенежнаяСумма" }
```

Характеристика — тип значения берётся из плана видов характеристик:

```json
{ "name": "Значение", "type": "Characteristic.ДополнительныеРеквизиты" }
```

## Платформенные наборы ссылок

«Голый» ссылочный токен **без `.Имя`** означает «любая ссылка этой категории объектов»:

| Токен `type` | Смысл |
|------|-------|
| `"CatalogRef"` | любая ссылка справочника |
| `"DocumentRef"` | любая ссылка документа |
| `"EnumRef"` | любая ссылка перечисления |
| `"ExchangePlanRef"` | любая ссылка плана обмена |
| `"TaskRef"` | любая ссылка задачи |
| `"BusinessProcessRef"` | любая ссылка бизнес-процесса |
| `"ChartOfCharacteristicTypesRef"` | любая ссылка плана видов характеристик |
| `"ChartOfAccountsRef"` | любая ссылка плана счетов |
| `"ChartOfCalculationTypesRef"` | любая ссылка плана видов расчёта |

Различие с одиночной ссылкой — только в наличии `.Имя`:

- `"CatalogRef.Валюты"` — конкретный справочник «Валюты»;
- `"CatalogRef"` — любой справочник.

```json
{ "name": "ЛюбойСправочник", "type": "CatalogRef" }
```

Эти наборы тоже комбинируются в составном типе:

```json
{ "name": "Объект", "type": "CatalogRef | DocumentRef" }
```
