Для AI-агентов: markdown этой страницы — /docs-content/onec/operation.md индекс документации — /llms.txt

Получить результат операции 1С

GET /v1/onec/operations/{operationId}

Отдаёт состояние операции, поставленной этим же ключом, и её результат, когда 1С прислала данные. Пока чтение идёт, ответ несёт только состояние.

Операции других ключей, пользователей и порталов отвечают так же, как неизвестный идентификатор. Скоуп vibe:onec этот вызов не проверяет: операцию читает тот же личный ключ, которым она поставлена.

Параметры

Параметр Тип Обяз. Описание
ПараметрoperationId (path) Типstring Обяз.да ОписаниеИдентификатор из ответа POST /v1/onec/tools/{method}/call — поле data.operationId, а заголовок Location — путь чтения этой операции, идентификатор стоит его последним сегментом
ПараметрinstanceId (query) Типstring Обяз.нет ОписаниеИдентификатор базы 1С в формате UUID из GET /v1/onec/instances. Передан — операция отдаётся, только если поставлена в эту базу. Не передан — операция находится по одному operationId при любом числе баз

Примеры

curl — личный ключ

Terminal
curl https://vibecode.bitrix24.tech/v1/onec/operations/cl9x2k4t70000qz8h3m1vb7ry \
  -H "X-Api-Key: YOUR_API_KEY"

JavaScript — личный ключ

javascript
const operationId = 'cl9x2k4t70000qz8h3m1vb7ry'

const res = await fetch(`https://vibecode.bitrix24.tech/v1/onec/operations/${operationId}`, {
  headers: { 'X-Api-Key': 'YOUR_API_KEY' },
})

const { data } = await res.json()
console.log(data.status, data.result?.rows?.length)

Поля ответа

Поле Тип Описание
Полеsuccess Типboolean ОписаниеВсегда true при успехе
Полеdata.operationId Типstring ОписаниеИдентификатор операции
Полеdata.type Типstring ОписаниеВид операции. Для чтения данных — getData
Полеdata.status Типstring Описаниеpending, running, succeeded, failed, cancelled или expired
Полеdata.createdAt Типstring ОписаниеКогда операция создана, ISO 8601
Полеdata.finishedAt Типstring | null ОписаниеКогда операция завершилась, ISO 8601. null, пока она не в терминальном состоянии
Полеdata.expiresAt Типstring ОписаниеДо какого момента операция ждёт выполнения, ISO 8601
Полеdata.result Типobject ОписаниеДанные из 1С. Приходит только при status: "succeeded"
Полеdata.result.columns Типarray ОписаниеИмена колонок в порядке, в котором их вернула 1С
Полеdata.result.rows Типarray ОписаниеСтроки выборки, объект на строку с колонками в ключах
Полеdata.result.truncated Типboolean ОписаниеСтраница заполнена до limit либо 1С сообщила, что за ней есть ещё строки. Когда строки кончаются ровно на limit, следующая страница приходит пустой
Полеdata.result.nextOffset Типinteger | null ОписаниеПозиция для следующего вызова при truncated: true, иначе null
Полеdata.result.total Типinteger ОписаниеВсего строк под фильтром. Приходит, когда 1С отдала это число
Полеdata.error Типobject ОписаниеОтказ. Приходит только при status: "failed"
Полеdata.error.code Типstring ОписаниеКод отказа. От 1С: METHOD_NOT_FOUND, USER_NOT_FOUND, USER_DISABLED, USER_CONTEXT_UNAVAILABLE, ACCESS_DENIED, INVALID_FILTER, UNKNOWN_FILTER, TIMEOUT, INTERNAL. От платформы в режиме HTTP: ONEC_HTTP_REJECTED — HTTP-сервис 1С отклонил команду, ONEC_INVALID_INLINE_RESULT — 1С вернула некорректный результат или результат больше 4 МБ
Полеdata.error.message Типstring ОписаниеТекст отказа от 1С

Пример ответа

Чтение выполнено:

JSON
{
  "success": true,
  "data": {
    "operationId": "cl9x2k4t70000qz8h3m1vb7ry",
    "type": "getData",
    "status": "succeeded",
    "createdAt": "2026-09-14T12:00:00.000Z",
    "finishedAt": "2026-09-14T12:00:04.000Z",
    "expiresAt": "2026-09-14T12:15:00.000Z",
    "result": {
      "columns": ["Код"],
      "rows": [{ "Код": "000012" }],
      "truncated": false,
      "nextOffset": null
    }
  }
}

1С ещё не взяла операцию в работу:

JSON
{
  "success": true,
  "data": {
    "operationId": "cl9x2k4t70000qz8h3m1vb7ry",
    "type": "getData",
    "status": "pending",
    "createdAt": "2026-09-14T12:00:00.000Z",
    "finishedAt": null,
    "expiresAt": "2026-09-14T12:15:00.000Z"
  }
}

1С отказала в чтении:

JSON
{
  "success": true,
  "data": {
    "operationId": "cl9x2k4t70000qz8h3m1vb7ry",
    "type": "getData",
    "status": "failed",
    "createdAt": "2026-09-14T12:00:00.000Z",
    "finishedAt": "2026-09-14T12:00:03.000Z",
    "expiresAt": "2026-09-14T12:15:00.000Z",
    "error": {
      "code": "ACCESS_DENIED",
      "message": "Нет прав"
    }
  }
}

Пример ответа при ошибке

404 — идентификатор неизвестен либо операция создана другим ключом, пользователем или порталом:

JSON
{
  "success": false,
  "error": {
    "code": "ONEC_OPERATION_NOT_FOUND",
    "message": "Operation not found."
  }
}

Ошибки

HTTP Код Описание
HTTP404 КодONEC_OPERATION_NOT_FOUND ОписаниеОперации с таким идентификатором нет, либо она создана другим ключом, пользователем или порталом
HTTP404 КодONEC_OPERATION_NOT_FOUND ОписаниеС завершения операции прошло больше 30 дней — её сведения удалены
HTTP404 КодONEC_OPERATION_NOT_FOUND ОписаниеВызов ключом авторизации vibe_app_…: такой ключ операций 1С не создаёт, а чужие операции не видны
HTTP404 КодONEC_OPERATION_NOT_FOUND ОписаниеИдентификатор не той формы — от 20 до 40 строчных латинских букв и цифр
HTTP404 КодONEC_OPERATION_NOT_FOUND ОписаниеПередан instanceId, а операция поставлена в другую базу 1С, либо базы с таким instanceId на портале нет, она отключена, её ключ подключения перевыпущен и модуль Вайбкод ещё не подключился с новым ключом, или значение не в формате UUID
HTTP404 КодROUTE_NOT_FOUND ОписаниеИнтеграция 1С на портале недоступна — ответ совпадает с ответом на неизвестный путь
HTTP410 КодONEC_OPERATION_GONE ОписаниеРезультат уже не хранится: с момента завершения прошло больше суток
HTTP401 КодMISSING_API_KEY ОписаниеНе передан заголовок X-Api-Key
HTTP429 КодRATE_LIMITED ОписаниеПревышен лимит запросов — повторите после времени из заголовка Retry-After
HTTP503 Кодuser_self_deletion_pending ОписаниеВладелец ключа удаляет свою учётную запись на портале. Заголовок Retry-After равен 604800 — столько длится отсрочка удаления

Полный список общих ошибок API — Ошибки.

Известные особенности

Терминальных состояний четыре, и клиент обязан разобрать все. succeeded несёт result, failed несёт error, а cancelled и expired не несут ни того, ни другого: первое означает, что операцию снял портал — отключение 1С, смена настроек или потеря доступа к учётной записи, второе — что 1С не прислала данные до expiresAt.

Статус expired вычисляется на чтении. Операция, которая осталась незавершённой и перешагнула expiresAt, читается как expired, даже если в этот момент её состояние в очереди ещё не обновилось.

Результат не переживает сутки. Данные, которые нужны дольше, сохраняйте у себя при первом успешном чтении.

Интервал опроса считается от лимита. На чтение операций отведено 120 запросов в минуту, поэтому опрос раз в секунду в одном потоке укладывается в лимит. Действующее для ключа значение приходит в заголовке ответа x-ratelimit-limit. Общие правила — Лимиты и оптимизация.

Ответ не кэшируется. Каждый ответ приходит с Cache-Control: no-store, поэтому промежуточные кэши не отдадут устаревшее состояние операции.

Готовый цикл опроса. Ниже — чтение одной операции до терминального состояния с растущей паузой и разбором всех четырёх исходов.

javascript
const BASE = 'https://vibecode.bitrix24.tech/v1'
const headers = { 'X-Api-Key': 'YOUR_API_KEY' }

async function waitForOperation(operationId, { firstDelayMs = 1000, maxDelayMs = 5000 } = {}) {
  let delay = firstDelayMs

  for (;;) {
    const res = await fetch(`${BASE}/onec/operations/${operationId}`, { headers })

    if (res.status === 410) {
      throw new Error('Результат операции больше не хранится')
    }
    if (res.status === 429) {
      const retryAfter = Number(res.headers.get('Retry-After') ?? 5)
      await new Promise((resolve) => setTimeout(resolve, retryAfter * 1000))
      continue
    }
    if (!res.ok) {
      const { error } = await res.json()
      throw new Error(`${res.status} ${error.code}`)
    }

    const { data } = await res.json()

    if (data.status === 'succeeded') return data.result
    if (data.status === 'failed') throw new Error(`1С отказала: ${data.error.code}`)
    if (data.status === 'cancelled') throw new Error('Операцию снял портал')
    if (data.status === 'expired') throw new Error('1С не прислала данные до expiresAt')

    await new Promise((resolve) => setTimeout(resolve, delay))
    delay = Math.min(delay * 2, maxDelayMs)
  }
}

const result = await waitForOperation('cl9x2k4t70000qz8h3m1vb7ry')
console.log(result.columns, result.rows.length, result.nextOffset)

Смотрите также