Есть два способа получения списка элементов:
- URL: api/item/GetList/{parentId}
Метод: POST
Описание: получить информацию о всех дочерних элементах по ID родительского элемента (только непосредственные потомки)
Входные параметры:
parentId - ID родительского элемента (ID списка или ID папки/элемента внутри списка)
Подробное описание метода (заголовки, дополнительные необязательные параметрыsortиmax_result_count) — на странице Получить дочерние элементы (GetList by parentId). - URL: api/item/GetRecursive/{itemId}
Метод: POST
Описание: рекурсивно получить информацию о всех дочерних элементах по ID родительского элемента (дочерние элементы + их дочерние элементы и т.д., сам переданный элемент в результат не входит)
Входные параметры:
itemId - ID корневого элемента поддерева (ID списка, ID папки или любого другого элемента внутри списка)
Подробное описание — на странице Получить элементы рекурсивно (GetRecursive).
В теле POST запроса для этих методов можно передать строку с фильтром, который будет применяться для поиска элементов:
{ "query": "item => условия, которым должны удовлетворять искомые элементы"}
Точно такой же синтаксис условия отбора (лямбда-выражение вида i => ... над элементом) используется и в формулах вычислений — в функции GetList. Правила синтаксиса на этой странице одинаково применимы и к параметру query REST-методов, и ко второму параметру функции GetList в формулах. Описание самой функции GetList (с дополнительными параметрами context и recursive) — на странице Функции и операторы для формул вычисления (раздел «Работа со списками», якорь GetList).
Синтаксис строки фильтра
Строка фильтра — это лямбда-выражение на языке Dynamic LINQ (библиотека System.Linq.Dynamic.Core), которое разбирается сервером и превращается в обычный LINQ-запрос к элементам списка. Параметр лямбды (в примерах этой статьи он называется item, но имя может быть любым, например i) имеет тип элемента (IItem) — набор доступных полей и методов у него один и тот же независимо от списка, см. таблицы ниже.
Пример. Найти всех пользователей, у которых email равен "test@vitrocad.ru".
URL: /api/item/GetRecursive/e3a94bde-0ca9-456f-b338-4465d40389ee
Тело POST запроса:
{"query": "item => item.ContentTypeId == Guid(\"99c92e22-4e60-48c0-ab70-add500e71a45\") && item.GetValueAsString(\"email\") == \"test@vitrocad.test\""}
e3a94bde-0ca9-456f-b338-4465d40389ee - ID списка "Пользователи"
99c92e22-4e60-48c0-ab70-add500e71a45 - это ID типа контента пользователей
Часто используемые поля и методы элемента
| Поле или метод | Тип | Описание |
|---|---|---|
| item.Id | Guid | ID самого элемента |
| item.Name | Строка | Имя элемента (значение системного поля "Название", если оно есть у типа контента) |
| item.ListId | Guid | ID списка, к которому относится элемент |
| item.ParentId | Guid | ID родительского элемента (родительской папки, или ID списка — для элементов верхнего уровня) |
| item.SiteId | Guid | ID площадки, на которой находится список элемента |
| item.ContentTypeId | Guid | ID типа контента элемента |
| item.Status | Целое число | Статус элемента: 1 — активен, 0 — не активен, -1 — в корзине, -2 — удалён окончательно. В большинстве случаев запросы и так возвращают только активные элементы, отдельно фильтровать по этому полю обычно не требуется |
| item.InsertDate | Дата/время | Дата/время создания элемента (UTC) |
| item.UpdateDate | Дата/время | Дата/время последнего обновления элемента (UTC) |
| item.InsertUserId | Guid | ID пользователя, создавшего элемент (короткая запись вместо item.InsertUser.Id) |
| item.UpdateUserId | Guid | ID пользователя, последним изменившего элемент (короткая запись вместо item.UpdateUser.Id) |
| item.IsNew | Флаг | Признак того, что элемент ещё не был сохранён (в контексте запроса к уже сохранённым элементам всегда false, поле актуально в других контекстах, например в валидаторах) |
| item.GetValueAsDateTime("название поля") | Дата/время | Получить значение поля типа "дата" |
| item.GetValueAsString("название поля") | Строка | Получить значение поля типа "однострочный текст"/"многострочный текст" |
| item.GetValueAsBool("название поля") | Флаг | Получить значение поля типа "флаг" |
| item.GetValueAsInt("название поля") | Целое число | Получить значение поля типа "целое число" |
| item.GetValueAsLong("название поля") | Целое число | Получить значение поля типа "Длинное целое число" |
| item.GetValueAsDouble("название поля") | Дробное число | Получить значение поля типа "Дробное число" |
| item.GetLookupId("название поля") | Guid | Получить значение поля типа "ссылка на элемент списка" (ID элемента, на который ссылается поле) |
| item.GetValueAsLookupIdList("название поля") | [Guid] | Получить значения поля типа "ссылка на элемент списка" с флагом "Множественный выбор из списка" |
| item.GetValueAsGuid("название поля") | Guid | Получить значение поля типа "Guid" (например, поле "source"/"destination" у ссылок между элементами) |
| item.ContainsKey("название поля") | Флаг | Проверить, что у элемента вообще есть такое поле и в нём есть значение (полезно перед обращением к полю, которого может не быть у части типов контента списка — иначе GetValueAs... вернёт значение по умолчанию, а не ошибку) |
Реже используемые поля и методы
| Поле или метод | Тип | Описание |
|---|---|---|
| item.InsertUser.Id | Guid | Guid пользователя, создавшего элемент (то же самое, что и item.InsertUserId) |
| item.UpdateUser.Id | Guid | Guid пользователя, изменившего элемент (то же самое, что и item.UpdateUserId) |
| item.DeleteDate | Дата/время | Дата/время удаления элемента (заполнено только для элементов в корзине/удалённых) |
| item.DeleteUserId | Guid | ID пользователя, удалившего элемент |
| item.GetValueAsDecimal("название поля") | Дробное число | Получить значение поля типа "Дробное число" с повышенной точностью |
| item.GetValueAsStringCollection("название поля") | [Строка] | Получить значение многострочного текстового поля построчно, как список строк |
| item.GetValueAsByteArray("название поля") | [байт] | Получить значение поля в виде массива байт |
| item.GetValueAsObject("название поля") | Object | Получить значение поля без преобразования к конкретному типу |
Операторы сравнения
| Оператор | Описание | Пример |
|---|---|---|
| == | Равно | item.GetValueAsString("email") == "test@vitrocad.ru" |
| != | Не равно | item.ContentTypeId != Guid("99c92e22-4e60-48c0-ab70-add500e71a45") |
| > | Больше | item => item.InsertDate > DateTime(2024, 10, 1, 10, 0, 0) |
| >= | Больше или равно | item => item.InsertDate >= DateTime(2024, 10, 1, 10, 0, 0) |
| < | Меньше | item => item.InsertDate < DateTime(2024, 10, 1, 10, 0, 0) |
| <= | Меньше или равно | item => item.InsertDate <= DateTime(2024, 10, 1, 10, 0, 0) |
Движок Dynamic LINQ допускает также одиночный знак = как синоним == — в старых примерах в этой и других статьях он может встречаться. Рекомендуется использовать именно ==, чтобы не путать с присваиванием.
Искомые значения
| Значения | Описание | Пример |
|---|---|---|
| "Строка" | Строка текста | item.GetValueAsString("email") == "test@vitrocad.ru" |
| Guid("99c92e22-4e60-48c0-ab70-add500e71a45") | Создать объект типа GUID из указанной строки | item.ContentTypeId == Guid("99c92e22-4e60-48c0-ab70-add500e71a45") |
| DateTime(2024, 10, 1, 10, 0, 0) | Создать объект типа Дата/Время По указанным параметрам DateTime(Год, Месяц, День, Час, Минута, Секунда) Обратите внимание: время передается в UTC | item.InsertDate > DateTime(2024, 10, 1, 10, 0, 0) |
| new Guid[] { Guid("b9d061b1-7ce7-4756-8230-e502cfe3d8d8"), Guid("5cd0640c-1e57-4e09-b0ec-babfb5c72680") } | Создать объект типа массив GUID | new Guid[] { Guid("b9d061b1-7ce7-4756-8230-e502cfe3d8d8"), Guid("5cd0640c-1e57-4e09-b0ec-babfb5c72680") }.Contains(item.GetLookupId("document_status")) |
Логические операторы
| Оператор | Описание | Пример |
|---|---|---|
| && | Логическое И | item.ContentTypeId == Guid("99c92e22-4e60-48c0-ab70-add500e71a45") && item.GetValueAsString("email") == "admin@email.test" |
| || | Логическое ИЛИ | item.ContentTypeId == Guid("99c92e22-4e60-48c0-ab70-add500e71a45") || item.ContentTypeId == Guid("733af6e2-e187-4e75-8a2b-ae4072f402e0") |
Функции поиска по подстроке
| Функция | Описание | Пример |
|---|---|---|
| Contains | Значение содержит подстроку | item.GetValueAsString("email").Contains("test") |
| StartsWith | Значение начинается со строки | item.GetValueAsString("email").StartsWith("test") |
| EndsWith | Значение заканчивается на строку | item.GetValueAsString("name").EndsWith(".pdf") |
Примеры
- Найти в подразделении пользователя с указанным именем.
URL: /api/item/GetList/c0857f66-fbfa-448f-a35d-afac00a3a9cb
Тело запроса: {"query": "item => item.ContentTypeId == Guid(\"99c92e22-4e60-48c0-ab70-add500e71a45\") && item.GetValueAsString(\"name\") == \"admin\""}c0857f66-fbfa-448f-a35d-afac00a3a9cb - ID подразделения пользователя
Обратите внимание: GetList ищет только тех пользователей, которые находятся непосредственно в самом подразделении. Если требуется искать по всей структуре подразделения, то нужно вместо GetList использовать GetRecursive.
Найти во всем списке пользователей пользователя с указанным Email.
URL: /api/item/GetRecursive/e3a94bde-0ca9-456f-b338-4465d40389ee
Тело запроса: {"query": "item => item.ContentTypeId == Guid(\"99c92e22-4e60-48c0-ab70-add500e71a45\") && item.GetValueAsString(\"email\") == \"admin@email.test\""}e3a94bde-0ca9-456f-b338-4465d40389ee - ID списка "Пользователи"
99c92e22-4e60-48c0-ab70-add500e71a45 - это ID типа контента пользователейВ списке "Файлы" найти элемент по имени в заданной папке.
URL: /api/item/GetList/202b3ffa-48b9-4040-a7db-f8d688166f51
Тело запроса: {"query": "item => item.GetValueAsString(\"name\") == \"Test 002-0.1.pdf\""}202b3ffa-48b9-4040-a7db-f8d688166f51 - ID папки
Обратите внимание: GetList ищет только те элементы, которые лежат непосредственно в указанной папке. Если требуется искать во вложенных папках, то нужно вместо GetList использовать GetRecursive.
- В списке "Файлы" найти элементы, у которых имя заканчивается на ".pdf".
URL: /api/item/GetList/202b3ffa-48b9-4040-a7db-f8d688166f51
{"query": "item => item.GetValueAsString(\"name\").EndsWith(\".pdf\")"} В списке "Файлы" найти все элементы, у которых атрибут "Статус документа" = "Размещено".
URL: /api/item/GetRecursive/966e62c5-a803-49a0-a1be-e680d130c481
Тело запроса: {"query": "item => item.GetLookupId(\"document_status\") == Guid(\"b9d061b1-7ce7-4756-8230-e502cfe3d8d8\")"}966e62c5-a803-49a0-a1be-e680d130c481 - ID списка "Файлы"
b9d061b1-7ce7-4756-8230-e502cfe3d8d8 - ID статуса "Размещено"Вместо ID списка "Файлы" можно передать ID папки (ID папки проекта, например). В этом случае поиск будет проводится внутри заданной папки.
- В списке "Файлы" найти все элементы, у которых атрибут "Статус документа" = "Размещено" или "На входном контроле".
URL: /api/item/GetRecursive/966e62c5-a803-49a0-a1be-e680d130c481
Тело запроса: {"query": "item => new Guid[] { Guid(\"b9d061b1-7ce7-4756-8230-e502cfe3d8d8\"), Guid(\"5cd0640c-1e57-4e09-b0ec-babfb5c72680\") }.Contains(item.GetLookupId(\"document_status\"))"} - В списке "Файлы" найти элементы, у которых значение поля "Трудозатраты этап 2" больше 1.
URL: /api/item/GetRecursive/966e62c5-a803-49a0-a1be-e680d130c481
Тело запроса: {"query": "item => item.GetValueAsInt(\"duration_plan_stage_2\") > 1"} - В списке "Файлы" найти элементы по дате создания >= 01.10.2024 10:00:00.
URL: /api/item/GetRecursive/966e62c5-a803-49a0-a1be-e680d130c481
Тело запроса: {"query": "item => item.InsertDate >= DateTime(2024, 10, 1, 10, 0, 0)"}
Обратите внимание: время передается в UTC. - Нужно выводить только пользователей (не подразделения и не группы):
item => item.ContentTypeId == Guid("99c92e22-4e60-48c0-ab70-add500e71a45")
Здесь99c92e22-4e60-48c0-ab70-add500e71a45- это ID типа элемента "Пользователь" - Получить список элементов, у которых поле "Заблокирован" пустое (null) или Ложь (false):
URL: /api/item/GetRecursive/966e62c5-a803-49a0-a1be-e680d130c481
Тело запроса: {"query": "item => item.GetValueAsBool(\"disabled\") == null || item.GetValueAsBool(\"disabled\") == false"} - Найти дочерние элементы (файлы и папки) конкретного элемента по его ID (например, все элементы внутри папки, независимо от типа контента):
URL: /api/item/GetList/{parentId}
Тело запроса не требуется (пустое) — если фильтр не нужен, а требуются только непосредственные дочерние элементы. - Найти конкретный элемент по его собственному ID среди результатов рекурсивного поиска (например, чтобы исключить сам себя из выборки при проверке уникальности значения — как это делает функция GetList в вычислениях, см. пример на странице Функции и операторы для формул вычисления):
{"query": "item => item.GetValueAsString(\"email\") == \"test@vitrocad.ru\" && item.Id != Guid(\"aab39600-92b4-4c38-a55c-53efac8db9cc\")"}