You've already forked native_api_1c_core
readme upd
This commit is contained in:
105
README.md
105
README.md
@ -1,72 +1,41 @@
|
||||
# example-native-api-rs
|
||||
Пример внешней компоненты для **1С:Предприятие 8** по технологии **Native API** на языке **Rust**
|
||||
# Описание
|
||||
Пример внешней компоненты для **1С:Предприятие 8** по технологии **Native API** на языке **Rust**, изначально написанный [пользователем **medigor**](https://github.com/medigor/example-native-api-rs), мною форкнут, т.к. мне не понравилась структура проекта и не доставало имплементации объекта соединения с базой (для отправления внешних и др.).
|
||||
|
||||
[Документция на ИТС](https://its.1c.ru/db/metod8dev#content:3221:hdoc) |
|
||||
[Шаблон компоненты на C++ от Infactum](https://github.com/Infactum/addin-template)
|
||||
|
||||
## Преимущества по сравнению с компонентой на C++
|
||||
* Преимущества самого языка *Rust* и его экосистемы (более современный и безопасный язык, удобный пакетный менеджер)
|
||||
* Для Windows не требуется msvc (напомню, что организации должны иметь лицензию)
|
||||
* Собирается полностью с использованием свободных инструментов
|
||||
* На linux можно собирать для windows, соответственно удобно использовать в CI контейнеры linux
|
||||
|
||||
## Обзор
|
||||
Компоненты по технологии *Native API* предполагают разработку на языке *C++*, т.к. компонента должна принимать и возвращать указатели на виртуальные классы *C++*. Компонента для windows должна собираться только компилятором msvc, а для linux и macos подойдет gcc/clang.
|
||||
Как известно, взаимодействие *Rust* с *C++* из коробки не поддерживается.
|
||||
|
||||
Одним из вариантов было использовать [cxx](https://github.com/dtolnay/cxx) или подобные библиотеки. Это также бы потребовало использовать msvc.
|
||||
|
||||
Другой вариант - вручную реализовать виртуальные таблицы, именно этот вариант и реализован.
|
||||
На [godbolt](https://godbolt.org/z/KM3jaWMWs) можно посмотреть, как выглядят виртуальные таблицы для разных компиляторов. Виртуальные таблицы *msvc* отличаются от *gcc*/*clang*, при этом *gcc* и *clang* используют одинаковое ABI. Виртуальные таблицы реализованы в объеме достаточном для создания компоненты.
|
||||
|
||||
## Описание файлов
|
||||
* [src/lib.rs](src/lib.rs) - корень крейта, здесь располагаются экспортные функции GetClassNames и др.
|
||||
* [src/ffi.rs](src/ffi.rs) - в этом модуле всё что связано с взаимодействием, также здесь находится весь небезопасный код.
|
||||
* [src/addin1.rs](src/addin1.rs) - здесь непосредственно реализация компоненты, причем весь код безопасный.
|
||||
* [conf1c](conf1c) - конфигурация 1С (выгрузка из конфигуратора 8.3.22), минимальный тестовый код.
|
||||
|
||||
## Разработка
|
||||
Я использую для разработки VS Code. Отлаживать и тестировать компоненту удобнее всего в файловой базе. Чтобы при нажатии F5 сразу запускалась 1С, нужно поместить в файл *.vscode/launch.json* примерно такой код:
|
||||
```json
|
||||
{
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"type": "lldb",
|
||||
"request": "launch",
|
||||
"name": "Debug 1С",
|
||||
"program": "путь/к/файлу/1cv8c",
|
||||
"args": [
|
||||
"/IBName",
|
||||
"Test1"
|
||||
],
|
||||
"cwd": "${workspaceFolder}",
|
||||
"preLaunchTask": "rust: cargo build"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
Первоначально возможно нужно использовать параметр:
|
||||
```json
|
||||
"preLaunchTask": "${defaultBuildTask}"
|
||||
```
|
||||
Для разработки на linux я использую виртуальную машину Hyper-V, VS Code подключается по ssh. Чтобы запуск 1С работал из ssh, нужно в конфигурацию запуска добавить:
|
||||
```json
|
||||
"env": {"DISPLAY": ":1"}
|
||||
```
|
||||
Для разработки и тестирования также подходит [Учебная версия 1С](https://online.1c.ru/catalog/free/learning.php), но версия для windows только x32.
|
||||
При разработке использовался rust 1.66.
|
||||
## Размер .dll
|
||||
Релизная сборка с оптимизациями на размер
|
||||
| Использование библиотеки `ureq` | Без сжатия | Сжатие с помощью [UPX](https://upx.github.io/) | | |
|
||||
| ------------------------------- | ---------- | ---------------------------------------------- | --- | --- |
|
||||
| Да | 243200 B | 115200 B | | |
|
||||
| Нет | 1379328 B | 738816 B | | |
|
||||
| | | | | |
|
||||
|
||||
## Поддержка платформ
|
||||
У меня в проде не используется, используйте на свой страх и риск!
|
||||
- Windows x64 - тестировал, работает и gnu и msvc.
|
||||
- Windows x32 - тестировал, работает и gnu и msvc.
|
||||
- Linux x64 - тестировал, работает.
|
||||
- Linux x32 - не тестировал, думаю что должно работать.
|
||||
- MacOS - не тестировал, думаю должно работать, т.к. работает Linux x64.
|
||||
- Android/iOS/веб-клиент - не реализовано и планов таких нет.
|
||||
- Windows x64 - msvc работает, gnu не тестировал
|
||||
- Windows x32 - msvc работает, gnu не тестировал
|
||||
- Linux x64 - не тестировал.
|
||||
- Linux x32 - не тестировал.
|
||||
- MacOS - не тестировал.
|
||||
|
||||
## Замечания по разработке внешних компонент
|
||||
- Самый легкий способ разработать компоненту - вместо нее сделать микросервис с http api. Используйте этот способ в первую очередь.
|
||||
- Если вдруг полностью нативный способ (предложенный в этом проекте) не работает, то можно разработать на rust статическую библиотеку(crate-type = "staticlib") и использовать её в проекте c++.
|
||||
- Для веб-клиента можно попробовать использовать wasm в ПолеHtmlДокумента, см. https://developer.mozilla.org/en-US/docs/WebAssembly/Rust_to_wasm. Из плюсов - не требуется установка внешних компонент, из минусов - ПолеHtmlДокумента должно быть выведено на форму, сама форма должна быть открыта.
|
||||
|
||||
|
||||
|
||||
|
||||
#### Другие ресурсы
|
||||
* [Документция на ИТС](https://its.1c.ru/db/metod8dev#content:3221:hdoc)
|
||||
* [Шаблон компоненты на C++ от Infactum](https://github.com/Infactum/addin-template)
|
||||
|
||||
>## Далее сказанное [изначальным автором](https://github.com/medigor/example-native-api-rs)
|
||||
>## Преимущества по сравнению с компонентой на C++
|
||||
>* Преимущества самого языка *Rust* и его экосистемы (более современный и безопасный язык, удобный пакетный менеджер)
|
||||
>* Для Windows не требуется msvc (напомню, что организации должны иметь лицензию)
|
||||
>* Собирается полностью с использованием свободных инструментов
|
||||
>* На linux можно собирать для windows, соответственно удобно использовать в CI контейнеры linux
|
||||
>
|
||||
>## Обзор
|
||||
>Компоненты по технологии *Native API* предполагают разработку на языке *C++*, т.к. компонента должна принимать и возвращать указатели на виртуальные классы *C++*. Компонента для windows должна собираться только компилятором msvc, а для linux и macos подойдет gcc/clang.
|
||||
>Как известно, взаимодействие *Rust* с *C++* из коробки не поддерживается.
|
||||
>
|
||||
>Одним из вариантов было использовать [cxx](https://github.com/dtolnay/cxx) или подобные библиотеки. Это также бы потребовало использовать msvc.
|
||||
>
|
||||
>Другой вариант - вручную реализовать виртуальные таблицы, именно этот вариант и реализован.
|
||||
На [godbolt](https://godbolt.org/z/KM3jaWMWs) можно посмотреть, как выглядят виртуальные таблицы для разных компиляторов. Виртуальные таблицы *msvc* отличаются от *gcc*/*clang*, при этом *gcc* и *clang* используют одинаковое ABI. Виртуальные таблицы реализованы в объеме достаточном для создания компоненты.
|
Reference in New Issue
Block a user