1
0
mirror of https://github.com/medigor/example-native-api-rs.git synced 2025-06-10 23:58:02 +02:00

edit README.md

This commit is contained in:
medigor 2022-12-07 18:48:47 +03:00
parent 3bd8e7fc42
commit d4b3b18ac7

View File

@ -1,16 +1,18 @@
# example-native-api-rs
Пример внешней компоненты для **1С:Предприятие 8** по технологии **Native API** на языке rust
Пример внешней компоненты для **1С:Предприятие 8** по технологии **Native API** на языке **Rust**
[Документция на ИТС](https://its.1c.ru/db/metod8dev#content:3221:hdoc) |
[Шаблон компоненты на c++ от Infactum](https://github.com/Infactum/addin-template)
[Шаблон компоненты на C++ от Infactum](https://github.com/Infactum/addin-template)
## Преимущества по сравнению с компонентой на c++
* Преимущества самого языка rust и его экосистемы
* Для Windows не требуется msvc, собирается полностью с использованием свободных инструментов
## Преимущества по сравнению с компонентой на C++
* Преимущества самого языка *Rust* и его экосистемы (более современный и безопасный язык, удобный пакетный менеджер)
* Для Windows не требуется msvc (напомню, что организации должны иметь лицензию)
* Собирается полностью с использованием свободных инструментов
* На linux можно собирать для windows, соответственно удобно использовать в CI контейнеры linux
## Обзор
Компоненты по технологии Native API предполагают разработку на языке с++, т.к. компонента должна принимать и возвращать указатели на виртуальные классы c++. Компонента для windows должна собираться только компилятором msvc, а для linux и macos подойдет gcc/clang.
Как известно, взаимодействие *rust* с *c++* из коробки не поддерживается.
Компоненты по технологии *Native API* предполагают разработку на языке *C++*, т.к. компонента должна принимать и возвращать указатели на виртуальные классы *C++*. Компонента для windows должна собираться только компилятором msvc, а для linux и macos подойдет gcc/clang.
Как известно, взаимодействие *Rust* с *C++* из коробки не поддерживается.
Одним из вариантов было использовать [cxx](https://github.com/dtolnay/cxx) или подобные библиотеки. Это также бы потребовало использовать msvc.
@ -18,10 +20,10 @@
На [godbolt](https://godbolt.org/z/KM3jaWMWs) можно посмотреть, как выглядят виртуальные таблицы для разных компиляторов. Виртуальные таблицы *msvc* отличаются от *gcc*/*clang*, при этом *gcc* и *clang* используют одинаковое ABI. Виртуальные таблицы реализованы в объеме достаточном для создания компоненты.
## Описание файлов
* src/lib.rs - корень крейта, здесь располагаются экспортные функции GetClassNames и др.
* src/ffi.rs - в этом модуле всё что связано с взаимодействием, также здесь находится весь небезопасный код.
* src/addin1.rs - здесь непосредственно реализация компоненты, причем весь код безопасный.
* conf1c - конфигурация 1С (выгрузка из конфигуратора 8.3.22), минимальный тестовый код.
* [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* примерно такой код: