9 个版本

0.10.7 2023年11月2日
0.10.6 2023年11月1日
0.10.5 2023年9月1日
0.10.3 2023年8月29日
0.9.3 2023年8月10日

#61 in #native

Download history 7/week @ 2024-03-13 19/week @ 2024-03-27 37/week @ 2024-04-03 2/week @ 2024-05-22

118 每月下载量

MIT 许可证

63KB
1K SLoC

俄语使用指南可在此查看 此处,并可以就使用提出问题,但请不要在那里留下有关错误的评论,因为那里很难讨论。最好在此存储库中创建 issue。

为简单 1C:Enterprise 平台 Native API 组件开发提供的库,源于此 medigor/example-native-api-rs 的发现

存储库已在 Linux 和 Windows 上进行测试。它也应该在 MacOS 上运行,但没有进行测试。

结构

库分为两个子模块

  • native_api_1c_core 描述了实现 1C:Enterprise Native API 所需的所有内容
  • native_api_1c_macro 提供了一个工具,用于简化组件实现,负责处理 native_api_1c_core::interface::AddInWrapper 属性实现

用法

属性 #[add_in_prop(...)]

  • name - 1C 中的属性名称
  • name_ru - 1C 中的俄语属性名称
  • readable - 属性可以从 1C 中读取
  • writable - 属性可以从 1C 中写入

支持的属性类型:i32f64boolString

函数或过程 #[add_in_func(...)]

  • name - 1C 中的属性名称
  • name_ru - 1C 中的俄语属性名称

输入参数,#[arg(...)],对于每种参数类型必须设置,其中之一

  • Int - i32
  • Float - f64
  • Bool - bool
  • Str - String
  • Date - chrono::DateTime<chrono::FixedOffset>
  • Blob - Vec<u8>

返回值,#[returns(...)] 类型必须设置,可以是以下之一

  • Int - i32
  • Float - f64
  • Bool - bool
  • Str - String
  • Date - chrono::DateTime<chrono::FixedOffset>
  • Blob - Vec<u8>
  • None - () 此外,还可以使用 Result<T, ()>,其中 T 是上述之一。在这种情况下,必须在 #[returns(...)] 属性中设置 result:对于 Result<i32, ()>,则为 #[returns(Int, result)]

示例

# Cargo.toml
[package]
name = "my_addin"
version = "0.1.0"
edition = "2021"

[lib]
crate-type = ["cdylib"]

[dependencies]
utf16_lit = "2.0"
native_api_1c = "0.10.3"
// src/lib.rs
use std::sync::Arc;

use native_api_1c::{native_api_1c_core::ffi::connection::Connection, native_api_1c_macro::AddIn};

#[derive(AddIn)]
pub struct MyAddIn {
    /// connection with 1C, used for calling events
    /// Arc is used to allow multiple threads to access the connection 
    #[add_in_con]
    connection: Arc<Option<&'static Connection>>, 

    /// Property, readable and writable from 1C
    #[add_in_prop(name = "MyProp", name_ru = "МоеСвойство", readable, writable)]
    pub some_prop: i32,

    /// Property, readable from 1C but not writable
    #[add_in_prop(name = "ProtectedProp", name_ru = "ЗащищенноеСвойство", readable)]
    pub protected_prop: i32,

    /// Function, taking one or two arguments and returning a result
    /// In 1C it can be called as:
    ///  ComponentObject.MyFunction(10, 15); // 2nd argument = 15
    ///  ComponentObject.MyFunction(10);     // 2nd argument = 12 (default value)
    /// If function returns an error, but does not panic, then 1C will throw an exception 
    #[add_in_func(name = "MyFunction", name_ru = "МояФункция")]
    #[arg(Int)]
    #[arg(Int, default = 12)]
    #[returns(Int, result)]
    pub my_function: fn(&Self, i32, i64) -> Result<i32, ()>,

    /// Function, taking no arguments and returning nothing 
    #[add_in_func(name = "MyProcedure", name_ru = "МояПроцедура")]
    pub my_procedure: fn(&mut Self),

    /// Private field, not visible from 1C
    private_field: i32,
}

impl MyAddIn {
    pub fn new() -> Self {
        Self {
            connection: Arc::new(None),
            some_prop: 0,
            protected_prop: 50,
            my_function: Self::my_function,
            my_procedure: Self::my_procedure,
            private_field: 100,
        }
    }

    fn my_function(&self, arg: i32, arg_maybe_default: i64) -> Result<i32, ()> {
        Ok(self.protected_prop
            + self.some_prop
            + arg
            + self.private_field
            + arg_maybe_default as i32)
    }

    fn my_procedure(&mut self) {
        self.protected_prop += 1;
    }
}

依赖项

~1.3–2MB
~36K SLoC