---
title: "Продать сразу — закупка и акт одной командой"
method: POST
path: "/api/v1/core/purchases/execute-now"
tags: ["Core trade"]
---

# Продать сразу — закупка и акт одной командой

`POST /api/v1/core/purchases/execute-now`

## Request

- Base URL: `https://erp.akeda.ru`
- URL: `https://erp.akeda.ru/api/v1/core/purchases/execute-now`
- 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

«Закупка сразу исполненным» для внешней системы, программы или модуля: закупка заводится или узнаётся по стороне и внешнему номеру, подтверждается, и по нему выпускается акт на всю сумму — одной транзакцией кабинета. Акт выпускает владелец исполнения: при включённом документообороте после отсечки этапа 4 бизнеса (и в кабинете без финансов) — «Сделать акт» документооборота, бумага и исполнение одной командой, бумага с исполнением сразу зарегистрирована; иначе — акт финансов по закупке. Кроме `core.trade:write` нужно право двери владельца: `docflow.flow:write` или `finance.operations:write` (403 `core.trade.execution_forbidden`). Повтор с тем же `external_id` той же стороны отвечает 200 с `replayed: true` и тем, что сделано в первый раз: второй закупки, бумаги и акта нет; ключ идемпотентности не нужен. Отказ любого шага откатывает всё — закупка не остаётся. Акт закрывает работы и услуги; товар при включённом складе исполняет отгрузка (409 `core.trade.goods_by_shipment`), товар без склада при документообороте — УПД, выпуск которого по закупке ещё не сделан (409 `core.trade.goods_need_upd`). Закупка при документообороте после отсечки — бумагой поставщика (409 `core.trade.purchase_needs_paper`). Без финансов и документооборота — 409 `core.trade.no_executor`.

## Headers

- `X-Tenant` string, required

## Request body

- CoreOrderNowInput: Продажа или закупка целиком, его внешний номер и акт. Поля продажи или закупки — те же, что у загрузки; подтверждение подразумевается.
  - `side` 'sale' | 'purchase', required
  - `number` string: Свой номер; пусто — номер выдаёт счётчик вида
  - `date` string, date, required
  - `business_id` string, uuid
  - `company_id` string, uuid
  - `contact_id` string, uuid
  - `counterparty` CoreOrderCounterparty: Покупатель загрузки без id: юрлицо узнаётся по ИНН и КПП, физлицо — по телефону или заводится.
    - `name` string
    - `inn` string
    - `kpp` string
    - `phone` string
    - `email` string
  - `contract_id` string, uuid
  - `project_id` string, uuid
  - `department_id` string, uuid
  - `cfo_id` string, uuid
  - `pnl_item_id` string, uuid
  - `warehouse_id` string, uuid
  - `basis_id` string, uuid
  - `title` string
  - `currency` string, required
  - `prices_include_vat` boolean: Цены с НДС («в том числе»); по умолчанию true
  - `discount` string
  - `delivery_date` string, date
  - `due_date` string, date
  - `scenario` 'one_off_sale' | 'contract_sale' | 'self_service'
  - `manager_note` string
  - `warehouse_note` string
  - `comment` string
  - `buyer` CoreOrderBuyer: Покупатель-физлицо: розничный продажа или закупка стоит на общей карточке покупателя, и различает покупателей только это.
    - `name` string
    - `phone` string
    - `email` string
  - `lines` CoreOrderLineInput[], required
    - `id` string, uuid
    - `kind` 'goods' | 'service' | 'material' | 'semi_product'
    - `product_id` string, uuid
    - `article` string: Артикул — позиция узнаётся по нему, если id не назван
    - `title` string, required
    - `unit` string
    - `unit_id` string, uuid
    - `quantity` string, required: Десятичное число строкой
    - `price` string: Цена строки; не названа у позиции номенклатуры — цену подбирает сервер (договор → канал → контрагент → вид по умолчанию)
    - `discount` string: Десятичное число строкой
    - `vat_rate` string: Ставка НДС строки; пусто — по учётной политике юрлица на дату продажи или закупки
    - `base_qty` string: Десятичное число строкой
    - `basis_document_id` string, uuid
    - `basis_line_id` string, uuid
    - `price_type_id` string, uuid
    - `price_source` '' | 'manual' | 'contract' | 'contract_price' | 'channel' | 'contact' | 'contact_price' | 'default' | 'supplier': Откуда цена строки; набранная цена без источника — ручная
  - `responsibles` CoreOrderResponsible[]
    - `employee_id` string, uuid, required
    - `employee_name` string
    - `share` string, required: Доля в процентах: больше нуля, не больше ста
  - `stages` CoreOrderStage[]
    - `id` string, uuid
    - `position` integer
    - `title` string
    - `planned_date` string, date
    - `amount` string: Сумма этапа в валюте продажи или закупки с налогом
    - `line_ids` UUID[]: Строки продажи или закупки, которые закрывает этап; пусто — строки-услуги по порядку
  - `payment_terms` CoreOrderPaymentTerm[]
    - `id` string, uuid
    - `position` integer
    - `title` string
    - `amount` string
    - `due_date` string, date
    - `due_trigger` '' | 'after_stage': '' — срок датой; after_stage — через delay_days после исполнения этапа stage_id
    - `stage_id` string, uuid
    - `delay_days` integer
    - `share` string: Доля итога документа в процентах, только на входе: строка без суммы получает сумму от итога с НДС, последняя такая строка добирает копейки
  - `cabinet_status_id` string, uuid
  - `external_id` string, required: Номер продажи или закупки у источника; по стороне и нему узнаётся повтор
  - `source_system` string: Имя источника: сайт, CRM, маркетплейс
  - `act` CoreOrderNowAct: Реквизиты акта; пусто — дата продажи или закупки, номер по счётчику, название по продаже или закупке
    - `date` string, date
    - `number` string
    - `title` string
    - `for_contact` string, uuid
    - `supplier_document` SupplierDocument: Номер и дата документа поставщика (ERP-484, подшаг 5.3): по ним входящий НДС сверяется с книгой покупок. Оба поля необязательны
      - `number` string
      - `date` string, date
    - `vat_amount` string: «В т.ч. НДС» с документа поставщика; только у закупки. Без поля — налог заказа по строкам
    - `source_1c` CoreOrderNowSource1C: Документ 1С, из которого перенесён акт поставщика: до даты переноса бизнеса принимается без бумаги
      - `ref_key` string, required: Ref_Key документа 1С
      - `number` string: Номер документа в 1С
      - `date` string, date: Дата документа в 1С

## Response `200`

Повтор — закупка уже исполнена этой командой

- CoreOrderNowResult
  - `order` CoreOrder, required: Продажа или закупка — документ ядра. В журнале строка без obligation и allowed_actions; карточка и ответы команд несут обе.
    - `id` string, uuid, required
    - `side` 'sale' | 'purchase', required
    - `type_key` 'customer_order' | 'supplier_order', required
    - `number` string, required
    - `date` string, date, required
    - `document_status` 'draft' | 'posted' | 'cancelled', required
    - `state` 'draft' | 'confirmed' | 'executing' | 'executed' | 'closed' | 'cancelled', required
    - `business_id` string, uuid, required
    - `company_id` string, uuid
    - `contact_id` string, uuid, required
    - `business_name` string
    - `company_name` string
    - `contact_name` string
    - `contract_id` string, uuid
    - `channel_id` string, uuid
    - `channel_name` string
    - `contract_number` string: Номер договора продажи или закупки — для экрана
    - `contract_date` string, date: Дата договора продажи или закупки — для экрана
    - `progress` CoreOrderProgress: Ход продажи или закупки для строки списка (with=progress). executed — исполнено в валюте продажи или закупки; paid — оплачено, нет поля — финансы выключены; papers — счёт, акт и УПД: done — есть, wait — ждём подписи, нет ключа — нет; нет поля — документооборот выключен.
      - `executed` string, required
      - `paid` string
      - `debt` string: Долг из регистра расчётов — тот же, что во «Взаиморасчётах»; нет поля — финансы выключены
      - `papers` object
    - `project_id` string, uuid
    - `department_id` string, uuid
    - `cfo_id` string, uuid
    - `pnl_item_id` string, uuid
    - `execution_cutover` boolean: Бизнес продажи или закупки прошёл отсечку этапа 4: исполнение закрывает вклад регистра «Продажи и закупки» и признаёт выручку; «Сделать акт» в документообороте выпускает бумагу и проводит исполнение одной командой
    - `warehouse_id` string, uuid
    - `basis_id` string, uuid
    - `title` string, required
    - `currency` string, required
    - `prices_include_vat` boolean, required
    - `discount` string, required: Скидка на продажу или закупку целиком, как её ввели; в суммах строк уже учтена
    - `delivery_date` string, date
    - `due_date` string, date
    - `scenario` string, required
    - `manager_note` string
    - `warehouse_note` string
    - `comment` string
    - `buyer` CoreOrderBuyer: Покупатель-физлицо: розничный продажа или закупка стоит на общей карточке покупателя, и различает покупателей только это.
      - `name` string
      - `phone` string
      - `email` string
    - `source_kind` 'manual' | 'app' | 'import' | 'marketplace' | 'crm' | 'migration' | 'contract', required: Откуда продажа или закупка. contract — продажа или закупка периода регулярного договора документооборота (commerce-cycle.md § 2.6): его external_id — «<id договора>/<период>» (2026-10, 2026-Q4, 2026-W41), и загрузка с тем же внешним номером отвечает core.trade.foreign_source.
    - `source_system` string
    - `external_id` string
    - `cabinet_status_id` string, uuid
    - `cabinet_status_name` string
    - `sale_order_id` string, uuid
    - `sale_order_number` string: Номер этой продажи
    - `funnel_id` string, uuid
    - `version` integer, required
    - `closed_at` string
    - `closed_reason` string
    - `close_document_id` string, uuid
    - `migrated_from` string
    - `lines` CoreOrderLine[], required
      - `id` string, uuid, required
      - `position` integer, required
      - `kind` 'goods' | 'service' | 'material' | 'semi_product', required
      - `product_id` string, uuid
      - `title` string, required
      - `unit` string
      - `unit_id` string, uuid
      - `quantity` string, required: Десятичное число строкой
      - `price` string, required: Десятичное число строкой
      - `discount` string, required: Скидка самой строки
      - `discount_amount` string, required: Доля скидки продажи или закупки на этой строке; суммы строки посчитаны после обеих скидок
      - `vat_rate` string: Ставка, как её ввели; пусто — по учётной политике
      - `vat_rate_applied` string: Ставка, по которой строка посчитана; пусто — налог не выделен
      - `amount_net` string, required: Сумма строкой в разрядности валюты продажи или закупки
      - `vat_amount` string, required: Сумма строкой в разрядности валюты продажи или закупки
      - `amount_gross` string, required: Сумма строкой в разрядности валюты продажи или закупки
      - `base_qty` string: Количество в базовой единице склада
      - `basis_document_id` string, uuid
      - `basis_line_id` string, uuid
      - `price_type_id` string, uuid
      - `price_type_name` string
      - `price_source` '' | 'manual' | 'contract' | 'contract_price' | 'channel' | 'contact' | 'contact_price' | 'default' | 'supplier': Откуда цена строки: manual — введена человеком; contract, channel, contact, default — вид цены договора, канала, контрагента или по умолчанию; contract_price, contact_price — индивидуальная цена; supplier — цена поставщика
    - `responsibles` CoreOrderResponsible[], required
      - `employee_id` string, uuid, required
      - `employee_name` string
      - `share` string, required: Доля в процентах: больше нуля, не больше ста
    - `stages` CoreOrderStage[]: Этапы работ продажи или закупки (этап 4 ERP-1427)
      - `id` string, uuid
      - `position` integer
      - `title` string
      - `planned_date` string, date
      - `amount` string: Сумма этапа в валюте продажи или закупки с налогом
      - `line_ids` UUID[]: Строки продажи или закупки, которые закрывает этап; пусто — строки-услуги по порядку
    - `payment_terms` CoreOrderPaymentTerm[]: График оплат продажи или закупки; id строки — разрез stage регистра расчётов
      - `id` string, uuid
      - `position` integer
      - `title` string
      - `amount` string
      - `due_date` string, date
      - `due_trigger` '' | 'after_stage': '' — срок датой; after_stage — через delay_days после исполнения этапа stage_id
      - `stage_id` string, uuid
      - `delay_days` integer
      - `share` string: Доля итога документа в процентах, только на входе: строка без суммы получает сумму от итога с НДС, последняя такая строка добирает копейки
    - `totals` CoreOrderTotals, required: Итоги — сумма строк: скидка продажи или закупки уже разложена по строкам и второй раз не вычитается.
      - `net` string, required: Сумма строкой в разрядности валюты продажи или закупки
      - `vat` string, required: Сумма строкой в разрядности валюты продажи или закупки
      - `gross` string, required: Сумма строкой в разрядности валюты продажи или закупки
      - `goods_gross` string, required: Сумма строкой в разрядности валюты продажи или закупки
      - `services_gross` string, required: Сумма строкой в разрядности валюты продажи или закупки
      - `currency` string, required
    - `created_by` integer
    - `created_at` string, date-time, required
    - `updated_at` string, date-time, required
    - `posted_at` string
    - `cancelled_at` string
    - `obligation` CoreOrderObligation
      - `ordered` string, required: Действующий приход подтверждения в регистре «Продажи и закупки»
      - `remaining` string, required: Остаток портфеля продажи или закупки в регистре «Продажи и закупки»: заказано минус снятое закрытием. Это не денежный долг: долг контрагента и зачёт аванса живут в расчётах (settlement), и при «Долг 0,00» этот остаток остаётся полным. До этапа 4 исполнение его не уменьшает, поэтому это и не «осталось исполнить»
      - `executed` string, required: Исполнено: сумма проведённых исполнений продажи или закупки (акт, продажа, закупка, приёмка) за вычетом возвратов, в валюте продажи или закупки. То же число, что в журнале продаж и закупок финансов (core_order_executed)
      - `remaining_to_execute` string, required: Осталось исполнить: заказано минус исполнено, не меньше нуля
    - `allowed_actions` CoreOrderAllowedAction[]: Только в карточке и ответах команд
      - `action` 'edit' | 'confirm' | 'cancel' | 'close' | 'reopen' | 'cabinet_status' | 'responsibles' | 'contract', required
      - `allowed` boolean, required
      - `reason_code` string: Код отказа: core.trade.has_executions, core.trade.has_dependents (оплаты, авансы, черновики исполнений), core.trade.closed, core.trade.forbidden
      - `reason` string: Причина словами на языке запроса
    - `vat_warnings` CoreOrderVATWarning[]: Только в карточке: строки со ставкой, названной человеком, равной прежней общей ставке юрлица, когда на сегодня общая ставка уже другая — «проверьте ставку», не отказ
      - `line_id` string, uuid, required
      - `title` string, required
      - `rate` string, required: Ставка строки, названная человеком
      - `general` string, required: Общая ставка юрлица на дату
      - `date` string, date, required
    - `unchanged` boolean: Только в ответах команд подтверждения, отмены и возврата в работу: true — команде нечего было делать (подтверждена уже, отменена уже, не закрыта), заказ не изменился. Повтор команды отвечает той же карточкой, а не ошибкой
  - `execution` CoreOrderNowExecution, required: Что выпустил владелец исполнения. docflow — бумага документооборота (paper_*), при финансах после отсечки — с учётным документом исполнения (execution_*); finance — акт финансов без бумаги.
    - `owner` 'docflow' | 'finance', required
    - `paper_id` string, uuid
    - `paper_number` string
    - `paper_status` string: registered — бумага с проведённым исполнением; draft — бумага без книги (финансы выключены)
    - `execution_id` string, uuid
    - `execution_number` string
  - `replayed` boolean, required: true — продажа или закупка уже был исполнен этой командой; ничего не записано

## Other responses

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

---

[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/3c60ded179f2?raw)
