фильтровать
Функция фильтровать отбирает из списка элементы, которые соответствуют заданному условию.
Синтаксис
фильтровать(элемент из список, условие)
Параметры:
элемент— имя текущего элемента списка. Задаётся непосредственно в функции и используется в условии;список— идентификатор спискового поля;условие— логическое выражение, по которому определяется, должен ли элемент попасть в результат.
Имя текущего элемента можно выбрать самостоятельно. Оно используется только внутри функции.
Например:
фильтровать(товар из товары, товар.стоимость > 5000)
Здесь:
товары— идентификатор спискового поля;товар— имя текущего элемента, заданное внутри функции;стоимость— идентификатор вложенного поля;товар.стоимость > 5000— условие отбора.
В результат попадут только товары стоимостью больше 5000.
Возвращаемое значение
Функция возвращает новый список, содержащий только элементы, для которых условие выполняется.
Исходный список при этом не изменяется.
Результат фильтровать(...) можно использовать вместо исходного списка:
- в конструкции
циклили табличном цикле; - в других списковых функциях;
- в агрегатных функциях
счет,сумм,срзнач,минимакс.
Это позволяет сначала отобрать нужные элементы, а затем выполнить расчёт только по ним.
Примеры
Вывод только подходящих элементов списка
Допустим, в шаблоне есть списковое поле:
товары
Каждый элемент содержит:
наименование— название товара;стоимость— стоимость товара.
Исходный список:
наименование |
стоимость |
|---|---|
| Монитор | 15000 |
| Клавиатура | 800 |
| Принтер | 12000 |
| Мышь | 600 |
Нужно вывести только товары стоимостью больше 5000.
{цикл(позиция из фильтровать(товар из товары, товар.стоимость > 5000))}
{позиция.наименование} — {позиция.стоимость}
{/цикл}
Здесь:
товары— идентификатор исходного спискового поля;товар— имя текущего элемента внутри функциифильтровать;товар.стоимость > 5000— условие отбора;фильтровать(...)— возвращает новый список только с подходящими товарами;позиция— имя текущего элемента отфильтрованного списка внутри цикла.
Результат:
Монитор — 15000
Принтер — 12000
Исходный список товары остаётся без изменений.
Расчёт суммы по отфильтрованному списку
Результат функции фильтровать можно передать непосредственно в агрегатную функцию.
Допустим, список товары содержит:
наименование |
стоимость |
количество |
|---|---|---|
| Монитор | 15000 | 2 |
| Клавиатура | 800 | 5 |
| Принтер | 12000 | 1 |
| Мышь | 600 | 10 |
Нужно рассчитать общую стоимость только тех товаров, стоимость одной единицы которых больше 5000.
Сначала функция фильтровать отбирает подходящие элементы:
фильтровать(товар из товары, товар.стоимость > 5000)
В результате остаются:
наименование |
стоимость |
количество |
|---|---|---|
| Монитор | 15000 | 2 |
| Принтер | 12000 | 1 |
Полученный список можно сразу передать в функцию сумм:
сумм(позиция из фильтровать(товар из товары, товар.стоимость > 5000), позиция.стоимость * позиция.количество)
Здесь:
товар— имя элемента исходного списка внутри функциифильтровать;фильтровать(...)— возвращает список товаров стоимостью больше5000;позиция— имя элемента уже отфильтрованного списка внутри функциисумм;позиция.стоимость * позиция.количество— стоимость каждой позиции, которая участвует в суммировании.
Для расчёта используются:
15000 × 2 = 30000
12000 × 1 = 12000
Функция вернёт:
42000
Таким же способом отфильтрованный список можно передать в счет, срзнач, мин или макс, если расчёт нужно выполнить только по элементам, соответствующим условию.