Как составить правильный фильтр запроса в OData?

Как можно сделать запрос, чтобы получить все сущности, у которых значение поля Code находится среди заданных, используя протокол 1С? Можно ли избежать перечисления бесконечного числа операторов "or" и "eq"?
  • 7 февраля 2024 г. 5:08
Ответы на вопрос 2
OData (Open Data Protocol) предлагает различные способы фильтрации данных при запросах. Для фильтрации сущностей по набору значений поля `Code` существуют различные подходы. Однако стоит отметить, что стандартный протокол OData не предусматривает оператор IN, который позволяет проверить наличие значения в списке. Вместо этого приходится использовать комбинации операторов `or` и `eq` для каждого значения из списка.

Но в зависимости от сервера, который реализует OData, могут быть доступны расширения или альтернативные способы для упрощения запросов. Например, в некоторых реализациях OData может поддерживаться функция `any` или `all` в сочетании с лямбда-выражениями для перебора коллекций.

Если вы опираетесь на стандарт OData V4 и у вас не более нескольких значений для фильтрации, вы можете использовать операторы `or` и `eq`:

```http
GET http://serviceRoot/Entities?$filter=Code eq 'value1' or Code eq 'value2' or Code eq 'value3'
```

Если вы работаете с реализацией OData, которая поддерживает функцию `any`, запрос может выглядеть примерно так:

```http
GET http://serviceRoot/Entities?$filter=Items/any(d: d/Code eq 'value1' or d/Code eq 'value2' or d/Code eq 'value3')
```

Здесь `Items` представляет собой коллекцию или навигационное свойство внутри сущности, которое вы фильтруете.

Для систем на базе 1С, таких как 1С:Предприятие предлагающего веб-сервисы OData, рекомендации аналогичны. Однако конкретная реализация может отличаться. Если вам нужно избежать перечисления значений с операторами `or` потому, что их слишком много, вам стоит использовать промежуточный слой (например, кастомный веб-сервис или хранимая процедура), который позволит обработать более сложный запрос на серверной стороне и вернуть нужные данные в формате OData.

Если диапазон значений Code известен заранее и неизменен, вы можете рассмотреть возможность создания предварительно отфильтрованных представлений на серверной стороне и запрашивать их через OData, что сократит сложность запроса.

Во всяком случае для получения наиболее точной информации и рекомендаций лучше обратиться к документации конкретной реализации OData, которую предоставляет ваш сервер 1С, поскольку реализации могут отличаться.
Как понимаю, нельзя. 
Из документации к платформе:
Для доступа к данным используется протокол OData (www.odata.org, на английском языке) версии 3.

Судя по его описанию, там нет оператора in . Он есть в 4-й версии протокола, если верить этому .

Похожие вопросы