diff --git a/README.md b/README.md index 166e6b4..fee4e84 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ # Описание Пример внешней компоненты для **1С:Предприятие 8** по технологии **Native API** на языке **Rust**, изначально написанный [пользователем **medigor**](https://github.com/medigor/example-native-api-rs), мною форкнут, т.к. мне не понравилась структура проекта и не доставало имплементации объекта соединения с базой (для отправления внешних и др.). +Стараюсь всё реализовывать идиоматически, насколько хватает времени, желания и знаний, буду рад корректировкам :) + ## Размер .dll Релизная сборка с оптимизациями на размер | Использование библиотеки `ureq` | Без сжатия | Сжатие с помощью [UPX](https://upx.github.io/) | @@ -17,6 +19,77 @@ - MacOS - не тестировал. +## Пример части кода, описывающего компоненту + +```rust +impl MyAddInDescription { + pub fn new() -> Self { + Self { + name: &utf16_null!("MyAddIn"), // имя класса в 1С + connection: Arc::new(None), + functions: Self::generate_func_list(), + props: Self::generate_prop_list(), + + some_prop_container: 0, + } + } +} + +impl MyAddInDescription { + pub fn generate_func_list() -> Vec { + vec![ + FunctionListElement { + description: ComponentFuncDescription::new::<0>( // количество аргументов + &["Итерировать", "Iterate"], // название свойства на русском и английском языках + false, // возвращает значения + &[], // значения по умолчанию, Option + ), + callback: Self::iterate, // функция обработчик + }, + ] + } + + pub fn generate_prop_list() -> Vec { + vec![PropListElement { + description: ComponentPropDescription { + names: &["Property", "Свойство"], // название свойства на русском и английском языках + readable: true, // 1С может читать значение + writable: true, // 1С может записывать значение + }, + get_callback: Some(Self::get_prop), // функция обработчик чтения значения + set_callback: Some(Self::set_prop), // функция обработчик записи значения + }] + } + + fn iterate( + &mut self, + _params: &[ParamValue], + ) -> Result> { + if self.some_prop_container >= 105 { + return Err(eyre!("Prop is too big")); + } + self.some_prop_container += 1; + log::info!("Prop is now {}", self.some_prop_container); + Ok(None) + } + + fn get_prop(&self) -> Option { + Some(ParamValue::I32(self.some_prop_container)) + } + + fn set_prop(&mut self, value: &ParamValue) -> bool { + match value { + ParamValue::I32(val) => { + self.some_prop_container = *val; + true + } + _ => false, + } + } +} +``` + +