Перейти к содержанию

группировать

Функция группировать объединяет элементы списка в группы по одинаковому значению выбранного поля.

Синтаксис

группировать(элемент из список, выражение)

Параметры:

  • элемент — имя текущего элемента списка. Задаётся непосредственно в функции и используется в выражении;
  • список — идентификатор спискового поля;
  • выражение — значение, по которому элементы объединяются в группы.

Например:

группировать(товар из товары, товар.категория)

Здесь:

  • товары — идентификатор спискового поля;
  • товар — имя текущего элемента, заданное внутри функции;
  • категория — идентификатор вложенного поля;
  • товар.категория — значение, по которому выполняется группировка.

Элементы с одинаковым значением категория попадут в одну группу.

Возвращаемое значение

Функция возвращает список сформированных групп.

Для каждой группы автоматически доступны два свойства:

  • .Признак — значение, по которому сформирована группа;
  • .Список — список элементов исходного списка, вошедших в группу.

Например, если текущей группе задано имя группа:

группа.Признак
группа.Список

Имя группа можно выбрать самостоятельно.

.Признак и .Список создаются функцией группировать и всегда указываются именно в таком виде. Это не идентификаторы полей анкеты.

Полученный группа.Список можно использовать как обычный список — например, перебрать его в цикле или передать в сумм, счет, срзнач, мин и макс.

Пример

Группировка товаров с подытогом по каждой группе

Допустим, в шаблоне есть списковое поле с идентификатором:

товары

Каждый элемент списка содержит:

  • наименование — название товара;
  • категория — категория товара;
  • цена — цена за единицу;
  • количество — количество товара.

Исходный список:

наименование категория цена количество
Монитор Техника 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

Таким образом, группировать позволяет не только разделить элементы списка по признаку, но и отдельно обрабатывать элементы каждой сформированной группы, в том числе выполнять по ним расчёты.