> ## 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.

# Rust-компонента

> Внешняя компонента OData4Native: что ускоряет, как включается и как собрать её из исходников.

В расширение встроена внешняя компонента **OData4Native**, написанная на Rust (Native API). Она выполняет самые
нагруженные части работы сервиса быстрее, чем код на встроенном языке. При этом её результат **побайтно** совпадает с
результатом встроенного языка: у каждой части есть общая с языком 1С эталонная выборка примеров.

Компонента уже упакована в общий макет расширения. Устанавливать Rust или что-то ещё для работы не нужно.

## Что делает компонента

| Переключатель (вкладка «Движки») | Что делает | По умолчанию |
| - | - | - |
| Выдача JSON | Пишет текст ответов чтения: коллекции, сущности, ответы записи и операций `$batch` | **Компонента** |
| Разбор тел | Разбирает JSON-тела записи и `$batch` (JSON и `multipart/mixed`) | язык 1С |
| Вывод `$metadata` | Пишет CSDL XML и JSON по описанию модели | язык 1С |
| Использовать внешнюю компоненту для разбора | Разбирает параметры запроса: `$filter`, `$orderby`, `$select`, `$expand`, `$apply` | выключено |

У переключателей три режима:

* **BSL** — работает только встроенный язык.
* **Компонента** — работает компонента. При любом сбое (исключение, паника, неизвестный тип) ответ строится на языке
  1С, а в журнал регистрации пишется событие `OData4.Компонента` с уровнем «Ошибка». Клиент сбоя не замечает.
* **Сверка** — работают оба движка, клиент получает ответ языка 1С. Каждое расхождение пишется в журнал регистрации:
  длины, SHA-256 и место первого различия. Режим нужен, чтобы проверить компоненту на своей базе перед включением.
  Он вдвое нагружает сервер, поэтому в работе его не держат.

Свойства-хранилища, описания типов и точки маршрута бизнес-процессов компонента не выдаёт. Ответ, в котором они
есть, целиком строится на языке 1С.

## Выигрыш

Замеры на базе со 100 тыс. документов (1 млн строк табличной части) и около 1 млн записей в регистрах, файловая база,
Apache на той же машине:

| Замер | Язык 1С | Компонента |
| - | -: | -: |
| Страница из 1000 документов с табличными частями | 9,1 с | **1,5 с** |
| Все документы (3,5 ГБ, 101 страница) | 992 с | **161 с** |
| Справочник целиком, 100 тыс. элементов | 47,9 с | **11,7 с** |
| `Balance()` регистра бухгалтерии | 0,79 с | **0,23 с** |
| Записи регистра накопления целиком, 1 млн | 853 с | **471 с** |

Разбор тел ускоряет только большие пакеты `multipart/mixed`: пакет из 1000 операций разбирается за 36 мс вместо
120 мс. Вывод `$metadata` компонентой занимает около 0,46 с вместо 0,75 с на первом запросе.

Словарь типов, перечислений и смещений пояса базы компонента строит один раз на процесс веб-сервера, около 1,4 с.

## Требования

* **Расширение без безопасного режима.** В безопасном режиме платформа запрещает подключать внешние компоненты.
  Тогда поля режимов на вкладке «Движки» недоступны и всё выполняет встроенный язык: сервис работает, только
  медленнее. Снять флажок «Безопасный режим» можно в списке расширений конфигурации (подробнее — в разделе
  [Установка](/odatav4/install/extension)).
* Платформы: **Windows x86 и x64**, **Linux x86 и x64** (glibc 2.17 и новее).
* Состояние компоненты (подключена или нет, причина) показано на вкладке «Движки».

<Frame caption="Вкладка «Движки»: режимы выдачи и разбора и состояние компоненты">
  <img src="https://mintcdn.com/o-data-v4/8iesiGXq06VGcZxz/images/admin/settings-engines.png?fit=max&auto=format&n=8iesiGXq06VGcZxz&q=85&s=263d2401073ba76422145171e1ff336a" alt="Вкладка «Движки»: режимы выдачи и разбора и состояние компоненты" width="1094" height="680" data-path="images/admin/settings-engines.png" />
</Frame>

## Сборка из исходников

Исходники лежат в каталоге `native` репозитория:

* `odata4_core` — разбор параметров, выдача, тела и CSDL, без зависимостей от 1С;
* `odata4_addin` — обёртка Native API.

Готовый макет в репозитории уже собран. Пересобирать его нужно, только если вы меняете компоненту.

Что нужно для сборки:

* [Rust](https://rustup.rs) 1.87 и новее;
* для Windows x86 — mingw-w64;
* для Linux — [Zig](https://ziglang.org) и `cargo-zigbuild`.

```powershell theme={null}
# Собрать все цели, для которых установлены инструменты, и обновить макет в src/cfe
powershell -NoProfile -ExecutionPolicy Bypass -File native\pack.ps1

# Сборка для релиза: ошибка, если какую-то цель собрать не удалось
powershell -NoProfile -ExecutionPolicy Bypass -File native\pack.ps1 -RequireAll
```

Скрипт кладёт ZIP с библиотеками и `manifest.xml` в `src/cfe/CommonTemplates/OData4_Компонента/Ext/Template.bin`.
Цели, для которых нет инструментов, он печатает как `SKIP` и не включает в манифест. После сборки загрузите
расширение из `src/cfe` заново.


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