## Поля товаров сделки

`GET /v1/deals/:id/products/fields`

Возвращает описание полей товарных позиций сделки: названия, типы, доступность для чтения и записи.

> **Сумма скидки называется `discount`** — как в данных и при записи. Прежнее имя `discountSum` осталось устаревшим псевдонимом: оно по-прежнему приходит в этом справочнике и принимается при записи, поэтому код, написанный по старому списку полей, продолжает работать. В самих товарных позициях приходит только `discount` — переходите на него.

## Параметры

| Параметр | Тип | Обяз. | Описание |
|----------|-----|:-----:|---------|
| `id` (path) | number | да | ID сделки |

## Примеры

### curl — личный ключ

```bash
curl "https://vibecode.bitrix24.tech/v1/deals/741/products/fields" \
  -H "X-Api-Key: YOUR_API_KEY"
```

### curl — OAuth-приложение

```bash
curl "https://vibecode.bitrix24.tech/v1/deals/741/products/fields" \
  -H "X-Api-Key: YOUR_APP_KEY" \
  -H "Authorization: Bearer USER_SESSION_TOKEN"
```

### JavaScript — личный ключ

```javascript
const res = await fetch('https://vibecode.bitrix24.tech/v1/deals/741/products/fields', {
  headers: {
    'X-Api-Key': 'YOUR_API_KEY',
  },
})

const { success, data } = await res.json()
console.log('Полей:', Object.keys(data).length)
```

### JavaScript — OAuth-приложение

```javascript
const res = await fetch('https://vibecode.bitrix24.tech/v1/deals/741/products/fields', {
  headers: {
    'X-Api-Key': 'YOUR_APP_KEY',
    'Authorization': 'Bearer USER_SESSION_TOKEN',
  },
})

const { success, data } = await res.json()
```

## Поля ответа

| Поле | Тип | RO | Обяз. | Описание |
|------|-----|:--:|:-----:|---------|
| `id` | integer | да | | ID позиции |
| `productId` | integer | | да | ID товара. Каталог: `GET /v1/products` |
| `productName` | string | | | Название товара |
| `price` | double | | | Цена |
| `quantity` | double | | | Количество |
| `discount` | double | | | Сумма скидки |
| `discountSum` | double | | | Устаревший псевдоним `discount` — принимается при записи, в товарных позициях не приходит |
| `discountRate` | double | | | Величина скидки (%) |
| `discountTypeId` | integer | | | Тип скидки |
| `taxRate` | double | | | Налог (%) |
| `taxIncluded` | char | | | Налог включён в цену (`Y`/`N`) |
| `priceExclusive` | double | да | | Цена без налога со скидкой |
| `priceNetto` | double | да | | Цена нетто |
| `priceBrutto` | double | да | | Цена брутто |
| `measureCode` | integer | | | Код единицы измерения |
| `measureName` | string | да | | Единица измерения |
| `customized` | char | да | | Изменён (`Y`/`N`) |
| `sort` | integer | | | Сортировка |
| `type` | integer | да | | Тип |
| `storeId` | integer | да | | ID склада |
| `ownerId` | integer | да | | ID владельца (сделки) |
| `ownerType` | string | да | | Тип владельца |
| `priceAccount` | double | да | | Цена в валюте отчёта |
| `xmlId` | string | да | | Внешний код позиции |

## Пример ответа

```json
{
  "success": true,
  "data": {
    "id": { "type": "integer", "isRequired": false, "isReadOnly": true, "title": "ID", "description": "Row identity. Read-only as an attribute; echo it back in PUT /products items to update a row in place instead of recreating it." },
    "ownerId": { "type": "integer", "isRequired": false, "isReadOnly": true, "isImmutable": true, "title": "ID владельца" },
    "ownerType": { "type": "string", "isRequired": false, "isReadOnly": true, "isImmutable": true, "title": "Тип владельца" },
    "productId": { "type": "integer", "isRequired": true, "isReadOnly": false, "title": "Товар" },
    "productName": { "type": "string", "isRequired": false, "isReadOnly": false, "title": "Название товара" },
    "price": { "type": "double", "isRequired": false, "isReadOnly": false, "title": "Цена" },
    "priceExclusive": { "type": "double", "isRequired": false, "isReadOnly": true, "title": "Цена без налога со скидкой" },
    "priceNetto": { "type": "double", "isRequired": false, "isReadOnly": true, "title": "PRICE_NETTO" },
    "priceBrutto": { "type": "double", "isRequired": false, "isReadOnly": true, "title": "PRICE_BRUTTO" },
    "quantity": { "type": "double", "isRequired": false, "isReadOnly": false, "title": "Количество" },
    "discountTypeId": { "type": "integer", "isRequired": false, "isReadOnly": false, "title": "Тип скидки" },
    "discountRate": { "type": "double", "isRequired": false, "isReadOnly": false, "title": "Величина скидки" },
    "discount": { "type": "double", "isRequired": false, "isReadOnly": false, "title": "Сумма скидки" },
    "discountSum": { "type": "double", "isRequired": false, "isReadOnly": false, "title": "Сумма скидки", "description": "Deprecated alias of `discount`; kept so clients written against the previous field list keep working. Accepted on write, never present in row data — migrate to `discount`." },
    "taxRate": { "type": "double", "isRequired": false, "isReadOnly": false, "title": "Налог" },
    "taxIncluded": { "type": "char", "isRequired": false, "isReadOnly": false, "title": "Налог включен в цену" },
    "customized": { "type": "char", "isRequired": false, "isReadOnly": true, "title": "Изменен" },
    "measureCode": { "type": "integer", "isRequired": false, "isReadOnly": false, "title": "Код единицы измерения" },
    "measureName": { "type": "string", "isRequired": false, "isReadOnly": true, "title": "Единица измерения" },
    "sort": { "type": "integer", "isRequired": false, "isReadOnly": false, "title": "Сортировка" },
    "type": { "type": "integer", "isRequired": false, "isReadOnly": true, "title": "TYPE" },
    "storeId": { "type": "integer", "isRequired": false, "isReadOnly": true, "title": "STORE_ID" },
    "priceAccount": { "type": "double", "isRequired": false, "isReadOnly": true },
    "xmlId": { "type": "string", "isRequired": false, "isReadOnly": true }
  }
}
```

## Пример ответа при ошибке

404 — сделка не найдена:

```json
{
  "success": false,
  "error": {
    "code": "ENTITY_NOT_FOUND",
    "message": "Элемент не найден"
  }
}
```

## Ошибки

| HTTP | Код | Описание |
|------|-----|---------|
| 404 | `ENTITY_NOT_FOUND` | Сделка не найдена |
| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `crm` |
| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |

Полный список общих ошибок API — [Ошибки](/docs/errors).

## Смотрите также

- [Товарные позиции](/docs/entities/deals/products-get)
- [Добавить товар](/docs/entities/deals/products-add)
- [Установить товары](/docs/entities/deals/products-set)
- [Поля сделки](/docs/entities/deals/fields)
