> ## Documentation Index
> Fetch the complete documentation index at: https://docs.1unic.com/odatav4/llms.txt
> Use this file to discover all available pages before exploring further.

# Отличия от standard.odata

> Где OData4 сознательно ведёт себя иначе, чем стандартный интерфейс OData платформы, и почему.

OData4 повторяет имена наборов, свойств и навигаций `standard.odata`, поэтому клиенты переходят на него, меняя только
адрес. Поведение отличается в двух случаях:

* `standard.odata` расходится со спецификацией OData;
* поведение `standard.odata` опасно или неудобно.

Ниже собраны все такие случаи.

## Протокол

| Что | `standard.odata` | OData4 |
| - | - | - |
| Версия протокола | OData v3 | OData v4 (`$metadata` в CSDL XML 4.0 и CSDL JSON) |
| Синтаксис v3 | — | Принимается: `substringof`, `datetime'…'`, `guid'…'`, `$inlinecount=allpages`, суффиксы чисел `M L D F` и т. д. |
| Выдача коллекций | Всё одним ответом | Страницами по 1000 строк с `@odata.nextLink`; одним ответом — по [настройке](/odatav4/admin/performance) |
| `$batch` | `501` | Поддерживается: `multipart/mixed` и JSON batch ([\$batch](/odatav4/write/batch)) |
| `ETag`, `If-Match`, `If-None-Match` | Нет | Действуют: `W/"<DataVersion>"`, при устаревшей версии — `412` |
| `Prefer: return=minimal` | Не учитывается | Ответ `204` с `Preference-Applied` |
| Знак `+` в адресе вне литерала | Считается арифметическим плюсом, ошибка СУБД | `400` с позицией символа. Пробел кодируется как `%20`, сам плюс — как `%2B` |
| Ответ `500` | Текст исключения платформы | Постоянный текст; подробности — в журнале регистрации |

## Чтение

| Что | `standard.odata` | OData4 |
| - | - | - |
| `substring` | Считает позиции с 1 | С 0, как в OData |
| `all` по пустой табличной части | Ложь | Истина, как в OData |
| Приоритет `not` | Слабее `eq` | Сильнее `eq`, как в OData: `not (A eq B)` пишется со скобками |
| `$orderby` по ссылке | По представлению | По самой ссылке: порядок однозначен, и продолжение по `$skiptoken` не теряет строк. По наименованию — `$orderby=Контрагент/Description` |
| `Periodicity` в `Turnovers` и `BalanceAndTurnovers` | Нет | Есть: `Day`, `Month`, `Quarter`, `Recorder` и др. ([Регистры](/odatav4/read/registers)) |
| Вызов виртуальной таблицы | `Набор/SliceLast(…)` | И так, и в форме OData 4.0 `Набор/StandardODATA.SliceLast(…)` |
| `$apply` | Нет | `filter`, `groupby`, `aggregate`, `compute`, `topcount`, `bottomcount` и цепочки ([\$apply](/odatav4/read/apply)) |
| `$metadata` в JSON | Нет | `$format=json` или `Accept: application/json` |
| Строки регистров бухгалтерии | Без субконто | По настройке «Субконто в строках регистров бухгалтерии» — с `ExtDimensionDr1…N` / `ExtDimensionCr1…N` |
| Пустые даты | `0001-01-01T00:00:00` | `null` в режиме дат «Строгий» (по умолчанию); как у `standard.odata` — в режиме «Совместимый» ([Настройки](/odatav4/admin/settings#режим-дат)) |

## Запись

| Что | `standard.odata` | OData4 |
| - | - | - |
| `DELETE` | Удаляет объект | Ставит пометку удаления; физическое удаление — по [настройке](/odatav4/write/basics) и правам профиля |
| Проверка заполнения | Нет | `ПроверитьЗаполнение()` перед записью и проведением (отключается настройкой) |
| `POST` записи регистра сведений | `200` | `201` |
| Действия `Post` / `Unpost` | `200` с пустым телом | `204` с `ETag` |
| `GET …/Post()` | Проводит документ | `405`: действия выполняются только методом `POST` |
| `…/StandardODATA.Post` | `400` | Принимается; параметр действия можно передать и в теле |
| `Post` непроводимого документа | — | `400` |
| Испорченный JSON | `200` без изменений | `400` |
| `PredefinedDataName` в теле | `400` | Пропускается, как другие поля только для чтения |
| Строки табличной части без `LineNumber` | `500` | Принимаются |
| Дубль ключа | `500` | `409` |
| Ключ записи регистра в теле `PATCH`/`PUT` | — | `400` |
| Ошибки проведения и записи | `500` | `400` с сообщениями пользователю в `error.details` |
| Константа без ключа в адресе | `405` | Записывается |
| Набор движений: `POST`, когда набор уже есть | `400` | `409` |
| Набор движений: `PUT` | `405` | Замена набора целиком, как требует OData v4 |
| Аннотация `RecordSet@odata.type` | Обязательна | Не нужна |
| Режим дат «Совместимый» при записи | — | Явное смещение `±чч:мм` переводится в местное время базы, `Z` — нет (чтение в этом режиме выдаёт местное время с `Z`) |

<Note>
  Неизвестные свойства в теле по умолчанию пропускаются, как у `standard.odata`. Строгое поведение OData v4 (`400` с
  именем свойства) включается настройкой «Отвергать неизвестные свойства».
</Note>

## Совпадает с standard.odata

Чтобы было понятно, что **не** изменилось:

* имена наборов (`Catalog_X`, `Document_X`, `InformationRegister_X`, `AccumulationRegister_X_RecordType` и т. д.),
  свойств (`Ref_Key`, `Description`, `Контрагент_Key`), навигаций и ключей;
* состав публикации по умолчанию — «Состав стандартного интерфейса OData»;
* права и RLS пользователя 1С;
* регистр без ключевых полей получает ключ `SurrogateKey`;
* набор движений пишется только целиком через сущность регистратора;
* строки `…_RecordType` только для чтения.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.