Для 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 — личный ключ
curl https://vibecode.bitrix24.tech/v1/onec/operations/cl9x2k4t70000qz8h3m1vb7ry \
-H "X-Api-Key: YOUR_API_KEY"
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С |
Пример ответа
Чтение выполнено:
{
"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С ещё не взяла операцию в работу:
{
"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С отказала в чтении:
{
"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 — идентификатор неизвестен либо операция создана другим ключом, пользователем или порталом:
{
"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, поэтому промежуточные кэши не отдадут устаревшее состояние операции.
Готовый цикл опроса. Ниже — чтение одной операции до терминального состояния с растущей паузой и разбором всех четырёх исходов.
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)