Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Кто хорошо знает C++ для интеграции 1С через ВК с Golang

Кто хорошо знает C++ для интеграции 1С через ВК с Golang
Я
   Garykom
 
22.06.19 - 11:58
Собственно хочу реализовать сабж, сделать чтобы на Golang можно было писать внешние компоненты для 1С.
Самое для меня важное это вызов внешнего события в 1С из кода на Golang.

В Golang есть cgo, которое умеет "Calling Go functions from C"
https://github.com/golang/go/wiki/cgo

Но сразу встала трабла что cgo сделано под gcc а не под msvc и с примерами 1С ВК на C++ под VS не хочет.
Пришлось слегка извращаться, причем неявное подключение с линковкой на этапе компиляции не прошло и пришлось использоватья явную через LoadLibrary.

Пока что сделал, скомпилил код на Го в dll с экспортной функцией.
"go build -o awesome.dll -buildmode=c-shared"

Далее взял шаблон ВК для 1С на C++ и подправил там добавив
GoInt a = 1;
GoInt b = 2;
HMODULE hLib;
hLib = LoadLibrary("c:\\Work\\1C\\VNCOMPS\\VNCOMP83\\example\\bind64\\awesome.dll");
if (NULL != hLib)
{
  GoInt(*pFunction)(GoInt, GoInt);
  (FARPROC &)pFunction = GetProcAddress(hLib, "Add");
  long c = (long)pFunction(a, b);;
  swprintf(result, L"%d", c);
  //FreeLibrary(hLib);

} else{
  ::convToShortWchar(&result, L"NULL");
}

Ну и при вызове из 1С этот код успешно отработал и показал сумму 3.

Кстати если FreeLibrary оставить то сеанс 1С выкидывает с ошибкой.

Проблема в том что у меня очень посредственные знания C++ и не могу сам реализовать с лету:
"передача адреса функции в dll для обратного вызова".

Особенно много заморочек ожидаю с преобразованиями типов, между C|C++|Go

Кто может оказать помощь с этим?
 
 
   Garykom
 
1 - 22.06.19 - 12:00
(0)+ Надо из 1С ВК С++ передать в Golang DLL адрес функции для обратного вызова, чтобы например http-сервер на голанге мог передавать полученное в 1С через внешнее событие.

Голанг умеет вин dll испольовать
https://github.com/golang/go/wiki/WindowsDLLs
   Garykom
 
2 - 22.06.19 - 12:02
(0)+ Вызов функций Go из других языков
https://habr.com/ru/company/mailru/blog/324250/
   NorthWind
 
3 - 22.06.19 - 17:30
Вот тут неплохо расписано про коллбэки в С++ https://www.gamedev.ru/code/articles/func_obratnogo_visova
   PloAl
 
4 - 22.06.19 - 17:44
(0) Зачем?
На сервере 1с есть свои http сервисы, и для ВК нет на сервере внешнего события.
   Garykom
 
5 - 22.06.19 - 20:16
(4) Для клиента и мобильного.
   Garykom
 
6 - 22.06.19 - 20:17
(3) Сенкс почитаю.
   PloAl
 
7 - 22.06.19 - 20:33
(5) На клиентах серверная http часть?
Белые ip на каждого и возможно доменные имена?
   Garykom
 
8 - 22.06.19 - 21:24
(7) Нет это ближе к прямому обмену между клиентами и сообщениям/вызовам с сервера на клиент.
Короче дешевая замена "системы взаимодействия" от 1С.

Ну и заодно мобильные приложения смогут друг с другом общаться и все клиенты облегчается подключение внешнего ТО, там будет достаточно http-запросов от него на чем угодно.
   Garykom
 
9 - 22.06.19 - 21:25
(7) Кстати в ipv6 белые ip на каждого и поддоменные имена это вполне реально.
   Garykom
 
10 - 22.06.19 - 22:03
Хотя имхо это 1С пора бы уже в платформу http-сервер встроить причем не только на сервере но и на всех клиентах.

Вроде как в тестовой 8.15 свой встроенный http-сервер уже, но не думаю что на клиентах.
   Garykom
 
11 - 22.06.19 - 22:04
(10) *в тестовой 8.4
   PloAl
 
12 - 22.06.19 - 22:23
(8) Почему не websocket? Там всего один белый и один доменный адрес нужен будет, сервер взаимодействие его использует.
   Garykom
 
13 - 22.06.19 - 22:27
(12) У меня цель заюзать все что дает golang для 1С, а там пофиг ws или http.
   PloAl
 
14 - 22.06.19 - 23:12
Для сервера на Go, не важно на чем написаны клиенты подключающиеся по ws, http. Как пример Docker на Go написан.
   Garykom
 
15 - 22.06.19 - 23:47
(14) Так применять Go как обычный бэк и где 1С выступает клиентом-фронтом уже попробовал и мне понравилось, реально быстро и довольно просто писать то что требуется.

Захотелось использовать силу Golang еще для чего то, в данном случае разные ВК для 1С.
Сча нормально только на C++ и Delphi/Lazarus можно ВК писать, и то С++ не сказал бы что нормально, слишком сложно для вхождения.

Golang же так как умеет компилироваться в dll|so должен по идее подходить замечательно, осталось заставить.
   PloAl
 
16 - 23.06.19 - 11:33
so для android, это точно не быстро. В нескольких статьях по JNI помню было написано, код на c++ в JNI будет выполняться медленнее аналогичного кода на java, если есть возможность написать на java пишите на java. Проверял это утверждение, получение данных в МП заняло 0,8 сек через ВК и 0,08 напрямую интентом в мобильное приложение.
   Garykom
 
17 - 23.06.19 - 15:50
(16) Go как бы не для скорости, по тестам даже Java быстрее.

Кстати https://github.com/golang/go/wiki/Mobile прикольная штука очень напоминающая МП.
Тоже понравилось, достаточно просто приложения под Android и iOS писать, сильно проще чем на Java или на C++.
   PloAl
 
18 - 23.06.19 - 18:18
(17) Речь про дополнение функционала android приложения через JNI, C++.
Не будет на androide сервер на Go быстрее аналогичного сервера на Java.
На ПК Go будет быстрее, но не в мобильном приложении android.

Обычная ВК тоже не самое быстрое решение.
Приложение без ВК и без 1с, но с аналогичным функционалом по тестам почти в два быстрее.
При передаче данных во внешнее событие 1с, надо выделять память в 1с  "m_iMemory->AllocMemory(...." и дублировать туда данные, хорошо если их не много, а если передается большой файл...
   Garykom
 
19 - 23.06.19 - 18:40
(18) https://habr.com/ru/post/260609/

И да мне глубоко пофиг что на передачу больших данных будет тратиться время если это позволит реализовать требуемый но отсутствующий пока в 1С функционал.

И да сам то скомпилированный код на Golang пашет сильно быстрее чем 1С но конечно медленнее чем нативный C++ или Java, хотя и с тонкостями.

На десктопе Java уже сильно оптимизирована и обгоняет сильно Go, всего чуть чуть отставая от C++.
Но вот на мобильных как это ни странно но Go там шустрее чем Java, практически как С++.
   Garykom
 
20 - 23.06.19 - 18:42
(18) Вы ошибаетесь насчет быстродействия Go в сравнении с Java на ПК и на android, все совершенно наоборот как это ни странно, судя по тестам.
   PloAl
 
21 - 23.06.19 - 20:34
(20) Не ошибается тот кто ничего не делает.
По этому тесту java быстрее https://habr.com/ru/post/424649/
или по этим https://stackoverflow.com/questions/51806224/speed-of-golang-vs-java
https://www.pvsm.ru/java/255977

Не имею привычки спорить и что то доказывать.
   Garykom
 
22 - 23.06.19 - 20:44
(21) Ну да на обычном x86 или x86_64 компе С++ и Java быстрее чем Golang, я как бы об этом и написал.
В отличие от вас в (18) где чьи слова "На ПК Go будет быстрее, но не в мобильном приложении android."

Но по тестам и практике на мобильных девайсах под android, Golang там шустрее чем Java в Dalvik или в ART.
Хотя понятно Go там медленней чем нативный C++.
   Garykom
 
23 - 24.06.19 - 05:27
Яхуу почти все получилось, из С++ ВК передается в Go указатель на функцию и код на Go ее успешно вызывает.

Через дикие хаки в Голанге:
/*
#include <stdio.h>

static void invoke(void (*f)()) {
   f();
}
typedef void (*closure)();
*/
import "C"

var AddInFunc unsafe.Pointer
//export goSetCallBack

func goSetCallBack(arg unsafe.Pointer) {
    AddInFunc = arg
    C.invoke(C.closure(AddInFunc))
}


И вот так в С++:
GoInt a = 1;
GoInt b = 2;
void callBack() {
   a = (long)a + 1;
}
typedef HRESULT(CALLBACK* GOFUN)(void*);

//...

GOFUN gofun;
gofun = (GOFUN)GetProcAddress(hLib, "goSetCallBack");
gofun(callBack);
//...


В итоге
Осталось все это допилить до рабочего.
   Garykom
 
24 - 24.06.19 - 05:44
Хм что прикольно можно сделать универсальную ВК для 1С, к которой очень легко подкладывать "плагины" на Go, написанные по определенным правилам на основе шаблона.

Нечто вроде DLL-Loader (и Miracle Native где тоже этот функционал есть) от Abadonna
http://catalog.mista.ru/public/86142/
   Garykom
 
25 - 28.06.19 - 03:32
Работает однако https://i.paste.pics/90eb0add55f02c4df11d9e307662db86.png

Осталось прикрутить цикл ожидания обработки ответа от 1С.
   Сияющий в темноте
 
26 - 28.06.19 - 09:00
Наверное,проще через http сервисы.
хотя,1с упорно делает начатьПолучение для файлов,а вот про асинхронный http запрос слышать не хочет.
поэтому,1с будет висеть там,где любая другая программа успешно отрпботает
   Garykom
 
27 - 28.06.19 - 10:30
(26) Нафик http-сервисы они изменения конфы требуют.
Так у меня если взлетит будет возможность внешней обработкой даже в базовой.
   yavasya
 
28 - 28.06.19 - 10:32
(27) создай один универсальный исходя из входящих параметров
   yavasya
 
29 - 28.06.19 - 10:32
(27) хотя тебе наверно уже не интересно используя 1С
   Сияющий в темноте
 
30 - 28.06.19 - 18:30
Я в базовой ут 10 выходил просто через внешнюю обработку для поддержки ккм онлайн(это такая старая касса,которая товары запрашивала из 1с)но,получается,что обработка мешает работе пользователя,а если он не работает,то прекрасно через XmlHttpRequest идем на сервер,и тсд работает с базой,причем,в режиме long pooling.
 
 Рекламное место пустует
   Garykom
 
31 - 28.06.19 - 18:47
(30) Угу примерно для этого и хочу.
Некий беспроводной сканер через wifi или ТСД, которые с базовой даже могут работать полноценно.

Получая оттуда наименования номенклатуры по ШК и работая с документами.
Причем если просто беспроводной сканер то ACK/NAK заюзать для обратной связи.
   Garykom
 
32 - 28.06.19 - 18:49
(31)+ http-сервер у меня это просто пример такой работы через внешнее событие в 1С, ожидание ответа когда 1С обработает и запишет ответ куда то с тем же полученным номером через внешнее.
А ВК ожидает ответа и как пришел с нужным номером от 1С то отправляет его назад.
   Сияющий в темноте
 
33 - 28.06.19 - 18:51
У меня все было проще,внешняя обработка шлет запрос на сервер,дескать что надо сделать,ответ придет или с запросом от сервера,или сервер скажет еще раз зайди.
   Garykom
 
34 - 28.06.19 - 18:53
(32)+ Точнее даже можно много сканеров или ТСД на одну базовую навесить.
Или несколько своих веб клиентов.
И догадываюсь что это нарушение лицензионного 1С.
   Garykom
 
35 - 28.06.19 - 18:54
(33) Слишком долго и надо во внешней обработке тогда в цикле стучаться на сервер еще внешний.
Тут сервером сама ВК работает по сути и асинхронная работа в 1С.
Пришел запрос через внешнее событие, 1С отработала и отправила ответ через вызов метода ВК, юзер даже не заметит возможно.
   Сияющий в темноте
 
36 - 28.06.19 - 18:55
(34) нарушение будет,если ты обьекты 1с будет на тсд имитировать,а если с данными товаров,то это просто онлайн режим,кассы кем онлайн(не путать с онлайн ккт)работали же с базовой,и никто про лицензии не вспоминал.
   Garykom
 
37 - 28.06.19 - 18:57
(36) Ну некий интерфейс на ТСД то будет с показом данных документа из базовой 1С.
   Garykom
 
38 - 28.06.19 - 18:59
(37)+ Точнее там будет МП обычное, которое через http-соединение дергает мою ВК-сервер.
И к себе сначала номенклатуру затягивает по ШК, затем документ сохраняет а может и прочитать.
   Сияющий в темноте
 
39 - 28.06.19 - 20:08
нужен прокси между ними,чтобы несколько тсд дули в один прокси и все их запросы пакетом в 1с
   Garykom
 
40 - 28.06.19 - 20:18
(39) Golang часть в моей ВК это и есть прокси + веб-сервер в одной коробке.
Пакетом нет смысла, но можно кэширование прикрутить тех же запросов чтобы ответ сразу возвращался.


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.