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