Giter Site home page Giter Site logo

medigor / example-native-api-rs Goto Github PK

View Code? Open in Web Editor NEW
22.0 4.0 7.0 48 KB

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

License: MIT License

1C Enterprise 43.03% Rust 53.50% Shell 3.47%
1c-enterprise rust 1c native-api addin-for-1c addin1c

example-native-api-rs's Introduction

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. Виртуальные таблицы реализованы в объеме достаточном для создания компоненты.

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

пример компоненты:

  • lib.rs - корень крейта, здесь располагаются экспортные функции GetClassNames и др.
  • addin1.rs - реализация компоненты с помощью низкоуровнего интерфейса, причем весь код безопасный.
  • addin2.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"
        }
    ]
}

Первоначально возможно нужно использовать параметр:

"preLaunchTask": "${defaultBuildTask}"

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

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

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

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

У меня в проде не используется, но в тестах использовал, проблем не замечено, также производные разработки тоже успешно используются.

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

Сборка без установки Rust в контейнере

Собрать можно в контейнере с помощью скриптов: build-with-docker-linux и build-with-docker-windows, требуется установленный podman или docker. Скрипты не предназначены для CI, а необходимы лишь для одноразовой сборки, чтобы пощупать технологию.

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

  • Самый легкий способ разработать компоненту - вместо нее сделать микросервис с http api. Используйте этот способ в первую очередь.
  • Если вдруг полностью нативный способ (предложенный в этом проекте) не работает, то можно разработать на rust статическую библиотеку(crate-type = "staticlib") и использовать её в проекте c++.
  • Для веб-клиента можно попробовать использовать wasm в ПолеHtmlДокумента, см. https://developer.mozilla.org/en-US/docs/WebAssembly/Rust_to_wasm. Из плюсов - не требуется установка внешних компонент, из минусов - ПолеHtmlДокумента должно быть выведено на форму, сама форма должна быть открыта.

Альтернативы

example-native-api-rs's People

Contributors

medigor avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.