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
- JSON batch
- Ответ JSON
Лимиты
Лимиты проверяются до выполнения пакета.
Обе настройки находятся на вкладке «Запись». У
multipart/mixed части верхнего уровня считаются до разбора, поэтому пакет с заведомо лишними частями отклоняется сразу.
Частота. Правила частоты профиля считают каждую операцию отдельным запросом. Если лимита не хватает на весь пакет, весь пакет получает 429 с Retry-After. Отклонённый пакет всё равно расходует лимит на все свои операции, поэтому повторяйте его после Retry-After.
Журнал
Журнал запросов пишет самPOST /v4/$batch (статус, общая длительность, число операций) и каждую операцию по обычным правилам уровня журнала. Записи одного пакета объединяет поле Пакет. На уровне «Только запись» пакет из одних чтений не пишется.