1
0
mirror of https://github.com/medigor/example-native-api-rs.git synced 2025-06-06 23:26:13 +02:00
2023-01-04 19:39:33 +03:00
2022-12-07 18:27:07 +03:00
2023-01-04 19:39:33 +03:00
2022-12-07 18:27:07 +03:00
2022-12-07 18:27:07 +03:00
2022-12-07 18:27:07 +03:00

example-native-api-rs

Пример внешней компоненты для 1С:Предприятие 8 по технологии Native API на языке Rust

Документция на ИТС | Шаблон компоненты на C++ от Infactum

Преимущества по сравнению с компонентой на C++

  • Преимущества самого языка Rust и его экосистемы (более современный и безопасный язык, удобный пакетный менеджер)
  • Для Windows не требуется msvc (напомню, что организации должны иметь лицензию)
  • Собирается полностью с использованием свободных инструментов
  • На linux можно собирать для windows, соответственно удобно использовать в CI контейнеры linux

Обзор

Компоненты по технологии Native API предполагают разработку на языке C++, т.к. компонента должна принимать и возвращать указатели на виртуальные классы C++. Компонента для windows должна собираться только компилятором msvc, а для linux и macos подойдет gcc/clang. Как известно, взаимодействие Rust с C++ из коробки не поддерживается.

Одним из вариантов было использовать cxx или подобные библиотеки. Это также бы потребовало использовать msvc.

Другой вариант - вручную реализовать виртуальные таблицы, именно этот вариант и реализован. На godbolt можно посмотреть, как выглядят виртуальные таблицы для разных компиляторов. Виртуальные таблицы msvc отличаются от gcc/clang, при этом gcc и clang используют одинаковое ABI. Виртуальные таблицы реализованы в объеме достаточном для создания компоненты.

Описание файлов

  • src/lib.rs - корень крейта, здесь располагаются экспортные функции GetClassNames и др.
  • src/ffi.rs - в этом модуле всё что связано с взаимодействием, также здесь находится весь небезопасный код.
  • src/addin1.rs - здесь непосредственно реализация компоненты, причем весь код безопасный.
  • conf1c - конфигурация 1С (выгрузка из конфигуратора 8.3.22), минимальный тестовый код.

Разработка

Я использую для разработки VS Code. Отлаживать и тестировать компоненту удобнее всего в файловой базе. Чтобы при нажатии F5 сразу запускалась 1С, нужно поместить в файл .vscode/launch.json примерно такой код:

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "lldb",
            "request": "launch",
            "name": "Debug 1С",
            "program": "путь/к/файлу/1cv8c",
            "args": [
                "/IBName",
                "Test1"
            ],
            "cwd": "${workspaceFolder}",
            "preLaunchTask": "rust: cargo build"
        }
    ]
}

Для разработки на linux я использую виртуальную машину Hyper-V, VS Code подключается по ssh. Чтобы запуск 1С работал из ssh, нужно в конфигурацию запуска добавить:

"env": {"DISPLAY": ":1"}

Для разработки и тестирования также подходит Учебная версия 1С, но версия для windows только x32 (см. следующий раздел). При разработке использовался rust 1.65.

Поддержка платформ

У меня в проде не используется, используйте на свой страх и риск!

  • Windows x64 - тестировал, работает и gnu и msvc.
  • Windows x32 - тестировал, работает и gnu и msvc.
  • Linux x64 - тестировал, работает.
  • Linux x32 - не тестировал, думаю что должно работать.
  • MacOS - не тестировал, думаю должно работать, т.к. работает Linux x64.
  • Android/iOS/веб-клиент - не реализовано и планов таких нет.

Замечания по разработке внешних компонент

  • Самый легкий способ разработать компоненту - вместо нее сделать микросервис с http api. Используйте этот способ в первую очередь.
  • Если вдруг полностью нативный способ (предложенный в этом проекте) не работает, то можно разработать на rust статическую библиотеку(crate-type = "staticlib") и использовать её в проекте c++.
Description
Пример внешней компоненты для 1С:Предприятие 8 по технологии Native API на языке rust
Readme MIT 121 KiB
Languages
Rust 52.8%
1C Enterprise 44.6%
Shell 2.6%