---
title: "Получить отчёт по остаткам"
method: GET
path: "/api/v1/stock/report/stocks"
tags: ["Stock reports"]
---

# Получить отчёт по остаткам

`GET /api/v1/stock/report/stocks`

## Request

- Base URL: `https://erp.akeda.ru`
- URL: `https://erp.akeda.ru/api/v1/stock/report/stocks`
- 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

Читается из регистров остатков, резерва и ожидаемого прихода. Разрез —
клетка решётки «форма строки × ось столбцов»: row_axis называет старший
уровень над товаром, column_axis — что стоит в столбцах. mode — алиас
прежних режимов: products, warehouses, companies, matrix. Бизнес не
сворачивается никогда. Юрлица ограничены доступом сотрудника.

## Query parameters

- `on_hand_from` string
- `on_hand_to` string
- `reserved_from` string
- `reserved_to` string
- `available_from` string
- `available_to` string
- `expected_from` string
- `expected_to` string
- `forecast_from` string
- `forecast_to` string
- `minimum_from` string
- `minimum_to` string
- `suggested_from` string
- `suggested_to` string
- `unit_cost_from` string
- `unit_cost_to` string
- `amount_from` string
- `amount_to` string
- `company_id` string, uuid
- `warehouse_id` string, uuid
- `warehouse_ids` string
- `product_id` string, uuid
- `product_ids` string
- `q` string
- `as_of` string, date
- `mode` 'products' | 'warehouses' | 'companies' | 'matrix'
- `row_axis` 'product' | 'warehouse' | 'company' | 'warehouse_company'
- `column_axis` 'metrics' | 'warehouse' | 'company'
- `column_offset` integer
- `column_limit` integer
- `business_id` string, uuid
- `without_company` boolean
- `rollup_zones` boolean
- `below_minimum` boolean
- `with_reserve` boolean
- `include_empty` boolean
- `sort` 'name' | 'on_hand' | 'physical_on_hand' | 'blocked' | 'unavailable' | 'in_transit' | 'reserved' | 'available' | 'expected' | 'forecast' | 'minimum' | 'suggested' | 'unit_cost' | 'amount'
- `direction` 'asc' | 'desc'
- `limit` integer
- `offset` integer
- `blocked_from` string
- `blocked_to` string
- `group_by` 'condition'
- `condition_id` string, uuid
- `physical_on_hand_from` string
- `physical_on_hand_to` string
- `unavailable_from` string
- `unavailable_to` string
- `in_transit_from` string
- `in_transit_to` string

## Headers

- `X-Tenant` string, required

## Response `200`

Страница отчёта по остаткам

- StockReportPage
  - `count` integer, required
  - `limit` integer, required
  - `offset` integer, required
  - `results` StockReportRow[], required: Строки плоской клетки или ячейки сводной клетки в окне столбцов. Пустая страница — пустой массив
    - `scope` string[], 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_code` string, required
    - `warehouse_name` string, required
    - `product_id` string, uuid, required
    - `product_sku` string, required
    - `product_name` string, required
    - `photo_file_id` string, uuid
    - `category_id` string, uuid, required
    - `category_name` string, required
    - `condition_id` string, uuid
    - `condition_name` string
    - `unit` string, required
    - `on_hand` string, required: Decimal string
    - `physical_on_hand` string: Физический остаток без товара в пути; десятичная строка
    - `unavailable` string: Недоступное на физических складах без транзита; десятичная строка
    - `in_transit` string: Товар в пути, отдельно от физического наличия получателя; десятичная строка
    - `reserved_unavailable` string: Пересечение резерва конкретной единицы и недоступного остатка, вычитаемое один раз; десятичная строка
    - `blocked` string: Decimal string. Количество вне доступного остатка: состояния «брак» и «карантин» (ERP-1977) и просроченный товар (ERP-1821)
    - `expired` string: Decimal string. Просроченная часть blocked (ERP-1821): остаток партий, срок годности которых вышел к дате отчёта — as_of, а без него сегодня по календарю кабинета. В день «годен до» товар ещё годен. Товар, уже заблокированный состоянием, сюда не входит
    - `reserved` string, required: Decimal string
    - `available` string, required: Decimal string: on_hand − blocked − reserved
    - `expected` string, required: Decimal string
    - `forecast` string, required: Decimal string
    - `minimum` string, required: Decimal string. В свёрнутых режимах — сумма минимумов разрезов «юрлицо × склад», из которых сложена строка.
    - `suggested` string, required: Decimal string. Только правило пополнения: ноль, пока прогноз не ниже минимума или правила нет, иначе добор до максимума с округлением вверх по кратности. Нехватка считается в разрезе «юрлицо × склад» (со свёрткой зон) против прогноза того же разреза; свёрнутая строка products, companies и matrix складывает нехватки своих разрезов, и остаток без правила, остаток без юрлица и излишек другого разреза её не гасят — итог одинаков во всех режимах. Незаказанная потребность сюда не входит — она есть только в /stock/report/purchasing.
    - `amount` string, required: Decimal string
    - `unit_cost` string, required: Decimal string. Пусто, когда юрлица нет ни в разрезе строки или ячейки, ни в отборе (company_id, without_company) — режимы products и matrix, форма «склад → товар», — и при этом у остатка строки больше одного владельца (юрлица или «без юрлица»): такая строка складывает партии разных владельцев, и среднее по ним не лежит ни на одном складе. Строка одного владельца отдаёт величину и в свёрнутом разрезе. У ячейки со столбцом-юрлицом величина есть. Сортировка по скрытой unit_cost идёт по имени.
    - `entry_count` integer, required
  - `totals` StockReportTotals, required: Итог по всей выборке отчёта, а не по странице. Количества, включая минимум, имеют смысл только при одной единице измерения на всю выборку — её называет поле unit; без общей единицы количества приходят пустой строкой, а сумма денег — числом. Себестоимости единицы здесь нет вовсе: сумма средних цен не значит ничего ни при какой однородности.
    - `on_hand` string, required: Decimal string
    - `physical_on_hand` string: Физический остаток без товара в пути; десятичная строка
    - `unavailable` string: Недоступное на физических складах без транзита; десятичная строка
    - `in_transit` string: Товар в пути, отдельно от физического наличия получателя; десятичная строка
    - `reserved_unavailable` string: Пересечение резерва конкретной единицы и недоступного остатка, вычитаемое один раз; десятичная строка
    - `blocked` string: Decimal string. Заблокировано: брак, карантин и другие состояния вне доступного (ERP-1977), а также просроченный товар (ERP-1821)
    - `expired` string: Decimal string. Просроченная часть blocked по всей выборке (ERP-1821)
    - `reserved` string, required: Decimal string
    - `available` string, required: Decimal string
    - `expected` string, required: Decimal string
    - `forecast` string, required: Decimal string
    - `minimum` string, required: Decimal string
    - `suggested` string, required: Decimal string
    - `amount` string, required: Decimal string. Деньги аддитивны всегда и от единицы измерения не зависят
    - `unit` string, required: Единица измерения итога, если она одна на всю выборку. Пусто, когда единицы разные: складывать штуки с килограммами нельзя, количества итога тогда пусты, и потребитель показывает прочерк вместо суммы — или разложение by_unit.
    - `by_unit` StockReportUnitTotal[]: Тот же итог, разложенный по единицам измерения, — только когда их в выборке несколько (иначе поля нет). Считается сервером по всей выборке тем же отбором и в том же запросе, что и итог: сумма строк страницы выдала бы за итог её часть. Денег здесь нет — они аддитивны и лежат в amount целиком.
      - `unit` string, required
      - `on_hand` string, required: Decimal string
      - `physical_on_hand` string: Физический остаток без товара в пути; десятичная строка
      - `unavailable` string: Недоступное на физических складах без транзита; десятичная строка
      - `in_transit` string: Товар в пути, отдельно от физического наличия получателя; десятичная строка
      - `reserved_unavailable` string: Пересечение резерва конкретной единицы и недоступного остатка, вычитаемое один раз; десятичная строка
      - `blocked` string, required: Decimal string
      - `expired` string: Decimal string. Просроченная часть blocked этой единицы (ERP-1821)
      - `reserved` string, required: Decimal string
      - `available` string, required: Decimal string
      - `expected` string, required: Decimal string
      - `forecast` string, required: Decimal string
      - `minimum` string, required: Decimal string
      - `suggested` string, required: Decimal string
  - `warehouse_totals` StockReportWarehouseTotal[], required: Суммы по складам всей выборки, без постраничного окна. Питают дерево складов; столбцы сводной из них не берутся
    - `warehouse_id` string, uuid, required
    - `on_hand` string, required: Decimal string
    - `amount` string, required: Decimal string
  - `formula` 'available = on_hand - reserved; forecast = available + expected', required
  - `row_axis` 'product' | 'warehouse' | 'company' | 'warehouse_company', required: Форма строки ответа в каноническом виде — и когда разрез спрошен режимом
  - `column_axis` 'metrics' | 'warehouse' | 'company', required: Ось столбцов ответа в каноническом виде
  - `rows` StockReportRow[]: Только у сводной клетки: строки страницы. Строка, у которой в текущем окне нет ячеек, без этого списка пропала бы из ответа, хотя count её считает
    - `scope` string[], 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_code` string, required
    - `warehouse_name` string, required
    - `product_id` string, uuid, required
    - `product_sku` string, required
    - `product_name` string, required
    - `photo_file_id` string, uuid
    - `category_id` string, uuid, required
    - `category_name` string, required
    - `condition_id` string, uuid
    - `condition_name` string
    - `unit` string, required
    - `on_hand` string, required: Decimal string
    - `physical_on_hand` string: Физический остаток без товара в пути; десятичная строка
    - `unavailable` string: Недоступное на физических складах без транзита; десятичная строка
    - `in_transit` string: Товар в пути, отдельно от физического наличия получателя; десятичная строка
    - `reserved_unavailable` string: Пересечение резерва конкретной единицы и недоступного остатка, вычитаемое один раз; десятичная строка
    - `blocked` string: Decimal string. Количество вне доступного остатка: состояния «брак» и «карантин» (ERP-1977) и просроченный товар (ERP-1821)
    - `expired` string: Decimal string. Просроченная часть blocked (ERP-1821): остаток партий, срок годности которых вышел к дате отчёта — as_of, а без него сегодня по календарю кабинета. В день «годен до» товар ещё годен. Товар, уже заблокированный состоянием, сюда не входит
    - `reserved` string, required: Decimal string
    - `available` string, required: Decimal string: on_hand − blocked − reserved
    - `expected` string, required: Decimal string
    - `forecast` string, required: Decimal string
    - `minimum` string, required: Decimal string. В свёрнутых режимах — сумма минимумов разрезов «юрлицо × склад», из которых сложена строка.
    - `suggested` string, required: Decimal string. Только правило пополнения: ноль, пока прогноз не ниже минимума или правила нет, иначе добор до максимума с округлением вверх по кратности. Нехватка считается в разрезе «юрлицо × склад» (со свёрткой зон) против прогноза того же разреза; свёрнутая строка products, companies и matrix складывает нехватки своих разрезов, и остаток без правила, остаток без юрлица и излишек другого разреза её не гасят — итог одинаков во всех режимах. Незаказанная потребность сюда не входит — она есть только в /stock/report/purchasing.
    - `amount` string, required: Decimal string
    - `unit_cost` string, required: Decimal string. Пусто, когда юрлица нет ни в разрезе строки или ячейки, ни в отборе (company_id, without_company) — режимы products и matrix, форма «склад → товар», — и при этом у остатка строки больше одного владельца (юрлица или «без юрлица»): такая строка складывает партии разных владельцев, и среднее по ним не лежит ни на одном складе. Строка одного владельца отдаёт величину и в свёрнутом разрезе. У ячейки со столбцом-юрлицом величина есть. Сортировка по скрытой unit_cost идёт по имени.
    - `entry_count` integer, required
  - `columns` StockReportColumn[]: Только у сводной клетки: окно столбцов в порядке сервера. Столбцы — ключи ячеек всех отобранных строк, а не строк страницы
    - `kind` 'warehouse' | 'company', required
    - `id` string, uuid, required
    - `business_id` string, uuid, required
    - `business_name` string, required
    - `parent_id` string, uuid, required
    - `parent_name` string, required
    - `code` string, required
    - `name` string, required
    - `totals` StockReportTotals, required: Итог по всей выборке отчёта, а не по странице. Количества, включая минимум, имеют смысл только при одной единице измерения на всю выборку — её называет поле unit; без общей единицы количества приходят пустой строкой, а сумма денег — числом. Себестоимости единицы здесь нет вовсе: сумма средних цен не значит ничего ни при какой однородности.
      - `on_hand` string, required: Decimal string
      - `physical_on_hand` string: Физический остаток без товара в пути; десятичная строка
      - `unavailable` string: Недоступное на физических складах без транзита; десятичная строка
      - `in_transit` string: Товар в пути, отдельно от физического наличия получателя; десятичная строка
      - `reserved_unavailable` string: Пересечение резерва конкретной единицы и недоступного остатка, вычитаемое один раз; десятичная строка
      - `blocked` string: Decimal string. Заблокировано: брак, карантин и другие состояния вне доступного (ERP-1977), а также просроченный товар (ERP-1821)
      - `expired` string: Decimal string. Просроченная часть blocked по всей выборке (ERP-1821)
      - `reserved` string, required: Decimal string
      - `available` string, required: Decimal string
      - `expected` string, required: Decimal string
      - `forecast` string, required: Decimal string
      - `minimum` string, required: Decimal string
      - `suggested` string, required: Decimal string
      - `amount` string, required: Decimal string. Деньги аддитивны всегда и от единицы измерения не зависят
      - `unit` string, required: Единица измерения итога, если она одна на всю выборку. Пусто, когда единицы разные: складывать штуки с килограммами нельзя, количества итога тогда пусты, и потребитель показывает прочерк вместо суммы — или разложение by_unit.
      - `by_unit` StockReportUnitTotal[]: Тот же итог, разложенный по единицам измерения, — только когда их в выборке несколько (иначе поля нет). Считается сервером по всей выборке тем же отбором и в том же запросе, что и итог: сумма строк страницы выдала бы за итог её часть. Денег здесь нет — они аддитивны и лежат в amount целиком.
        - `unit` string, required
        - `on_hand` string, required: Decimal string
        - `physical_on_hand` string: Физический остаток без товара в пути; десятичная строка
        - `unavailable` string: Недоступное на физических складах без транзита; десятичная строка
        - `in_transit` string: Товар в пути, отдельно от физического наличия получателя; десятичная строка
        - `reserved_unavailable` string: Пересечение резерва конкретной единицы и недоступного остатка, вычитаемое один раз; десятичная строка
        - `blocked` string, required: Decimal string
        - `expired` string: Decimal string. Просроченная часть blocked этой единицы (ERP-1821)
        - `reserved` string, required: Decimal string
        - `available` string, required: Decimal string
        - `expected` string, required: Decimal string
        - `forecast` string, required: Decimal string
        - `minimum` string, required: Decimal string
        - `suggested` string, required: Decimal string
  - `columns_count` integer: Только у сводной клетки: число столбцов всей выборки
  - `column_offset` integer
  - `column_limit` integer

## Other responses

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

---

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