---
title: "Записать пачку записей в собственный справочник приложения"
method: PUT
path: "/api/v1/app/reference/{key}/items"
tags: ["App runtime"]
---

# Записать пачку записей в собственный справочник приложения

`PUT /api/v1/app/reference/{key}/items`

## Request

- Base URL: `https://erp.akeda.ru`
- URL: `https://erp.akeda.ru/api/v1/app/reference/{key}/items`
- Auth: HTTP bearer

Приложение наполняет справочник, который само же объявило манифестом. До этой операции наполнить его было нечем: публичный слой только читает, а конструктор кабинета закрыт правом `core:write` — то есть правом на ВСЕ справочники кабинета, включая контрагентов и статьи.

ИДЕМПОТЕНТНО ПО КОДУ. Присланный второй раз код обновляет ту же запись, а не заводит вторую: код — это и есть ссылка на запись в смысле SDK, и прогон, повторённый после обрыва связи, обязан оставить справочник в том же состоянии.

ОБНОВЛЕНИЕ ЧАСТИЧНОЕ ПО СОСТАВУ: записи, которой нет в пачке, операция не касается. Полной замены списка здесь нет намеренно — на записи ссылаются документы кабинета, и «прислал десять вместо тысячи» стёрло бы девятьсот девяносто ссылок молча. Убрать значение из списка — отдельная операция, и она гасит запись, а не стирает.

Потолок пачки — 500 записей: у операции обязан быть объявленный предел, иначе контракт разрешает прислать миллион строк одним запросом.

PUT, а не POST, ровно потому, что повтор ничего не меняет. Изменение уезжает подписчикам событием `core.reference.item.changed.v1` той же транзакцией, что и сама запись.

## Path parameters

- `key` string, required

## Headers

- `X-Tenant` string, required

## Request body

- AppReferenceUpsertInput
  - `items` AppReferenceUpsertItem[], required
    - `code` string, required: Ключ идемпотентности: тот же код обновляет ту же запись
    - `label` string: Подпись для человека кабинета. Пустая заменяется кодом: строка без подписи в отчёте нечитаема
    - `parent_id` string, uuid
    - `attrs` object
    - `sort_order` integer
    - `is_active` boolean: Пропущенное поле значит «запись жива»: молча гасить присланное было бы ловушкой

## Response `200`

Сколько записей заведено и сколько обновлено

- AppReferenceUpsertResult
  - `created` integer, required: Сколько записей заведено впервые
  - `updated` integer, 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/3c60ded179f2?raw)
