# Правила получения доступа к ресурсам

Прежде чем мы начнём формирование строки доступа к ресурсу, нам необходимо знать, как обозначаются объекты «1С Предприятие» в строке доступа.<br>

Объект конфигурации | Префикс имени в URL
--------------------|--------------------
Справочник | Catalog
Документ | Document
Регистр сведений | InformationRegister


Важно помнить, что доступ к тем или иным объектам конфигурации *ограничивается ролями*, которые указаны у пользователя 1С, под которым мы подключились к базе.<br>
 Теперь, когда мы знаем, как обозначаются объекты «1С Предприятие» в URL можем разобрать сам URL.<br>
 
**Схема URL**<br>

*<Префикс имени ресурса>_<Имя объекта конфигурации>_<Суффикс имени>*<br>
, где: <br>
*Префикс имени ресурса* – указываем в соответствии с таблицей сопоставления объектов «1С Предприятия» и их представление в OData. Используется только латиница.<br>
*Имя объекта конфигурации* – указываем имя объекта, так как оно указано в конфигурации (поле «Имя»). Если имя указано кириллицей, то в URL также указываем в кириллице.<br>
*Суффикс имени* – указываем дополнительное описание имени объекта. Применяется для обозначения:<br>
* табличной части объекта;<br>
* имя виртуальной таблицы регистра;<br>
* RowType – строка табличной части;<br>
* RecordType – запись регистра.<br>
Например:<br>
1.	доступ к справочнику «Организации» - *Catalog_Организации*;<br>
2.	доступ к табличной части «Контактная информация» справочника «Физические лица» - *Catalog_ФизическиеЛица_КонтактнаяИнформация*;<br>
3.	доступ к таблице кадровых передвижений сотрудников - *InformationRegister_КадроваяИсторияСотрудников*.<br>
 
**Установка отборов по ресурсам**<br>

Для формирования выборок необходимы настройки отбора данных, рассмотрим какие отборы, мы можем указать в строке (URL). <br>
Можно выделить следующие отборы:<br>
* $filter;<br>
* $top;<br>
* $allowedOnly;<br>
* $skip;<br>
* $count;<br>
* $inlinecount;<br>
* $orderby.<br>
* 
Теперь рассмотрим каждый из них:<br>

**$filter**<br>

Для установки фильтров используется специальный язык, при помощи которого мы описываем применяемые фильтры в строке доступа к ресурсу.<br>
Мы будем использовать следующие операции:<br>
* *логические*:<br>
Описание | Имя | Пример
---------|-----|-------
Равно | eq | /Catalog_ФизическиеЛица?$filter=Имя eq ‘Иванов’
Catalog_ФизическиеЛица?$filter=Ref_Key eq guid'b1dbe18e-87b5-11e9-80f1-00505681a2de'
Не равно | ne | /Catalog_Контрагенты?$filter=Имя ne ‘Иванов’
Больше | gt | /Document_Отпуск?$filter=Date gt datetime'2022-11-26T00:00:00'

Больше или равно | ge | /Document_Отпуск?$filter=Date ge datetime'2022-11-26T00:00:00'

Меньше | lt | /Document_Отпуск?$filter=Date lt datetime'2022-11-26T00:00:00'

Меньше или равно | le | /Document_Отпуск?$filter=Date le datetime'2022-11-26T00:00:00'

Логическое «ИЛИ» | or | /Catalog_Контрагенты?$filter=Покупатель eq true or Прочее eq true
Логическое «И» | end | /Catalog_Контрагенты?$filter=Покупатель eq true end Кредит gt 100
Отрицание | not | /Catalog_Контрагенты?$filter=not | (Покупатель eq true)
 
*примеры обращение к табличной части сущности*:<br>
Document_Отпуск?$filter=ДополнительныеОтпуска/ВидОтпуска_Key eq guid'cf447156-eb49-11e8-5f86-005056ab6485' and Date gt datetime'2022-07-01T00:00:00' <br>
Catalog_ФизическиеЛица?$filter=КонтактнаяИнформация/Тип eq 'АдресЭлектроннойПочты'<br>
Catalog_ФизическиеЛица?$filter=like(КонтактнаяИнформация/Представление, ‘%zub.ru%’)<br>
Catalog_ФизическиеЛица?$filter=КонтактнаяИнформация/Тип eq 'АдресЭлектроннойПочты'<br>

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

Операция | Описание
---------|---------
() | повышение приоритета операции
/ | навигация
- | арифметическое отрицание
not | логическое отрицание
mul | умножение
div | деление
add | сложение
sub | вычетание
gt | больше
ge | больше или равно
lt | меньше
le | меньше или равно
eq | равно
ne | не равно
and | логическое «И»
or | логическое «ИЛИ»


 *?$filter=ДополнительныеОтпуска/ВидОтпуска_Key eq guid'800894d6-efc8-11e8-5f86-005056ab6485' and Date gt datetime'2022-11-01T00:00:00'*

Также мы можем применять функции для вычисления промежуточных данных: 

* **строковые функции:**
  
Функция | Описание | Пример
--------|----------|-------
substringof(Str1, Str2) | Возвращает true в том случае, если Str1 является подстрокой Str2. | /Catalog_Товары?$filter=substringof('Красный Октябрь', Производитель) eq true
endswith(Str1, Str2) | Возвращает true в том случае, если Str1 заканчивается на Str2. | /Catalog_Товары?$filter=endswith(Производитель, 'ООО') eq true
startswith(Str1, Str2) | Возвращает true в том случае, если Str1 начинается на Str2. | /Catalog_Товары?$filter=startswith(Производитель, 'ООО') eq true
substring(Str, Int1) substring(Str, Int1, Int2) | Возвращает подстроку из Str1. В варианте с двумя параметрами возвращается строка с позиции Int и до конца строки. В варианте с тремя параметрами возвращается подстрока, начиная с позиции Int1 и длиной Int2. | /Catalog_Поставщики?$filter=substring(ИНН, 1, 2) eq '77' | 
concat(Str1, Str2) | Возвращает строку, являющуюся результатом конкатенации Str1 и Str2. | /Catalog_Поставщик?$filter=concat(concat(Город, ', '), Страна) eq 'Москва, Россия' | 
like(Str, Template) | Возвращает true, если значение Str1 удовлетворяет шаблону Template. Синтаксис шаблона аналогичен функции ПОДОБНО() языка запросов. | /Catalog_Товары?$filter= like(Наименование, ‘[^к]%’)


* **функции для работы с датами:**
  
Функция       | Описание | Пример
--------------|----------|------- 
year(DateTime) | Возвращает год из значения типа Edm.DateTime или Edm.DateTimeOffset. | /Catalog_Товары?$filter=year(Произведен) eq 2013
quarter(DateTime) |  Номер квартала года, в котором находится указанное значение типа Edm.DateTime. | /Catalog_Товары?$filter=quarter(ДатаПроизводства) eq 1
month(DateTime) |   Возвращает месяц из значения типа Edm.DateTime или Edm.DateTimeOffset. | /Catalog_Товары?$filter=month(Произведен) eq 12
 
Имеется возможность выполнять отбор сущностей при помощи проверки на равенство поля составного типа и ссылки. Для этого следует использовать функцию cast(). Пример: <br>

*$filter=Файл eq cast(guid'8b99d633-0ccb-11ed-80cd-00505681789e','Catalog_ОтпускПоУходуЗаРебенкомПрисоединенныеФайлы')*
 
В данном примере у используемой сущности *Catalog_ОтпускПоУходуЗаРебенкомПрисоединенныеФайлы* имеет реквизит составного типа *Файл*. Запрос будет отбирать все записи сущности, у которой данный реквизит заполнен ссылкой на Catalog_ОтпускПоУходуЗаРебенкомПрисоединенныеФайлы с указанным уникальным идентификатором (8b99d633-0ccb-11ed-80cd-00505681789e).<br>

Если требуется выполнить отбор по реквизиту типа УникальныйИдентификатор, то это выполняется с помощью простой операции сравнения. <br>
Пример:<br>
*$filter=ИмяРеквизита eq guid'8b99d633-0ccb-11ed-80cd-00505681789e'*<br>
 
При необходимости выполнить отбор по элементу коллекции, необходимо использовать лямбда-функции. В качестве аргументов лямбда-функции высутпает имя лямбда-переменной, за которой следует символ двоеточия и логическое выражение, которое использует лямбда-переменную для указания на свойства элемента коллекции.<br>
Система поддерживает использование следующих лямбда-функций:<br>

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

* *all* – применяет логическое выражение к каждому элементу коллекции и возвращает значение true, если все элементы коллекции ему удовлетворяет. Пример:<br>
http://host/base/odata/standard.odata/Document_Продажи?$filter=Товары/all(d: d/Цена lt 10000)
В приведенном примере формируется список документов Продажи, у которых есть табличная часть Товары, в которой есть реквизит Цена. При этом Цена должна быть меньше, чем 10000. В результирующий список попадут документы, в составе которых все строки удовлетворяют заданному условию.<br>
Не поддерживаются следующие стандартные функции: lenght, indexof, replace, tolower, toupper, trim, years, days, hours, seconds, floor, ceiling.<br>

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

*http://host/odata/standard.odata/Document_Отпуск$filter=Date gt datetime'2022-05-01T00:00:00'&$top=10<br>?$format=json*
 
