> ## Documentation Index
> Fetch the complete documentation index at: https://docs.1unic.com/odatav4/llms.txt
> Use this file to discover all available pages before exploring further.

# Агрегирование ($apply)

> Группировка, суммы и вычисления на стороне 1С

`$apply` считает итоги на сервере: клиент получает готовые группы, а не миллион строк. Это расширение относительно `standard.odata`, который `$apply` не поддерживает.

## Шаги

| Шаг | Пример |
| - | - |
| `filter` | `filter(Posted eq true)` |
| `groupby` | `groupby((Контрагент_Key))`, по навигационному пути — `groupby((Контрагент/Description))` |
| `aggregate` | `aggregate(Сумма with sum as Итого)`; методы `sum`, `min`, `max`, `average`, `countdistinct`; число строк — `$count as Количество` |
| `compute` | `compute(Сумма mul 1.2 as СуммаСНДС)` |
| `topcount`, `bottomcount` | `topcount(10,Сумма)` |
| `identity` | результат без изменений |

Шаги соединяются через `/`, в цепочке — до 10 шагов.

```http theme={null}
GET /hs/odata/v4/Document_РеализацияТоваровУслуг?$apply=filter(Posted eq true)/groupby((Контрагент/Description),aggregate(СуммаДокумента with sum as Итого))&$orderby=Итого desc&$top=10
```

```json theme={null}
{
  "@odata.context": "https://server/base/hs/odata/v4/$metadata#Document_РеализацияТоваровУслуг(Контрагент,Итого)",
  "value": [
    { "Контрагент": { "Description": "ООО Ромашка" }, "Итого": 1250000 },
    { "Контрагент": { "Description": "ИП Сидоров" }, "Итого": 845300 }
  ]
}
```

Группировка по навигации возвращает вложенный объект, как в примере выше.

## Что работает поверх результата

* К результату применяются `$filter`, `$orderby`, `$select`, `$top`, `$skip` и `$count`.
* Цепочки, которые сохраняют ключ сущности (`filter`, `compute`, `topcount`, `bottomcount`, `identity`), остаются сущностями набора. Для них доступны `$expand` и `$select`, в том числе табличных частей и `RecordSet`.
* `$apply` применяется и к результату виртуальной таблицы регистра (см. [Регистры](/odatav4/read/registers)).

## Как выполняется

Вся цепочка выполняется одним пакетом запросов 1С. Каждый шаг, который меняет состав колонок, ложится во временную таблицу.

## Постраничное чтение

Результат продолжается по `$skiptoken`. У `groupby` метка хранит значения полей группировки (они уникальны), поэтому даже десятки тысяч групп проходятся по `@odata.nextLink` до конца.

Если полей группировки так много или они такие длинные, что условие продолжения не помещается в пределы выражения или ссылка стала бы длиннее 8000 символов, результат продолжается по `$skip`, без предела 10 000. `$skiptoken` к такому результату — `400` с причиной.

## Не поддерживается

* Шаги `concat`, `expand`, `search`, `nest`, `join`, `rollup`, `$all`, `toppercent`, `topsum`, `bottompercent`, `bottomsum` — ответ `501`.
* `$expand` поверх `groupby` и `aggregate` — `501`.
* `any` и `all` по табличной части после шагов — `501`.
* `$apply` внутри `$expand` — `501`.
* `$compute` вне `$apply` — `501`.

Число шагов `$apply` может ограничить профиль доступа — см. [Профили](/odatav4/security/profiles).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.