Sebekerga / native_api_1c

Crate for simple implementation of Component for Native API 1C:Enterprise written in rust
https://crates.io/crates/native_api_1c
62 stars 13 forks source link

Проблема на Линукс #3

Closed AleksandrSmith7 closed 1 year ago

AleksandrSmith7 commented 1 year ago

Снимок экрана от 2023-08-31 10-21-17 Добрый день на Линукс так и не хочет работать библиотека, не могу понять в чем дело. Ubuntu 22.04.3 LTS Тестил на платформе для Линукс. 1С:Предприятие 8.3, учебная версия (8.3.23.1688) &НаКлиенте Процедура НаписатьСообщение(Команда) Попытка НачатьУстановкуВнешнейКомпоненты(,"ОбщийМакет.VK"); Сообщить("ОК");
Исключение Сообщить("Нет") КонецПопытки;
ПодключитьВнешнююКомпонентуАсинх("ОбщийМакет.VK","Test2",ТипВнешнейКомпоненты.Native); ВК= Новый("AddIn.Test2.Test2"); Результат = ВК.ОбработатьДанные("Тел","ФИО"); Сообщить (Результат); КонецПроцедуры Результат на скриншоте Описание ошибки: Тип не определен (AddIn.Test2.Test2) {Документ.СвязьСКлиентом.Форма.ФормаДокумента.Форма(26)}:ВК= Новый("AddIn.Test2.Test2");

[ОшибкаВоВремяВыполненияВстроенногоЯзыка, ОшибкаИспользованияВстроенногоЯзыка]

Тестовый код

use std::{ // fs::{metadata, File}, // io::Read, sync::Arc, }; use native_api_1c::{ native_api_1c_core::ffi::connection::Connection, native_api_1c_macro::AddIn };

[derive(AddIn)]

pub struct Test2 {

[add_in_con] // соединение с 1С для вызова внешних событий

connection: Arc<Option<&'static Connection>>, // Arc для возможности многопоточности 

#[add_in_func(name = "Test2", name_ru = "ОбработатьДанные")] 
#[arg(Str)]
#[arg(Str)] 
#[returns(Str, result)] 
read_bytes: fn(&Self, String, String) -> Result<String, Box<dyn std::error::Error>>, 

}

impl Test2 { pub fn new() -> Self { Self { connection: Arc::new(None), read_bytes: Self::read_bytes, } }

pub fn read_bytes(&self, imya: String, telefon: String) -> Result<String, Box<dyn std::error::Error>> { 
    let k=" Взаимодействие раст и 1С работает".to_string();
    let f=imya+&telefon+&k;
    Ok(f) 
} 

}

Sebekerga commented 1 year ago

Пару моментов: 1) Обверните пж в кодовые блоки, а то читается тяжело. Пример 2) Можете так же приложить ваш файл Cargo.toml? 3) И результат команды cargo expand > expand.rs (сохранится в файл expand.rs)

По возможности так же кидайте длинные файлы под спойлер. Пример:

<details>
  <summary>Кодовый блок под сполйером</summary>
  Описание

  ```rust
  "Ваш длинный кусок кода"



То, что у вас не работает - странно, давайте разбираться. Я не тестил на бубунте, тестил только на манжаре, но не думаю, что там есть какие-то существенно влияющие отличия, так что скорее всего какая-то бага
Sebekerga commented 1 year ago

image

У меня вроде б завелся ваш код, хотя обращаться по имени процедуры "ОбработатьДанные" получается почему-то через раз (мб из-за языка системы или чего-то еще), но в любом случае, у вас ошибка не в этом. Поэтому будем смотреть дальше

AleksandrSmith7 commented 1 year ago

Файлы для разбора.zip Добавил все файлы в архив. Если хотите могу предоставить Анидеск например. Спасибо за замечания, учту, я на гит новичок.

Sebekerga commented 1 year ago

Да ничего страшного :)

Я кажется увидел у вас проблему в коде на стороне 1С:

ПодключитьВнешнююКомпонентуАсинх("ОбщийМакет.VK","Test2",ТипВнешнейКомпоненты.Native);
ВК = Новый("AddIn.Test2.Test2");

Вы вызываете асинхронную функцию ПодключитьВнешнююКомпонентуАсинх, но не ожидаете ее завершения, после сразу же пытаетесь создать новый объект компоненты. Добавьте оператор Ждать:

  Ждать ПодключитьВнешнююКомпонентуАсинх("ОбщийМакет.VK","Test2",ТипВнешнейКомпоненты.Native);
//^^^^^
ВК = Новый("AddIn.Test2.Test2");

Если это не исправит проблему, будем копать дальше :)

AleksandrSmith7 commented 1 year ago

Все оказалось проще чем я думал image Нужно было включить режим использования синхронных вызовов в конфигурации. Спасибо за помощь) Работает все на Линукс.

Sebekerga commented 1 year ago

Отлично