Skip to main content
standard.odata не поддерживает $batch (отвечает 501), поэтому поведение здесь задаёт спецификация OData v4 и 4.01.

Адрес и форматы

POST …/v4/$batch работает на обоих сервисах. На odatat токен передаётся в заголовке, в адресе или в пути …/t/<токен>/v4/$batch. Вход выполняется один раз на пакет. Все операции идут от того же субъекта и профиля, тем же порядком, что одиночные запросы. В пакете допустимы:
  • чтение, $count, $metadata, служебный документ;
  • создание, изменение и удаление;
  • наборы движений;
  • Post и Unpost.
Адрес операции может быть относительным к корню сервиса, абсолютным или от корня хоста. Адрес с сегментами . или .. (в том числе закодированными) и абсолютный адрес чужого хоста дают 400 у этой операции.

Наборы изменений

Набор изменений (changeset в multipart, atomicityGroup в JSON) выполняется одной транзакцией 1С, проведение внутри разрешено. Ошибка любой операции откатывает весь набор:
  • в multipart вместо набора приходит один ответ с ошибкой;
  • в JSON ошибку получает операция, на которой всё сорвалось, а остальные операции группы — 424.
GET внутри набора изменений даёт 400 всему пакету ещё до выполнения. Ссылки на созданное. $<Content-ID> объекта, созданного в наборе, подставляется:
  • в начало адреса следующей операции: $1, $1/Post, $1/Товары;
  • в значения …@odata.bind тела: "[email protected]": "$1".
Основа подстановки — заголовок Location ответа 201. Ключ подставляется в кодировке URL, тело — значением JSON, поэтому внедрение в адрес невозможно. Ссылка действует внутри своего набора изменений, а в JSON batch — ещё и на операцию или группу из dependsOn. Иначе ответ — 400.

Ошибки вне наборов

По умолчанию пакет останавливается на первой ошибке: выполненное остаётся, остальные операции не выполняются. С заголовком Prefer: odata.continue-on-error выполняются все операции, у каждой свой ответ, а в ответе есть Preference-Applied: odata.continue-on-error. Асинхронная обработка (Prefer: respond-async) не поддерживается.

Примеры

Создание документа и его проведение одной транзакцией:

Лимиты

Лимиты проверяются до выполнения пакета. Обе настройки находятся на вкладке «Запись». У multipart/mixed части верхнего уровня считаются до разбора, поэтому пакет с заведомо лишними частями отклоняется сразу. Частота. Правила частоты профиля считают каждую операцию отдельным запросом. Если лимита не хватает на весь пакет, весь пакет получает 429 с Retry-After. Отклонённый пакет всё равно расходует лимит на все свои операции, поэтому повторяйте его после Retry-After.

Журнал

Журнал запросов пишет сам POST /v4/$batch (статус, общая длительность, число операций) и каждую операцию по обычным правилам уровня журнала. Записи одного пакета объединяет поле Пакет. На уровне «Только запись» пакет из одних чтений не пишется.
Если запись журнала после выполнения пакета сорвётся из-за сбоя платформы (см. Известные ограничения), клиент получит 500 на весь пакет, хотя операции уже зафиксированы. Чтобы повтор не создавал дубли, передавайте Ref_Key создаваемых объектов с If-None-Match: * или Repeatability-Request-ID в операциях. Результат сверяйте по Content-ID или id операций.