Назад

Интерфейс OData: правила формирования условия отбора

В данном разделе приводится информация по различным способам формирования отбора получаемых данных, используемых в стандартном интерфейсе OData системы «1С:Предприятие».

Интерфейс OData: правила формирования условия отбора

Общая информация

В данном разделе приводится информация по различным способам формирования отбора получаемых данных, используемых в стандартном интерфейсе OData системы «1С:Предприятие».

Описание возможностей отбора в протоколе OData можно получить в документации по протоколу (на английском языке):

  • http://www.odata.org/documentation/odata-version-3-0/odata-version-3-0-core-protocol/ раздел 10.2.3.1;
  • http://www.odata.org/documentation/odata-version-3-0/odata-version-3-0-core-protocol/ раздел 5.1.2.

$filter

При получении данных можно фильтровать данные. Для этого предназначен специальный язык, который позволяет описывать условия, каким должны соответствовать данные, которые возвращает стандартный интерфейс OData. Описание отбора начинается с ключевого слова $filter, после которого следует собственно условие. Поддерживаются следующие операции:

  • Логические операции:
Описание Имя Пример

Равно

Не равно

Больше

Больше или равно

Меньше

Меньше или равно

Логическое Или

Логическое И

Отрицание

  • Арифметические операции:
Описание Имя Пример

Сложение

Вычитание

Умножение

Деление

  • Группирующие операторы:
Описание Имя Пример

Приоритет операции

Пример отбора:

https:/host/base/zone/odata/standard.odata/Catalog_Товары?$filter=Имя eq 'Молоко' and Цена lt 2500

При формировании условия отбора следует учитывать приоритет операций. В следующей таблице представлен список операций языка выражений отбора в порядке уменьшения приоритета. Операции с одинаковым приоритетом вычисляются слева направо:

Оператор Описание

Повышение приоритета операции

Навигация

Арифметическое отрицание

Логическое отрицание

Умножение

Деление

Сложение

Вычитание

Больше

Больше или равно

Меньше

Меньше или равно

Равно

Не равно

Логическое «И»

Логическое «ИЛИ»

При формировании условий запроса (параметр filter) или формировании реквизита, по которому выполняется упорядочивание (параметр orderby) могут применяться следующие функции:

  • Строковые функции:
Функция Описание Пример

Возвращает true в том случае, если Str1 является подстрокой Str2.

Возвращает true в том случае, если Str1 заканчивается на Str2.

Возвращает true в том случае, если Str1 начинается на Str2.

Возвращает подстроку из Str1. В варианте с двумя параметрами возвращается строка с позиции Int и до конца строки.

В варианте с тремя параметрами возвращается подстрока, начиная с позиции Int1 и длиной Int2.

Возвращает строку, являющуюся результатом конкатенации Str1 и Str2.

Возвращает true, если значение Str1 удовлетворяет шаблону Template. Синтаксис шаблона аналогичен функции ПОДОБНО() языка запросов (см. здесь).

  • Функции работы с датами:
Функция Описание Пример

Возвращает год из значения типа Edm.DateTime или Edm.DateTimeOffset.

Номер квартала года, в котором находится указанное значение типа Edm.DateTime.

Возвращает месяц из значения типа Edm.DateTime или Edm.DateTimeOffset.

Возвращает день из значения типа Edm.DateTime или Edm.DateTimeOffset.

Возвращает значение часов из значения типа Edm.DateTime или Edm.DateTimeOffset.

Возвращает значение минут из значения типа Edm.DateTime или Edm.DateTimeOffset.

Возвращает значение секунд из значения типа Edm.DateTime или Edm.DateTimeOffset.

Возвращает разность дат DateTime2 и DateTime1 в единицах, указанных параметром Type:

  • second – секунды;
  • minute – минуты;
  • hour – часы;
  • day – дни;
  • month – месяцы;
  • quarter – кварталы;
  • year – года.

Возвращает дату, полученную добавлением к значению DateTime1 значения Int1, выраженное в единицах Type:

  • second – секунды;
  • minute – минуты;
  • hour – часы;
  • day – дни;
  • month – месяцы;
  • quarter – кварталы;
  • year – года.

Возвращает день недели по значению типа Edm.DateTime.

Возвращает день года по значению Edm.DateTime.

  • Прочие функции:
Функция Описание Пример

Возвращает параметр, округленный до ближайшего целого числа.

Возвращает true в том случае, когда объект, на который указывает параметр expr, имеет тип, на который ссылается type. В качестве типа значения принимается строка, обозначающая имя данного типа, например: String, Number, Boolean, Date, Catalog_Товары и т. д.

Возвращает объект, на который указывает параметр expr, приведенный к типу, указанному параметром type. В качестве типа значения принимается строка, обозначающая имя данного типа, например: String, Number, Boolean, Date, Catalog_Товары и т. д.

ПРИМЕЧАНИЕ. Не поддерживаются операции сравнения с реквизитом типа ХранилищеЗначения.

Имеется возможность выполнять отбор сущностей при помощи проверки на равенство поля составного типа и ссылки. Для этого следует использовать функцию cast().

Пример:

$filter=ДокументПрихода eq cast(guid'0d4a79cb 9843 4147 bcd9 80ac3ca2b9c7', 'Document_ПриходнаяНакладная')

В данном примере у используемой сущности имеется реквизит составного типа ДокументПрихода. Запрос будет отбирать все записи сущности, у которой данный реквизит заполнен ссылкой на документ ПриходнаяНакладная с указанным уникальным идентификатором (0d4a79cb-9843-4147-bcd9-80ac3ca2b9c7).

Если требуется выполнить отбор по реквизиту типа УникальныйИдентификатор, то это выполняется с помощью простой операции сравнения:

$filter=ИмяРеквизита eq guid'0d4a79cb 9843 4147 bcd9 80ac3ca2b9c7'

Для отбора по типу какого-либо реквизита составного типа следует использовать функцию isof():

$filter=isof(ДокументыПрихода, 'Document_ПриходнаяНакладная')

Следующее выражение всегда вернет пустой результат запроса, вне зависимости от физического наличия используемого уникального идентифкатора в соответствующей колонке сущности:

$filter=ДокументыПрихода eq guid'0d4a79cb 9843 4147 bcd9 80ac3ca2b9c7'

При необходимости выполнить отбор по элементу коллекции, необходимо использовать лямбда-функции. В качестве аргументов лямбда-функции выступает имя лямбда-переменной, за которой следует символ двоеточия и логическое выражение, которое использует лямбда-переменную для указания на свойства элемента коллекции. Система поддерживает использование следующих лямбда-функций:

  • any – применяет логическое выражение к каждому элементу коллекции и возвращает значение true, если хоть один элемент коллекции удовлетворяет этому условию. Лямбда-функция any без аргументов возвращает true, если коллекция не пуста.
https://host/base/zone/odata/standard.odata/Document_Продажи?$filter=Товары/any(d: d/Цена gt 10000)

В приведенном примере формируется список документов Продажи, у которых есть табличная часть Товары, в которой есть реквизит Цена. При этом Цена должна быть больше, чем 10000. В результирующий список попадут документы, в состав которых входит хотя бы одна строка, удовлетворяющая условию.

  • all – применяет логическое выражение к каждому элементу коллекции и возвращает значение true, если все элементы коллекции ему удовлетворяет.
https://host/base/zone/odata/standard.odata/Document_Продажи?$filter=Товары/all(d: d/Цена lt 10000)

В приведенном примере формируется список документов Продажи, у которых есть табличная часть Товары, в которой есть реквизит Цена. При этом Цена должна быть меньше, чем 10 000. В результирующий список попадут документы, в составе которых все строки удовлетворяют заданному условию.

При необходимости указать условие на значение реквизита другого реквизита составного типа, содержащего ссылочные значения, таким образом, чтобы проверялось одновременно и значение проверяемого реквизита и тип составного реквизита, требуется использовать функцию cast().

Например, имеется документ МаршрутныйЛист, который содержит реквизит составного типа ОснованиеОтгрузки. Данный реквизит может принимать значения типа ДокументСсылка.Накладная и ДокументСсылка.ВнутреннееПеремещение. При этом у документа Накладная существует реквизит МестоОтгрузки, который может принимать значения типа СправочникСсылка.Склад и СправочникСсылка.АдресаОтгрузки.

В том случае, если необходимо отобрать документы МаршрутныйЛист с условием по названию склада, указанного в накладной (т.е. по реквизиту Название объекта типа СправочникСсылка.Склад, записанного в реквизит МестоОтгрузки документа Накладная), то условие должно выглядеть следующим образом:

cast(cast(ОснованиеОтгрузки, 'Document_Накладная')/МестоОтгрузки, 'Catalog_Склад')/Название eq 'Основной в Москве'

Не поддерживаются следующие стандартные функции: lenght, indexof, replace, tolower, toupper, trim, years, days, hours, seconds, floor, ceiling;

$top

Имеется возможность ограничить количество записей, возвращаемых при обращении к ресурсу. Для этого используется параметр $top.

Пример:

http://host/odata/standard.odata/Catalog_Товары?$filter=Цена lt 1000&$top=10

allowedOnly

Если при выполнении запроса необходимо получить только те объекты данных, которые не попадают под ограничения доступа к данным, то в URL получения данных необходимо добавить параметр allowedOnly.

Пример:

https://host/base/zone/odata/standard.odata/Catalog_Товары?$allowedOnly=true

Если параметр не указан или указан со значением false, то во время исполнения запроса к данным может возникнуть ошибка с кодом 401 (если результат выполнения запроса содержит данные, доступ к которым запрещен). Ошибка может не произойти в том случае, если были указаны дополнительные условия, которые ограничили выборку только разрешенными данными.

Например, для справочника Данные настроено ограничение доступа к данным, которое не позволяет получить элементы справочника, у которых реквизит ЗначениеСекретности равно 1, но позволяет получить элементы справочника, у которых реквизит ЗначениеСекретности равно 2. В этом случае следующий запрос не приведет к возникновению ошибки, т. к. явно накладывается условие, которое оставляет в выборе только разрешенные данные:

https://host/base/zone/odata/standard.odata/Catalog_Данные?allowedOnly=false&$filter=ЗначениеСекретности eq 2

Параметр allowedOnly можно использовать только для GET-запросов к наборам сущностей.

$skip

Позволяет исключить из результата запроса первые несколько записей. Если параметры $top и $skip указываются одновременно, то параметр $skip будет применен раньше, чем параметр $top. Приоритет применения параметров не зависит от порядка их указания в теле запроса.

Пример:

https://host/base/zone/odata/standard.odata/Catalog_Товары?$skip=2
				

Уже более 10 000 компаний работают в облачной 1С от 42Clouds

– Консультация по 1С Бесплатно!

– Поддержка 24/7 по техническим вопросам: в чате, по телефону, по почте

– Все типовые конфигурации онлайн, доступ через RDP, Remote App, Web

Смотрите также

Оставьте заявку. Мы свяжемся с вами в самое ближайшее время.

*нажимая на кнопку, Вы даете согласие на обработку персональных данных

Оставьте отзыв о нас

Расскажите, как сервис 42Clouds помог вашему бизнесу.

Отзыв будет опубликован после проверки модератором.

Оставьте заявку. Мы свяжемся с вами в самое ближайшее время.

*нажимая на кнопку, Вы даете согласие на обработку персональных данных