---
title: "Выпустить УПД и исполнить свою продажу приложения"
method: POST
path: "/api/v1/app/docflow/sales/{id}/upd"
tags: ["App runtime"]
---

# Выпустить УПД и исполнить свою продажу приложения

`POST /api/v1/app/docflow/sales/{id}/upd`

## Request

- Base URL: `https://erp.akeda.ru`
- URL: `https://erp.akeda.ru/api/v1/app/docflow/sales/{id}/upd`
- Auth: HTTP bearer

Для продажи с услугой одной командой создаёт исполнение, номерную запись реестра и зарегистрированный УПД. Повтор Idempotency-Key возвращает тот же документ; отдельный акт не выпускается.

## Path parameters

- `id` string, uuid, required

## Headers

- `X-Tenant` string, required
- `Idempotency-Key` string

## Request body

- DocflowOrderActInput
  - `date` string, date: Дата акта; пусто — дата продажи или закупки
  - `number` string: Пусто — следующий номер счётчика актов
  - `title` string
  - `amount` string: Пусто — все услуги продажи или закупки; меньше — частичный акт суммой

## Response `201`

Выпущенный УПД

- DocflowFlowDocument: Карточка документа внутреннего контура в одной редакции. Каждая принятая команда рождает новую неизменяемую редакцию, а прежняя остаётся читаемой по своему адресу.
  - `id` string, uuid, required
  - `company_id` string, uuid, required
  - `business_id` string, uuid: Бизнес бумаги. У бумаги без юрлица (company_id — нулевой id) он один называет сторону «мы»; в печати стоит его название
  - `execution_cutover` boolean: Бизнес юрлица бумаги прошёл отсечку этапа 4: мастер «Принять акт» и «Создать продажу / закупку» у бумаги сняты
  - `company_name` string, required
  - `contact_id` string, uuid, required
  - `contact_name` string, required
  - `kind` 'contract' | 'specification' | 'amendment' | 'invoice' | 'act' | 'upd' | 'goods_waybill' | 'transport_waybill' | 'consignment_note' | 'transport_order' | 'tax_invoice' | 'correction' | 'return' | 'discrepancy_act' | 'reconciliation_act' | 'power_of_attorney' | 'other', required: Вид документа внутреннего контура. Вид называет бумагу, а не учётную операцию: продажу и закупку из бумаги делают отдельные команды.
  - `direction` 'incoming' | 'outgoing' | 'internal', required
  - `status` 'draft' | 'registered' | 'archived', required
  - `archived_from` 'draft' | 'registered': Из какого состояния бумага ушла в архив
  - `version` integer, required
  - `identity_editable` boolean, required: Ложь означает: стороны и вид уже закреплены редакцией или связью и не меняются
  - `content` DocflowFlowContent, required: Реквизиты бумаги — то, что переписано с документа.
    - `title` string, required
    - `number` string
    - `date` string, date, required
    - `contract` DocflowFlowContractTerms: Условия договора в старой форме. Остаётся читаемой и принимается, но новую коммерческую часть описывает commercial. У договора без лимита (mode=framework) суммы и валюты в условиях нет вовсе — искусственного нуля здесь не бывает. Коммерческая часть рядом с ним законна только с payment_rule, у которого названа сумма платежа: это бессрочный договор с регулярным платежом. Без неё это рамочный договор, суммы которого ведутся спецификациями, и commercial с ним не сохраняется.
      - `mode` 'framework' | 'fixed', required
      - `subject` string, required
      - `valid_from` string, date, required
      - `valid_until` string, date
      - `amount` string: Только у mode=fixed
      - `currency` string
      - `payment_terms` string
      - `renewal_terms` string
      - `order_funnel_id` string, uuid: Воронка продаж или закупок договора: продажи или закупки по договору идут в неё (пометка кабинета, не текст бумаги)
      - `responsibles` DocflowFlowResponsible[]: Ответственные по договору с долями: продажи и закупки периодов получают их по умолчанию; сумма долей — ровно 100
        - `employee_id` string, uuid, required
        - `share` string, required: Доля в процентах десятичным текстом
    - `commercial` DocflowFlowCommercial: Коммерческая часть бумаги — сумма, валюта, строки и графики. Пустая amount законна только вместе с payment_rule, у которого названа сумма платежа: у бессрочного договора итога нет и быть не может, а строк оригинала и этапов работ у такой сделки не бывает — их суммы обязаны сойтись с итогом.
      - `currency` string, required
      - `amount` string, required: Десятичным текстом; пусто — итога нет или его выводит правило графика
      - `payment_terms` string
      - `due_date` string, date
      - `lines` DocflowFlowCommercialLine[]
        - `id` string, uuid, required
        - `product_id` string, uuid
        - `product_name` string
        - `name` string, required
        - `unit` string
        - `quantity` string
        - `price` string
        - `amount` string, required
        - `vat_amount` string, nullable: null означает, что налог не переписывали, а не что строка без налога
        - `vat_rate` string: Ставка строки в записи документа: «22%», «22/122», «без НДС». Пусто — по учётной политике юрлица на дату документа
        - `article` string: Ручной артикул товара для покупателя (ДопСведТов@АртикулТов). Пусто — по настройке покупателя
        - `code` string: Ручной код товара для покупателя (ДопСведТов@КодТов). Пусто — по настройке покупателя
      - `milestones` DocflowFlowScheduleStage[]: Этапы работ
        - `id` string, uuid, required
        - `label` string
        - `date` string, date
        - `amount` string, required: Десятичным текстом, не числом с плавающей точкой
        - `due_trigger` string: Чем открывается срок платежа: датой или закрытием этапа
        - `after_stage_id` string, uuid
        - `delay_days` integer: Дней после события срока
      - `payments` DocflowFlowScheduleStage[]: График платежей; при payment_rule — его раскрытие
        - `id` string, uuid, required
        - `label` string
        - `date` string, date
        - `amount` string, required: Десятичным текстом, не числом с плавающей точкой
        - `due_trigger` string: Чем открывается срок платежа: датой или закрытием этапа
        - `after_stage_id` string, uuid
        - `delay_days` integer: Дней после события срока
      - `payment_rule` DocflowFlowPaymentRule: Регулярный график оплат одним правилом: сумма платежа, период, день, начало и ровно одно из трёх окончаний — число платежей, последняя дата или open («пока действует договор»). Сервер раскрывает правило в строки payments сам; план финансов и расчёты видят только строки, как при ручном графике. При названной сумме платежа сумма документа (commercial.amount) может быть пустой: с count или until она вычисляется как N × платёж, с open её нет вовсе. Бессрочное правило раскрывается на горизонт в 12 ближайших платежей — это план, а не весь договор.
        - `amount` string: Сумма одного платежа десятичным текстом; пусто — сумма документа делится поровну. Обязательна, когда суммы документа нет
        - `period` 'month' | 'week' | 'quarter', required
        - `day` integer, required: День месяца (month, quarter; короткий месяц прижимает к своему концу) или день недели ISO 1..7 (week). При заданном day_kind сервер записывает 31, и день задаёт day_kind
        - `day_kind` 'last' | 'last_workday': Какой день месяца платёжный, только для month и quarter: last — последний день месяца, last_workday — последний рабочий день месяца по производственному календарю РФ (праздники ст. 112 ТК РФ и переносы выходных). Пусто — число из day. Для week — отказ 422
        - `advance` boolean: Оплата вперёд — за следующий период: даты платежей не меняются, а период, за который платёж, на шаг правила позже (платёж 30.10 — за ноябрь). От этого периода считаются период, название и строки условий продажи или закупки периода и конец периода для бумаг; первый период (orders.from) и срок договора сравниваются с ним же. С shares не сочетается: отказ 422 docflow.flow.payment_advance_shares
        - `start` string, date, required: Первый платёж — ближайшая дата не раньше этой
        - `count` integer: Число платежей; задаётся вместо until
        - `until` string, date: Последняя допустимая дата включительно; задаётся вместо count
        - `open` boolean: Пока действует договор: окончания нет, итога нет, раскрываются ближайшие 12 платежей
        - `orders` DocflowFlowPaymentRuleOrders: «Заводить продажу или закупку на каждый период» — только у договора (kind=contract). Зарегистрированный договор сам заводит на каждую наступившую стадию правила подтверждённый продажу или закупку ядра (source_kind=contract, external_id «<id договора>/<период>»): сразу после регистрации и фоновым проходом раз в час. Один договор и один период — один продажа или закупка навсегда: отменённый не воскресает, период не позже последнего продажи или закупки договора не заводится. Будущие периоды не заводятся; исполнение и бумаги периода — вручную.
          - `from` string, date: Первый период: стадии раньше этой даты продаж или закупок не получают. Пусто — с начала правила, прошедшие периоды догоняются
          - `product_id` string, uuid
          - `product_name` string: Название услуги на момент выбора; пишет сервер, присланное не читается
          - `papers` DocflowFlowPeriodPapers: Счёт и закрывающая бумага каждого периода регулярного договора продажи, которые договор выпускает сам. Без поля бумаги выпускают вручную
            - `invoice` 'issue' | 'draft': Счёт на оплату периода: issue — выставить, draft — сохранить черновиком на проверку; пусто — не выставлять
            - `lead_days` integer: За сколько дней до даты платежа выставить счёт; продажа периода заводится тогда же. Только вместе с invoice
            - `closing` 'on_date' | 'period_end': Когда выпустить закрывающую бумагу: on_date — в дату платежа, period_end — последним днём периода, за который платёж; пусто — не выпускать
            - `closing_paper` 'upd' | 'act': Закрывающая бумага: upd — УПД (функцию решает режим НДС юрлица) или act — акт, законный только без НДС. Обязательна вместе с closing
            - `by` integer: Кто включил автоматику бумаг; пишет сервер, присланное не читается
          - `project_id` string, uuid
          - `department_id` string, uuid
          - `cfo_id` string, uuid
        - `shares` DocflowFlowPaymentShare[]: Оплата периода долями: проценты вместе ровно 100. Продажа или закупка периода получает график оплат из долей. Пусто — один платёж периода в дату правила
          - `percent` string, required: Доля суммы периода в процентах десятичным текстом, до двух знаков
          - `day` integer: День периода: число месяца стадии (month, quarter) или день недели ISO 1..7 (week)
          - `after_act_days` integer: Срок через столько дней после акта периода
    - `correction` DocflowFlowCorrection: Содержание УКД по возврату покупателя: строки исходного УПД «до» и остаток «после». Снимается при выпуске и дальше не пересчитывается.
      - `return_id` string, uuid, required
      - `return_number` string
      - `return_date` string, date
      - `basis_id` string, uuid, required
      - `basis_number` string, required
      - `basis_date` string, date, required
      - `lines` DocflowFlowCorrectionLine[], required
        - `id` string, uuid, required
        - `number` integer, required: Номер строки в исходном УПД
        - `product_id` string, uuid
        - `name` string, required
        - `unit` string
        - `unit_code` string: Код единицы по ОКЕИ
        - `vat_rate` string, required
        - `article` string: Ручной артикул строки, перенесённый из строки УПД; пусто — по настройке покупателя
        - `code` string: Ручной код строки, перенесённый из строки УПД
        - `before` DocflowFlowCorrectionState, required
          - `quantity` string, required
          - `price` string: Цена за единицу без налога
          - `amount_without_vat` string, required
          - `vat_amount` string: Пусто у необлагаемой строки
          - `amount_with_vat` string, required
        - `after` DocflowFlowCorrectionState, required
          - `quantity` string, required
          - `price` string: Цена за единицу без налога
          - `amount_without_vat` string, required
          - `vat_amount` string: Пусто у необлагаемой строки
          - `amount_with_vat` string, required
    - `transfer` DocflowFlowAgentTransfer: Передача товара агенту или комиссионеру и возврат от него (ERP-2178): УПД с функцией ДОП и особым обстоятельством СпОбстФДОП. Только у вида upd. Карточку из черновика площадки («Упд по акту приемки» Wildberries) заводит сервер, строки и коды в ней — слово площадки.
      - `case` '00005' | '00006', required: 00005 — передача агенту или комиссионеру, 00006 — возврат от него
      - `platform` string: Площадка, составившая черновик (wildberries); пусто у бумаги, набранной у нас
      - `source_id` string, uuid
      - `source_title` string: Как документ назван у площадки
      - `operation` string: Содержание операции словами черновика
      - `basis` DocflowFlowAgentTransferRef[]
        - `name` string, required
        - `number` string
        - `date` string, date
      - `lines` DocflowFlowAgentTransferLine[]
        - `line_id` string, uuid, required
        - `gtin` string
        - `marks` object[], required
          - `transport_package` string: Код транспортной упаковки (SSCC монопаллеты)
          - `count` string: Количество единиц при передаче по GTIN
          - `codes` string[]
          - `packages` string[]
    - `amendment_purpose` 'terms' | 'deal': Назначение допсоглашения (ERP-2063), только у вида amendment: terms — меняет условия договора (цену, срок, абонентскую плату), deal — оформляет отдельную покупку или продажу по договору и ведёт себя как спецификация: может быть основанием сделки, его условия услуг в договор не идут. Не прислано у ДС — terms; у другого вида — отказ
    - `specification_purpose` 'terms' | 'deal': Назначение спецификации (ERP-2083), только у вида specification: terms — условия или прайс на срок договора (строки условий идут в сделки периодов, своей сделки нет), deal — партия, основание своей сделки. Не прислано — по содержанию: есть строки условий — terms, иначе deal; у другого вида — отказ
    - `recognized` DocflowFlowRecognized: Прочитанное машиной из файла карточки — НА ПРОВЕРКУ. Живёт отдельно от условий договора: в условия сумма и срок попадают только рукой человека. Пустое поле означает «не прочиталось», а не ноль. Приёмка входящего договора в PDF заполняет его текстом бумаги.
      - `source` string: Имя вложения словами оператора: по нему человек откроет ту же бумагу и сверит
      - `amount` string: Десятичная строка
      - `currency` string
      - `valid_from` string, date
      - `valid_until` string, date
    - `custom` object: Значения своих полей кабинета (графы вида docflow.document.<вид>). В save не прислано — не меняются; правятся действием custom
  - `files` DocflowFlowFile[]
    - `id` string, uuid, required
    - `name` string, required
    - `size` integer, required: Байт; не больше 26214400
    - `sha256` string, required
    - `content_type` string, required
    - `uploaded_by` integer, required
    - `uploaded_at` string, date-time, required
    - `scan_status` 'clean' | 'skipped': Вердикт антивируса у файла, пришедшего сессией загрузки; у файла формы поля нет
  - `relations` DocflowFlowRelation[]
    - `id` string, uuid, required
    - `kind` 'basis' | 'attachment' | 'amends' | 'replaces', required
    - `target_id` string, uuid, required
    - `target_version` integer, required: Закреплённая редакция другой бумаги
  - `accounting_links` DocflowFlowAccountingLink[]
    - `id` string, uuid, required
    - `owner` 'finance' | 'stock', required
    - `document_id` string, uuid, required
    - `source_action` string: Команда, породившая связь: create_plan, accept_act и подобные
    - `source_version` integer: Редакция бумаги, закреплённая командой
    - `target_version` integer: Редакция учётного документа, из которой сделана бумага
  - `commercial_tax` DocflowFlowCommercialTaxLine[]: Только в ответе чтения карточки: вычисленные суммы НДС строк из источника печати. В редакцию документа не записываются
    - `line_id` string, uuid, required
    - `rate` string: Ставка для показа; пусто, если политика не дала ставку
    - `amount` string: НДС десятичным текстом; пусто, если налог не определён
  - `edo` DocflowFlowEDOState: Ответ контрагента по документу, как его понимает карточка: подписал, отказал или аннулировали по соглашению сторон. Пересказа состояний оператора здесь нет — регламентов у него десятки, и свой словарь на них отстал бы от первой же правки закона. Живёт в редакции карточки и поэтому попадает в её историю сам.
    - `message` string, uuid, required
    - `outcome` 'signed' | 'refused' | 'cancelled', required: Подписал, отказал (отклонение либо уведомление об уточнении) или аннулирован по соглашению сторон
    - `state_name` string: Состояние словами оператора: показывается как есть, человек сверяет его с кабинетом оператора
    - `occurred_at` string, date-time, required: Когда это случилось у оператора
  - `edo_links` DocflowFlowEDOLink[]: Конверты, которыми карточка уходила и приходила. Заполняется только при чтении карточки и в редакцию не пишется: связь живёт своей строкой, её правит синхронизация, а редакция неизменяема
    - `id` string, uuid, required
    - `connection` string, uuid, required
    - `message` string, uuid
    - `role` 'primary' | 'attachment' | 'basis', required: Чем карточка приходится конверту: основной документ, приложение или основание
    - `file` string, uuid
    - `external_doc_id` string, required: Идентификатор документа у оператора
    - `external_attachment_id` string: Идентификатор вложения у оператора: им адресуется замена файла при повторной отправке
    - `draft` boolean, required: Черновик, который ещё можно удалить у оператора
    - `direction` string, required: Слова оператора о самом пакете, собранные при чтении карточки
    - `number` string, required
    - `date` string, required
    - `state_code` string, required
    - `state_name` string, required
    - `attachments` DocflowFlowEDOAttachment[]: Содержательные файлы конверта, показанные в карточке ссылкой, а не копией: байты лежат в хранилище кабинета один раз. Извещений здесь нет. Заполняется только при чтении одной карточки
      - `id` string, uuid, required
      - `message` string, uuid, required
      - `name` string, required
      - `kind` string, required: document, title либо пусто
      - `content_type` string, required
      - `size_bytes` integer, required
      - `stored` boolean, required: Байты скачаны в наше хранилище; ложь — файл пока живёт только у оператора
    - `created_by` integer, nullable
    - `created_at` string, date-time, required
  - `gaps` string[]: Чего карточке не хватает до полноты: содержательного файла, подтверждённой суммы, срока действия (последний — только у договора и дополнительного соглашения). Считается при чтении одной карточки и в редакцию не пишется. Пустой список у карточки из ЭДО означает, что приёмка зарегистрировала её сразу; непустой — что карточка осталась черновиком и ждёт подтверждения человека.
  - `created_at` string, date-time, required
  - `updated_at` string, date-time, required
  - `updated_by` integer, required

## Other responses

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

---

[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)
