Закажите бесплатную презентацию продуктов РосБизнесСофт прямо сейчас!
За работу с выборкой Объектов отвечает класс EntrySet.
Объект EntrySet представляет собой набор записей одного типа. Можно рассматривать объект этого класса, как содержимое таблицы или как массив данных.
С объектом можно совершать следующие операции:
Используется для поиска Объектов.
Где:
Строка строится по принципу: {ПОЛЕ}{ОПЕРАЦИЯ}{ЗНАЧЕНИЕ}.
Операции могут быть:
При последовательном написании «filter» накладывается условие «AND» (И).
Пример:
$_data = $this->Data->References->Companies; //Получаем список всех "Контрагентов" $_data->filter("id!=5"); //Убираем из него компанию с id=5 $_data->filter("date>=22-05-2012"); //Оставляем только созданные после 22 мая $_data->filter("status=1"); //И только со статусом 1 $_data->filter("pasport_data between '2017-11-15' and '2017-12-21'"); //between от 2017-11-15 до 2017-12-21. Можно использовать не только с датами.
Или можно так:
$_data = $this->Data->References->Companies->filter("id!=5")->filter("date>=22-05-2012")->filter("status=1");
Каждый вызов filter изменяет данные в наборе. При этом в переменной хранится только ссылка на набор данных, поэтому каждый следующий выбор уточняет набор.
В результате выполнения кода выше, в $_data будут перечислены все компании со «Статусом»=1, созданные после «22 мая», кроме компании с «id» !=5.
Пример: отфильтруем «Счета» за определенный период и по текущему пользователю системы:
$orders = $this->Data->{'documents.orders'} ->filter('responsible=' . $this->User->getEmployeeId()) ->filter('date>=' . date('2022-01-01')) ->filter('date<' . date('2023-01-01'));
Если мы находимся в «Форме списка» модуля «Счет», то можно применить фильтрацию следующим способом:
$this->structure ->filter('responsible=' . $this->User->getEmployeeId()) ->filter('date>=' . date('2020-01-01')) ->filter('date<' . date('2021-01-01'));
В structure хранятся элементы текущего объекта (все «Счета»).
Если нужно отфильтровать Объекты по полю типа «Дата», которое пока не заполнено, то используется следующая конструкция:
$projects = Kernel::Data()->{'positions.table_83'}->filter("date_end=NULL");
Пример использования like в фильтре для поиска по части строки:
$this->structure->filter("name like %". $filter_name ."%");
Если в фильтре перечислить несколько условий (массивом), то условие будет уже «OR» (логическое «ИЛИ»)
Пример: получить задачи текущего пользователя со статусом «Новый» или «В работе»:
$this->data->{"documents.tasks"} ->filter(["status=1", "status=2"]) // 1 = Новые, 2 = В работе ->responsible($this->User->getEmployeeId());
Пример: отфильтруем Задачи, где поле «Автор» = текущий пользователь или поле «name» табличной части «responsible» = текущему пользователю
$_data->filter(["author=" . $this->User->getEmployeeId(), "responsible contains name=" . $this->User->getEmployeeId()]);
Для типа поля «Multipointer» (множественный выбор) существуем метод «contain» для фильтрации.
Например, у объекта “Контрагент” есть поле с множественным выбором «Сегменты» (segments).
Задача: Отобрать «Контрагентов» только с выбранным «Сегментом А»
$companies = $this->Data->{'references.companies}->filter('segments contains 777')
Где:
Для сортировки Объектов в выборке применяется метод order().
Где:
Если нужна сортировка A-Z, то необходимо указать только название поля, по которому необходимо отсортировать.
Например, получим «Счета» в порядке возрастания «Даты»:
$this->Data->{"documents.orders"}->order("date");
Для сортировки Z-А необходимо передать массив в метод order().
Пример: получить «Счета» в порядке убывания «Даты» («свежие» счета будут в начале списка):
$this->Data->{"documents.orders"}->order(["date", DESC])
Ограничения выборки.
Где:
Пример: отобрать первые 10 контрагентов, удовлетворяющие фильтрам
$this->companies = $this->Data->References->Companies->filter(["name like %" . $search . "%", "phone like %" . $search . "%", "email like %" . $search . "%", "id=" . $search . "%"])->limit(10);
Получение количества объектов в выборке.
Где:
Пример: получить количество записей в табличной части «products»
$this->structure->products->num()
Сумма по полю в выборке.
Где:
Пример: найти сумму стоимости всех товарах в табличной части
echo $this->structure->products->sum("total")); // 7777