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Документа должно быть выведено на форму, сама форма должна быть открыта.

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

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.