Создает списание материалов и продуктов со склада.

```
v1/writeoffs/add.php
```

## Параметры

| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| materials | array | materials или products | Списываемые материалы: id или sku и amount |
| products | array | materials или products | Списываемые продукты: id или sku и amount |
| num | string | Нет | Номер. По умолчанию следующий по порядку |
| date | string | Нет | Дата списания, YYYY-MM-DD. По умолчанию сегодня |
| materials_storage_id | int | Нет | Склад, с которого списываются материалы |
| products_storage_id | int | Нет | Склад, с которого списываются продукты |
| production_id | int | Нет | ID производства, к себестоимости которого добавляется стоимость списания |
| notes | string | Нет | Заметки |

Строка materials и products:

| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | int | id или sku | ID материала или продукта |
| sku | string | id или sku | Артикул |
| amount | float | Да | Количество, больше 0 |

Нужна хотя бы одна строка. Как указывать позицию по id или артикулу, описано в статье [Общие правила](https://developers.controlata.ru/hc/api-docs/articles/rules).

## Как работает

* **Статус** берется из настройки **Статус нового списания по умолчанию**. В статусе **Списано** остатки уменьшаются сразу, в статусе **План** списание только планируется.
* **Склады.** Если склад не передан или равен 0, берется **Склад по умолчанию для списания материалов при производстве** (для продуктов **Склад по умолчанию для списания продуктов при производстве**). Если там выбрано **Автоматически**, берется склад по умолчанию для поставок.
* **Себестоимость** считается по FIFO. Если остатка не хватает, списание все равно проводится, остаток уходит в минус.
* **Привязка к производству** сразу увеличивает себестоимость производства на стоимость списания (см. [Списания](https://developers.controlata.ru/hc/api-docs/articles/writeoffs)).

## Пример запроса

```
{
    "date": "2026-10-06",
    "materials": [
        {
            "id": 2051,
            "amount": 0.15
        }
    ],
    "products": [
        {
            "sku": "P-TABLE-01",
            "amount": 1
        }
    ],
    "materials_storage_id": 3998,
    "products_storage_id": 4001,
    "notes": "Брак при распиле"
}
```

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

```
{
    "success": true,
    "writeoff_id": 19291,
    "num": "48",
    "status": 1
}
```

В ответе приходят ID, номер и код статуса нового списания.

## Ошибки

| Ошибка | Причина |
|---|---|
| No products or materials in input | Не передано ни одной строки |
| Materials is not an array | materials не массив (так же для products) |
| Line 0 of materials must be an object | Строка не объект (вместо 0 будет номер строки) |
| SKU or id not set for material 0 | В строке нет ни id, ни sku |
| Material with id 2051 not found | Материал не найден или удален (для продукта: Product with SKU "P-TABLE-01" not found) |
| Amount must be greater than 0 for material with id 2051 | Количество не число или не больше 0 после округления |
| Storage ID not found | Склад не найден или удален |
| Production not found or access denied | Производство из production_id не найдено |
| Date is not a valid date in format YYYY-MM-DD | Неверный формат даты |
