Как использовать пагинацию и сортировку при поиске элементов приложения

Сортировка позволяет расположить элементы массива результатов поиска в порядке возрастания или убывания одного из свойств приложения.
Например, можно записать все элементы приложения Сотрудники в порядке возрастания числа их полных лет (переменная Возраст типа Число в приложении).

Метод Search.sort принимает два аргумента. Первый — код свойства приложения, по которому происходит сортировка (обратите внимание, что для этого свойства в приложении должна быть включена опция Поиск и сортировка по полю). Второй (типа boolean) определяет, будут ли результаты отображаться в порядке возрастания. При значении, отличном от true, система будет располагать элементы в порядке убывания.

const employees = await Context.fields.employee.app.search().sort('age',true).size(10000).all();

Пагинация

Пагинация применяется, чтобы получать результаты поиска порционно.
Это может потребоваться, например, если результаты поиска в дальнейшем обрабатываются сценарием, который занимает продолжительное время. Чтобы такой сценарий не завершился из-за истечения таймаута, будем передавать в него элементы частями.

Также пагинация потребуется, если нужно обработать более 10000 элементов приложения, так как это наибольшее количество элементов, возвращаемых методом search().

Процесс состоит из двух блоков Сценарий.

В блоке Сценарий вычисления количества элементов находится сценарий вычисления количества всех элементов приложения, которые необходимо обработать, а также задается начальное значение счетчика:

const counter = await Namespace.app.contracts.search().count();
Context.data.total = counter;
Context.data.str = counter.toString()+ " — найдено всего";
Context.data.work_element = 0;

В данном сценарии:

  • contracts — название приложения, с которым идет работа;
  • counter и Context.data.total — общее количество элементов приложения, обработка которых будет производиться;
  • Context.data.work_element — переменная типа Число; счетчик элементов, с которыми будет работать поиск;
  • Context.data.str — переменная типа Строка, которая выводит количество найденных элементов.

Во втором блоке Загрузка и работа с очередными 50 шт. находится сценарий для обработки одной «порции» экземпляров:

const batch  = await Namespace.app.contracts.search().from(Context.data.work_element!).size(50).all();

/* Объявим переменную, которая позволит сохранить все элементы сразу,
не прибегая к асинхронным вызовам внутри цикла */
let promises: Promise<void> [] = [];

for (let item of batch)
    {
        item.data.string = "Выполнено";
        promises.push(item.save());
    }

// Сохраняем все измененные элементы
await Promise.all(promises); 

Context.data.work_element = Context.data.work_element! + 50;

В данном сценарии string — одно из свойств приложения contracts (его нам и требуется изменить).

После второго сценария располагается шлюз, который по умолчанию возвращает на предыдущий шаг, чтобы осуществить обработку следующих 50 элементов. Это происходит, пока не выполнится условие work_element >= complete, что будет означать, что количество обработанных элементов больше или равно общему количеству найденных элементов приложения.