---
title: "Создать черновики списания просроченного"
method: POST
path: "/api/v1/stock/expired-stock/writeoff-drafts"
tags: ["Stock batches"]
---

# Создать черновики списания просроченного

`POST /api/v1/stock/expired-stock/writeoff-drafts`

## Request

- Base URL: `https://erp.akeda.ru`
- URL: `https://erp.akeda.ru/api/v1/stock/expired-stock/writeoff-drafts`
- Auth: one of:
  - HTTP bearer
  - API key in header `X-Api-Key`
  - OAuth 2 (authorization code, authorization URL `https://erp.akeda.ru/oauth2/authorize`, token URL `https://erp.akeda.ru/oauth2/token`, scopes: `akeda:delegate`)
  - HTTP bearer

Действие «Списать просроченное» (ERP-1821): под теми же отборами, что у чтения просроченного остатка, заводит по черновику списания на каждую пару «юрлицо × склад». Склад — тот, на котором лежит остаток: зона остаётся зоной. Строки — «товар × состояние» с количеством writeoff_quantity, дата — сегодня по календарю кабинета, причина — «Истёк срок годности» из справочника причин списания (нет её в справочнике кабинета — только текстом). Ничего не проводит: человек проверяет черновик и проводит его сам. Проведённый в тот же день черновик списывает ровно просроченные партии: списание берёт партии с ближайшим сроком первыми. Просрочка в недоступных единицах хранения и на складах внешней стороны (склад площадки, товары в пути) в черновик не входит. Повторный вызов второй черновик не заводит: пока прежний не проведён и не удалён, ответ называет его с created=false — в том числе когда отбор другой, а склад и юрлицо те же. Такой черновик заведён раньше, и просрочка с тех пор могла вырасти: сверьте его количество с чтением просроченного остатка. Ключ идемпотентности поэтому не нужен. Просрочка склада больше чем на 1000 строк делится на несколько черновиков. Нечего списывать — пустой список. Позиция или пара «юрлицо × склад», которую складской документ не примет (архивный товар, закрытый период, склад закрыт для юрлица), действие не останавливает: она уходит в skipped с причиной, остальные черновики создаются. Документ с признаком expired_writeoff списывает только просрочку: если к проведению её стало меньше, чем в строке (часть уже списана, единицу хранения заблокировали, дату сдвинули назад, дописана строка годного товара), проведение отвечает 400 с кодом expired_writeoff_stale и полями product_id, line_id, date, requested, available — годный товар вместо просрочки не списывается. Смешанное списание оформляют обычным документом. Тело разбирается строго: незнакомое поле — 400 stock.expired_stock.body_invalid.

## Headers

- `X-Tenant` string, required

## Request body

- StockExpiredWriteoffDraftsInput: Отборы действия «Списать просроченное» — те же, что у чтения просроченного остатка. Пустое тело — весь доступный остаток.
  - `business_id` string, uuid
  - `company_id` string, uuid
  - `warehouse_id` string, uuid
  - `product_id` string, uuid

## Response `200`

Созданные и уже существующие черновики списания

- StockExpiredWriteoffDrafts
  - `as_of` string, date, required: Дата черновиков: сегодня по календарю кабинета
  - `count` integer, required: Число черновиков в results
  - `results` StockExpiredWriteoffDraft[], required
    - `document_id` string, uuid, required
    - `number` string, required
    - `date` string, date, required
    - `created` boolean, required: true — черновик создан этим вызовом; false — он уже был и назван повторно: заведён раньше, и просрочка с тех пор могла вырасти
    - `business_id` string, uuid, required
    - `business_name` string, required
    - `company_id` string, uuid, required
    - `company_name` string, required
    - `warehouse_id` string, uuid, required
    - `warehouse_name` string, required
    - `lines` integer, required: Число строк черновика
    - `quantity` string, required: Количество по строкам черновика в базовых единицах, десятичная строка. У прежнего черновика — как в самом документе: его могли поправить
  - `skipped` StockExpiredWriteoffSkipped[], required: Просрочка, по которой черновик не создан, с причиной; пусто — пропущенного нет
    - `business_id` string, uuid, required
    - `business_name` string, required
    - `company_id` string, uuid, required
    - `company_name` string, required
    - `warehouse_id` string, uuid, required
    - `warehouse_name` string, required
    - `product_id` string, uuid, required
    - `product_sku` string, required
    - `product_name` string, required
    - `unit` string, required
    - `condition_id` string, uuid, required
    - `condition_name` string, required
    - `quantity` string, required: Сколько просрочки не попало в черновик: просрочка строки без недоступных единиц хранения
    - `code` 'product_unavailable' | 'condition_inactive' | 'company_inactive' | 'warehouse_unavailable' | 'period_closed' | 'costing_ambiguous' | 'draft_refused', required: Причина пропуска; значения — как у writeoff_blocker чтения
    - `detail` string, required: Готовая фраза для человека на языке запроса

## Other responses

- `400`: Некорректный запрос или нарушение бизнес-правила
- `401`: Сессия, ключ или кабинет не подтверждены
- `403`: Текущая роль не имеет требуемого права
- `404`: Запись не найдена или не видима текущему пользователю
- `409`: Конфликт версии, идемпотентности или бизнес-состояния

---

[API](https://skmtc.dev/akeda/apis/akeda-erp-client-api.md) · [All operations](https://skmtc.dev/akeda/apis/akeda-erp-client-api/llms.txt) · [OpenAPI document](https://skmtc.dev/akeda/apis/akeda-erp-client-api/revisions/a99574d597cc?raw)
