Есть два способа получения списка элементов:

  1. URL: api/item/GetList/{parentId}
    Метод: POST
    Описание: получить информацию о всех дочерних элементах по ID родительского элемента (только непосредственные потомки)
    Входные параметры:
    parentId - ID родительского элемента (ID списка или ID папки/элемента внутри списка)
    Подробное описание метода (заголовки, дополнительные необязательные параметры sort и max_result_count) — на странице Получить дочерние элементы (GetList by parentId).
  2. 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.IdGuidID самого элемента
item.NameСтрокаИмя элемента (значение системного поля "Название", если оно есть у типа контента)
item.ListIdGuidID списка, к которому относится элемент
item.ParentIdGuidID родительского элемента (родительской папки, или ID списка — для элементов верхнего уровня)
item.SiteIdGuidID площадки, на которой находится список элемента
item.ContentTypeIdGuidID типа контента элемента
item.StatusЦелое числоСтатус элемента: 1 — активен, 0 — не активен, -1 — в корзине, -2 — удалён окончательно. В большинстве случаев запросы и так возвращают только активные элементы, отдельно фильтровать по этому полю обычно не требуется
item.InsertDateДата/времяДата/время создания элемента (UTC)
item.UpdateDateДата/времяДата/время последнего обновления элемента (UTC)
item.InsertUserIdGuidID пользователя, создавшего элемент (короткая запись вместо item.InsertUser.Id)
item.UpdateUserIdGuidID пользователя, последним изменившего элемент (короткая запись вместо 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.IdGuidGuid пользователя, создавшего элемент (то же самое, что и item.InsertUserId)
item.UpdateUser.IdGuidGuid пользователя, изменившего элемент (то же самое, что и item.UpdateUserId)
item.DeleteDateДата/времяДата/время удаления элемента (заполнено только для элементов в корзине/удалённых)
item.DeleteUserIdGuidID пользователя, удалившего элемент
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")
}
Создать объект типа массив GUIDnew 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")

Примеры

  1. Найти в подразделении пользователя с указанным именем.
    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.

  2. Найти во всем списке пользователей пользователя с указанным 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 типа контента пользователей

  3. В списке "Файлы" найти элемент по имени в заданной папке.
    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.

  4. В списке "Файлы" найти элементы, у которых имя заканчивается на ".pdf".
    URL: /api/item/GetList/202b3ffa-48b9-4040-a7db-f8d688166f51
    {"query": "item => item.GetValueAsString(\"name\").EndsWith(\".pdf\")"}

  5. В списке "Файлы" найти все элементы, у которых атрибут "Статус документа" = "Размещено".
    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 папки проекта, например). В этом случае поиск будет проводится внутри заданной папки.

  6. В списке "Файлы" найти все элементы, у которых атрибут "Статус документа" = "Размещено" или "На входном контроле".
    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\"))"}

  7. В списке "Файлы" найти элементы, у которых значение поля "Трудозатраты этап 2" больше 1.
    URL: /api/item/GetRecursive/966e62c5-a803-49a0-a1be-e680d130c481
    Тело запроса: {"query": "item => item.GetValueAsInt(\"duration_plan_stage_2\") > 1"}

  8. В списке "Файлы" найти элементы по дате создания >= 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.

  9. Нужно выводить только пользователей (не подразделения и не группы):
    item => item.ContentTypeId == Guid("99c92e22-4e60-48c0-ab70-add500e71a45")
    Здесь 99c92e22-4e60-48c0-ab70-add500e71a45 - это ID типа элемента "Пользователь"

  10. Получить список элементов, у которых поле "Заблокирован" пустое (null) или Ложь (false):
    URL: /api/item/GetRecursive/966e62c5-a803-49a0-a1be-e680d130c481
    Тело запроса: {"query": "item => item.GetValueAsBool(\"disabled\") == null || item.GetValueAsBool(\"disabled\") == false"}

  11. Найти дочерние элементы (файлы и папки) конкретного элемента по его ID (например, все элементы внутри папки, независимо от типа контента):
    URL: /api/item/GetList/{parentId}
    Тело запроса не требуется (пустое) — если фильтр не нужен, а требуются только непосредственные дочерние элементы.

  12. Найти конкретный элемент по его собственному ID среди результатов рекурсивного поиска (например, чтобы исключить сам себя из выборки при проверке уникальности значения — как это делает функция GetList в вычислениях, см. пример на странице Функции и операторы для формул вычисления):
    {"query": "item => item.GetValueAsString(\"email\") == \"test@vitrocad.ru\" && item.Id != Guid(\"aab39600-92b4-4c38-a55c-53efac8db9cc\")"}
  • No labels