---
title: "Построить отчёт о прибылях и убытках"
method: GET
path: "/api/v1/finance/reports/pnl"
tags: ["Finance reports"]
---

# Построить отчёт о прибылях и убытках

`GET /api/v1/finance/reports/pnl`

## Request

- Base URL: `https://erp.akeda.ru`
- URL: `https://erp.akeda.ru/api/v1/finance/reports/pnl`
- 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

ОПиУ читает начисления, а не банковские операции; layout выбирает форму отчёта.

## Query parameters

- `business` string, uuid
- `from` string, date
- `to` string, date
- `layout` string, uuid
- `company` string
- `project` string
- `step` 'month' | 'quarter' | 'total'
- `view` 'full' | 'summary'
- `columns` string
- `parent` string

## Headers

- `X-Tenant` string, required

## Response `200`

ОПиУ за период и колонки по выбранному шагу

- FinancePnlReport
  - `unassigned_company` object: При отборе по юрлицу — результат движений без юрлица и всего бизнеса
    - `profit` string
    - `business_profit` string
  - `rnp_metrics` object: Показатели из системных ролей макета; revenue — строка «Выручка» макета, а без неё — revenue отчёта
  - `currency` string
  - `view` 'summary': Есть только в сводном виде
  - `from` string, date, required
  - `to` string, date, required
  - `revenue` string, required: Сумма положительных оборотов статей на счетах результата: выручка, прочие доходы, положительная курсовая; не строка «Выручка» макета
  - `expense` string, required: Сумма отрицательных оборотов статей и налогов раздела «Налоги»
  - `profit` string, required: revenue + expense — прибыль по книге и управленческим суммам вне книги
  - `unclassified_in` string, required
  - `unclassified_out` string, required
  - `lines` FinancePnlLine[], required
    - `id` string, required
    - `name` string, required
    - `sign` -1 | 1, required
    - `amount` string, required
    - `outside_pnl` boolean: Статья вне дерева ОПиУ, по которой обороты всё же легли на счета результата: в итог входит, строкой макета быть не может
  - `taxes` FinanceTaxKindAmount[]: Налоги раздела «Налоги» по видам — строка ОПиУ «Налоги»
    - `kind` string, required: Код вида налога
    - `amount` string, required: Сумма
    - `name` string: Название вида налога в кабинете
  - `taxes_total` string: Итог строки «Налоги»; входит в расходы и прибыль
  - `taxes_not_allocated` boolean: Отбор по проекту или разрезу учёта — налоги начислены на юрлицо и на этот разрез не распределяются
  - `layout_rows` FinancePnlReportRow[]
    - `id` string, required
    - `kind` string, required
    - `name` string, required
    - `level` integer, required
    - `collapsed` boolean, required
    - `has_children` boolean, required
    - `amount` string
    - `format` string, required
    - `system_row` string
    - `problem` string
    - `tax_kind` string: Вид налога у строки вида налога и у подстроки «Налогов»
    - `item_is_active` boolean: Только у строки со статьёй: false — статья отключена. Пустая строка отключённой статьи в отчёт не попадает; строка с движениями остаётся с пометкой «статья отключена»
    - `item_id` string, uuid: Статья строки-статьи (ERP-2164): по ней открывают расшифровку ячейки — у своего макета ID строки и статьи разные
  - `layout` FinancePnlReportLayout
    - `id` string, uuid, required
    - `name` string, required
    - `is_default` boolean, required
    - `coverage` FinancePnlCoverage, required
      - `missing` FinancePnlCoverageItem[], required
        - `id` string, uuid, required
        - `name` string, required
        - `path` string, required
        - `times` integer
        - `amount` string: Оборот статьи за период — у статьи вне ОПиУ
      - `duplicated` FinancePnlCoverageItem[], required
        - `id` string, uuid, required
        - `name` string, required
        - `path` string, required
        - `times` integer
        - `amount` string: Оборот статьи за период — у статьи вне ОПиУ
      - `foreign` FinancePnlCoverageItem[], nullable: Строки макета, ссылающиеся на статьи вне ОПиУ
        - `id` string, uuid, required
        - `name` string, required
        - `path` string, required
        - `times` integer
        - `amount` string: Оборот статьи за период — у статьи вне ОПиУ
      - `outside` FinancePnlCoverageItem[], nullable: Статьи вне ОПиУ с оборотом за период: итог отчёта их включает, строки макета — нет
        - `id` string, uuid, required
        - `name` string, required
        - `path` string, required
        - `times` integer
        - `amount` string: Оборот статьи за период — у статьи вне ОПиУ
      - `taxes` string: Налоги раздела «Налоги» за период без строки-источника «Налоги» в макете; итог и прибыль их включают
    - `system_rows` object, required
    - `reconcile` object: Сверка итога макета («Чистая прибыль») с прибылью книги
      - `available` boolean, required: В макете есть строка «Чистая прибыль»
      - `ledger_profit` string, required
      - `layout_profit` string, required
      - `mismatch` string, required: Прибыль книги минус итог макета
      - `outside_items` string[], required: Статьи с оборотом вне формулы макета: непокрытые и вне ОПиУ
      - `duplicated_items` string[], required: Статьи, посчитанные макетом дважды
  - `columns` FinanceReportColumn[], required
    - `key` string, required
    - `label` string, required
    - `from` string, date, required
    - `to` string, date, required
    - `total` boolean, required
    - `payload` object: Витрина колонки целиком; только в полном виде
    - `figures` object: Ключевые цифры колонки; только в сводном виде
    - `system_rows` object: Суммы системных строк макета за колонку; в сводном виде, когда отчёт строится по макету
  - `companies` FinanceReportCompany[]
    - `id` string, required
    - `name` string, required
  - `accounting_basis` 'cash' | 'accrual' | 'mixed': Основание, на котором сведён отчёт: метод учёта бизнесов его разреза. cash — выручку признают деньги, accrual — выручку создаёт сделка, mixed — в разрез попали оба основания (разные бизнесы либо период, пересекающий дату перехода). Поля нет, когда подписывать нечем: бизнесов в разрезе не нашлось. Кассовые ОПиУ и баланс правдивы, но отвечают не на тот вопрос, что отчёты по начислению, и обязаны быть отличимы по подписи, а не по догадке читателя.

## Other responses

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

---

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