|
пример внешней компоненты NativeAPI | ☑ | ||
---|---|---|---|---|
0
тарам пам пам
16.07.16
✎
16:39
|
Разбираюсь с примером внешней компоненты с использованием NativeAPI с ИТС.
В платформе для строк используется двухбайтовый тип WCHAR_T, который под windows объявлен как wchar_t, а под linux - как uint16_t (потому как размер wchar_t в linux и macos равен 4 байтам). В примере компоненты поэтому все строки объявлены как wchar_t* и при передаче в платформу конвертируются в WCHAR_T с помощью convToShortWchar и convFromShortWchar. Также в примере еще непонятно зачем нужный класс WcharWrapper. Хочу определить WCHAR_T как char16_t (добавлен в C++11), чтобы избавиться от различного кода для строк под windows и linux и избавиться от необходимости преобразования строк. Не будет ли каких-либо подводных граблей при замене? Второй вопрос - в примере очень неудобно написано взаимодействие с платформой (например, описание метода компоненты раскидано в куче мест - это enum Methods, g_MethodNames, g_MethodNamesRu, GetNMethods(), FindMethod(), GetMethodName(), GetNParams(), GetParamDefValue(), HasRetVal(), CallAsProc(), CallAsFunc()). Может есть какая-то обертка над всем этим с более человеческим лицом? .net не предлагать - компонента нужна простейшая, не хочется лишних зависимостей тащить. |
|||
1
Garykom
гуру
16.07.16
✎
17:27
|
Вот как выяснится отпишитесь тут плиз...
|
|||
2
Serginio1
16.07.16
✎
18:35
|
От зависимостей ты никуда не уйдешь. А вот писать просто писать код например на C#, а не обсасывать всю эту кучу методов. Но в любом случае посмтри
Кроссплатформенное использование классов .Net в 1С через Native ВК. Но мне проще работать так typedef bool(*CallAsFunc) (void * , tVariant* , tVariant* , const long); class MethodsArray { public: wstring MethodName; CallAsFunc Method; long ParamCount; BOOL HasRetValue; void Init(wstring MethodName, CallAsFunc Method, long ParamCount, BOOL HasRetValue); }; MethodsArray[0].Init(L"УстановитьСсылку", SetNetObjectRef, 2, false); MethodsArray[1].Init(L"ПолучитьСсылку", GetNetObjectRef, 0, true); и заменить все вызовы //---------------------------------------------------------------------------// long BaseNetObjectToNative::FindMethod(const WCHAR_T* wsMethodName) { MethodName = wsMethodName; long res= findMethod(MethodName); if (res==0 && NetProvider == nullptr) return -1; LastParamsIndex = -1; MethodName = wsMethodName; return res; } //---------------------------------------------------------------------------// const WCHAR_T* BaseNetObjectToNative::GetMethodName(const long lMethodNum, const long lMethodAlias) { return 0;//MethodName.c_str(); } //---------------------------------------------------------------------------// long BaseNetObjectToNative::GetNParams(const long lMethodNum) { if (lMethodNum==0) return NetProvider->pGetNParams(IdNetObject, MethodName.c_str()); else return CurrentElem->ParamCount; } //---------------------------------------------------------------------------// bool BaseNetObjectToNative::GetParamDefValue(const long lMethodNum, const long lParamNum, tVariant *pvarParamDefValue) { if (LastParamsIndex == -1) LastParamsIndex = lParamNum; pvarParamDefValue->vt = VTYPE_I4; pvarParamDefValue->lVal = 0; return true; } //---------------------------------------------------------------------------// bool BaseNetObjectToNative::HasRetVal(const long lMethodNum) { if (lMethodNum > 0) return CurrentElem->HasRetValue; return true; } //---------------------------------------------------------------------------// bool BaseNetObjectToNative::CallAsProc(const long lMethodNum, tVariant* paParams, const long lSizeArray) { if (lMethodNum==0) { SetMemoryManager(); if (LastParamsIndex == -1) LastParamsIndex = lSizeArray; return NetProvider->pCallAsFunc(IdNetObject, MethodName.c_str(), 0, paParams, LastParamsIndex); } return CurrentElem->Method(this, 0, paParams, lSizeArray); } //---------------------------------------------------------------------------// bool BaseNetObjectToNative::CallAsFunc(const long lMethodNum, tVariant* pvarRetValue, tVariant* paParams, const long lSizeArray) { pvarRetValue->vt = VTYPE_NULL; pvarRetValue->lVal = 0; if (lMethodNum == 0) { SetMemoryManager(); if (LastParamsIndex == -1) LastParamsIndex = lSizeArray; return NetProvider->pCallAsFunc(IdNetObject, MethodName.c_str(), pvarRetValue, paParams, LastParamsIndex); } return CurrentElem->Method(this, pvarRetValue, paParams, lSizeArray); } bool NetObjectToNative::SetNetObjectRef(void * Self, tVariant * pvarRetValue, tVariant * paParams, const long lSizeArray) { tVariant * CurParam = paParams; NetObjectToNative* self = (NetObjectToNative*)Self; self->NetProvider = (ManagedDomainLoader*)CurParam->lVal; CurParam++; if (CurParam->vt == VTYPE_PWSTR) { wchar_t* curstr = CurParam->pwstrVal; self->RefNetObject = curstr; curstr += 13; wstring temp = curstr; self->IdNetObject = stol(temp); return true; } return false; } |
|||
3
Serginio1
16.07.16
✎
18:51
|
Если поубирать все вызовы .Net То это превращается
и заменить все вызовы //---------------------------------------------------------------------------// long BaseNetObjectToNative::FindMethod(const WCHAR_T* wsMethodName) { long res= findMethod(MethodName); } //---------------------------------------------------------------------------// const WCHAR_T* BaseNetObjectToNative::GetMethodName(const long lMethodNum, const long lMethodAlias) { return 0;//MethodName.c_str(); } //---------------------------------------------------------------------------// long BaseNetObjectToNative::GetNParams(const long lMethodNum) { return CurrentElem->ParamCount; } bool BaseNetObjectToNative::HasRetVal(const long lMethodNum) { return CurrentElem->HasRetValue; } //---------------------------------------------------------------------------// bool BaseNetObjectToNative::CallAsProc(const long lMethodNum, tVariant* paParams, const long lSizeArray) { return CurrentElem->Method(this, 0, paParams, lSizeArray); } //---------------------------------------------------------------------------// bool BaseNetObjectToNative::CallAsFunc(const long lMethodNum, tVariant* pvarRetValue, tVariant* paParams, const long lSizeArray) { return CurrentElem->Method(this, pvarRetValue, paParams, lSizeArray); } bool NetObjectToNative::SetNetObjectRef(void * Self, tVariant * pvarRetValue, tVariant * paParams, const long lSizeArray) { tVariant * CurParam = paParams; NetObjectToNative* self = (NetObjectToNative*)Self; self->NetProvider = (ManagedDomainLoader*)CurParam->lVal; CurParam++; if (CurParam->vt == VTYPE_PWSTR) { wchar_t* curstr = CurParam->pwstrVal; self->RefNetObject = curstr; curstr += 13; wstring temp = curstr; self->IdNetObject = stol(temp); return true; } return false; } // У меня мало методов так, что можно и простым поиском //Да и знаний в С++ всего 2 недели long BaseNetObjectToNative::findMethod(wstring MethodName) { for(long i=0; i<SizeArray;i++) if (pMethodsArray[i].MethodName == MethodName) { CurrentElem = &pMethodsArray[i]; return i + 1; } return 0; } |
|||
4
Garykom
гуру
16.07.16
✎
18:57
|
(2) (3) Плиз замечания:
1. Используй теги
2. Вот эти простыни кода даже мне знающему c# (отлично) и с++ (средненько практики мало было) ну ничего совершенно не говорят на беглый взгляд. Лучше бы выкинуть начинку внутри, оставив только "заголовки" методов и комментарии "а зачем оно". Даже на примере всего одного метода разобрать. ЗЫ Копипастить код это не всегда ответ который просят. |
|||
5
Garykom
гуру
16.07.16
✎
18:59
|
(4) + Теги "["+"1C"+"]" и "["+"/"+"1C"+"]" без пробелов и кавычек или срабатывает
|
|||
6
orefkov
16.07.16
✎
19:00
|
Насчёт WCHAR_T через char16_t - называй её как хочешь - сути это не изменит. Чем это тебе поможет избежать преобразования строк, если все внешние библиотеки под линуксом ждут 4ых-байтовый юникод? Если под линуксом штатные wcslen и wcsstr принимают на вход wchar_t, и соответственно ждут четырёхбайтовые символы - как тебе поможет использование псевдонима для двухбайтовых символов?
Насчёт сложности работы с методами - в чём сложность? Реализовать банальнейший интерфейс с меньше чем десятком методов? За то время, пока тут сидишь, уже можно было бы сделать. |
|||
7
ProgAL
16.07.16
✎
19:18
|
(3) На днях звонили из кадрового агенства, искали 1эсника со знанием С#. Сказали в издательский дом "Коммерсант" ищут. Вроде Вы тоже недавно искали работу, можете через сайт коммерсанта сбросить свое резюме, как вариант.
|
|||
8
orefkov
16.07.16
✎
19:19
|
А вообще Native API от 1С - какой-то полуобрезок, не позволяющий работать с объектами 1С. Только простые типы данных гонять туда-сюда. Очевидно, не задумывался как средство какого-то расширения, а просто чтобы под линуксом торговое оборудование подключать. Этим круг задач и возможностей и ограничен.
|
|||
9
Serginio1
16.07.16
✎
19:22
|
Создадим класс
typedef bool(*CallAsFunc) (void * , tVariant* , tVariant* , const long); class MethodsArray { public: wstring MethodName; // Имя метода из 1С CallAsFunc Method; // Ссылка на реальный метод long ParamCount; // Количество параметров BOOL HasRetValue;// Это функция // Метод инициализации полейе void Init(wstring MethodName, CallAsFunc Method, long ParamCount, BOOL HasRetValue); }; Теперь мы можеи в базовом классе указать MethodsArray* pMethodsArray; // Ссылка на массив методов int SizeArray;// Размер массив Затем в классе наследнике определить реальный массив MethodsArray MethodsArray[2]; А в конструкторе pMethodsArray = MethodsArray; // получаем ссылку на реальный массив SizeArray = 2; // Инициализируем массив задавая ссылки на реальные методы pMethodsArray->Init(L"СоздатьОбертку", CreateDamain, 3, true); MethodsArray[1].Init(L"ЗагрузитьDLL", LoadDLL, 1, true); |
|||
10
Serginio1
16.07.16
✎
19:25
|
В ьазовом классе так же определим ссылку на текущий метод
MethodsArray* CurrentElem; Который будем получать при поиске long BaseNetObjectToNative::findMethod(wstring MethodName) { for(long i=0; i<SizeArray;i++) if (pMethodsArray[i].MethodName == MethodName) { CurrentElem = &pMethodsArray[i]; return i + 1; } return -1; } Теперь мы можем не трогать кучу методов |
|||
11
ProgAL
16.07.16
✎
19:29
|
(10) Вы прочитали (7) ?
|
|||
12
Serginio1
16.07.16
✎
19:29
|
//---------------------------------------------------------------------------//
long BaseNetObjectToNative::FindMethod(const WCHAR_T* wsMethodName) { long res= findMethod(MethodName); } //---------------------------------------------------------------------------// const WCHAR_T* BaseNetObjectToNative::GetMethodName(const long lMethodNum, const long lMethodAlias) { return 0//MethodName.c_str(); } //---------------------------------------------------------------------------// long BaseNetObjectToNative::GetNParams(const long lMethodNum) { return CurrentElem->ParamCount; } bool BaseNetObjectToNative::HasRetVal(const long lMethodNum) { return CurrentElem->HasRetValue; } //---------------------------------------------------------------------------// bool BaseNetObjectToNative::CallAsProc(const long lMethodNum, tVariant* paParams, const long lSizeArray) { return CurrentElem->Method(this, 0, paParams, lSizeArray); } //---------------------------------------------------------------------------// bool BaseNetObjectToNative::CallAsFunc(const long lMethodNum, tVariant* pvarRetValue, tVariant* paParams, const long lSizeArray) { return CurrentElem->Method(this, pvarRetValue, paParams, lSizeArray); } А писать только реальные методы bool NetObjectToNative::SetNetObjectRef(void * Self, tVariant * pvarRetValue, tVariant * paParams, const long lSizeArray) { tVariant * CurParam = paParams; NetObjectToNative* self = (NetObjectToNative*)Self; и не забывать прописывать данные о методах в конструкторе и классе. |
|||
13
Serginio1
16.07.16
✎
19:30
|
(10) Большое спасибо! Сброшу.
|
|||
14
Asmody
16.07.16
✎
19:31
|
Serginio1, положи уже свой код на pastebin или gist. Не насилуй форум своим C#.
|
|||
15
Serginio1
16.07.16
✎
19:33
|
(8) Ну я использую через строковую ссылку. И написал здесь
http://catalog.mista.ru/public/534901/ https://habrahabr.ru/post/304542/ https://habrahabr.ru/post/304482/ Но 1С на это глубоко ... |
|||
16
Serginio1
16.07.16
✎
19:33
|
(14) Интересно, а где ты тут C# то увидел?
|
|||
17
Asmody
16.07.16
✎
19:34
|
(8) Очевидно, архитектуру, подразумевающую манипуляцию объектами одной системы/среды из другой системы, надо оставить где-то в 00х. И использовать сервисный подход.
|
|||
18
Asmody
16.07.16
✎
19:35
|
(16) Ну cpp, какая разница? От тебя чаще .Net'ом разит.
|
|||
19
Garykom
гуру
16.07.16
✎
19:37
|
Когда уже 1С дойдет до идее модульности в своей платформе назад, от которой отказались с переходом 1С77>1C8 ?
Чтобы было ядро, подсистема метаданных, подсистема хранения/бд и т.д. А всяческие разные реализации очередных rest/json были в отдельных модулях которые могут обновляться независимо от основной системы если они ей соответствуют. Т.е. система пакетов/dll где части могут быть разных версий, но при обновлении из ядра берутся и качаются последние нужные остальные версии. |
|||
20
Garykom
гуру
16.07.16
✎
19:39
|
(19)+ Это позволит реализовать автообновление даже самой платформы, если ядро не трогается.
Т.е. версия 8.3 а далее до 8.4 идет автообновление модулей. |
|||
21
Garykom
гуру
16.07.16
✎
19:40
|
(19)+ Если задокументировать и разрешить делать "свои модуля" будет просто супер ))
Но как то кажется что это фантастика... (( |
|||
22
Asmody
16.07.16
✎
19:42
|
(19) Это ложный путь. Ты утыкаешься dllhell разруливать, если двум решениям потребуются разные версии компонент.
|
|||
23
Serginio1
16.07.16
✎
19:42
|
(18) Поверь разница огромная. А я еще и крестиком вязать умею и JavaScript применяю и TypeScript.
А вот на мисте давно уже тегами нужно обзавестись или применить markdown |
|||
24
Asmody
16.07.16
✎
19:48
|
(23) нахрена?
|
|||
25
Зая Бусечка
16.07.16
✎
19:49
|
_вязать_ крестиком даже Матроскин не умел...
|
|||
26
mistеr
16.07.16
✎
19:49
|
тест |
|||
27
Serginio1
16.07.16
✎
19:51
|
(17) То есть, COM объекты можно использовать, а вот их аналог в Native ВК ни ни? В чем проблема?
|
|||
28
Garykom
гуру
16.07.16
✎
19:51
|
(22) Есть уже отработанные пути разрешения dllhell и это совсем не то.
Сейчас ничуть не лучше когда все эти dll банально слиты в одну огромную и с кучей "типа совместимостей". Один фиг глюки/баги все время и конфа не так как нужно на вот этой вроде бы подходящей платформе пашет. Тут можно было бы пофиксить для конфы нужный ей "набор dll" или даже основной набор и для отдельных модулей/внешних обработок свои добавочные. Да внутренности придется переписывать чтобы никаких круговых взаимовызовов между DLL/модулями не было. Каждый модуль может общаться только с ядром и с подчиненными (зависящими от него) модулями. |
|||
29
marvak
16.07.16
✎
19:52
|
Блин, уважаю Серджинио1, ни хрена не понимаю конечно в его вызовах Виндовс АПИ, но все равно прятно, что среди нас есть такой грамотный и толковый программист. ))
|
|||
30
Garykom
гуру
16.07.16
✎
19:54
|
(24) Например чтобы однажды не проснуться и не узнать что все по 1С спрашивают тут http://forum-1c.ru/
|
|||
31
Serginio1
16.07.16
✎
19:55
|
(29) Спасибо скромно? Только там нет вызовов Виндовс АПИ. Это кроссплатформенный код.
|
|||
32
Serginio1
16.07.16
✎
19:56
|
30+ Да помню прекрасный форум Кубань был
|
|||
33
marvak
16.07.16
✎
19:59
|
(31)
Да ладно, неважно. ты молодец. Шаришь. А я уже давно тока в коде 1с разбираюсь и ни в чем больше ) И то счас учитывая их БСП походу придется переквалифицироваться в управдомы. )) |
|||
34
Serginio1
16.07.16
✎
19:59
|
27+ Можно сделать простой вариант.
Из ВК можно возвращать аналог ВК. За подсчетом ссылок следит 1С и вызывает Done при обнулении сылок, а передавать объекты можно только на вызов метода. ВК внутри не держит ссылок. Этого более чем достаточно, аналог процедурного подхода. |
|||
35
mistеr
16.07.16
✎
19:59
|
(31) Ну ты дашь посмотреть на (9) (10)? Меня тоже тема ВК интересует. Юзай Gist и Pastebin, правда.
|
|||
36
Garykom
гуру
16.07.16
✎
20:01
|
(30)+ По сути миста сейчас это некий аналог оперативной бесплатной поддержки.
И место поболтать/пообщаться а также узнать/обсудить новости. А если по теме ну так сделать 2 стандартных ВК (win|lin) в виде шаблона и к ним шаблон единой ВК, куда пишем код. Далее запускается сборщик который из единой по правилам делает 2 нужных раздельных компоненты и компилирует даже... |
|||
37
Serginio1
16.07.16
✎
20:01
|
(35) так Кроссплатформенное использование классов .Net в 1С через Native ВК.
Там ссылка на проект. |
|||
38
Garykom
гуру
16.07.16
✎
20:02
|
(36)+ Это по сути Haxe в который кое кто ударился не будем показывать посты ))
|
|||
39
Beretta
16.07.16
✎
20:14
|
(30) Какой хороший форум. Очень жаль, что Serginio1 там еще нет, пора бы уже, пора... =)
|
|||
40
MishaD
16.07.16
✎
20:22
|
(39) На том форуме не был, но форум по 1с без Serginio1, это плохой, некачественный, форум :-)
|
|||
41
Serginio1
16.07.16
✎
20:27
|
Хорошо не поленился и создал на пасте бин
http://pastebin.com/8bAXi2MV (39) Хорошо. Скоро уйду. (40) Спасибо! Останусь. |
|||
42
Кирпич
16.07.16
✎
20:39
|
(0) автор, ничо не выдумывай. в примере 1с с юникодом всё правильно сделано, а обертку можешь сам сделать, ума много не надо. главное чтобы компилировалось в VC и в gcc
|
|||
43
orefkov
16.07.16
✎
21:01
|
(17)
Очевидно, что "наружные" процессы должны обращаться к сервисам, а компоненты, предназначенные для расширения самого API - обращаться к API. Да и в случае с ВК потребителем как-раз таки является сторона 1С - пользователь создаёт объект ВК и вызывает его методы. Но через NativeAPI передать он может только примитивные типы, никаких объектов передать нельзя. Ни в одну сторону, ни в другую. |
|||
44
arsik
гуру
16.07.16
✎
21:10
|
(30) Лучше рейтинг юзеров сделать. В этой радуге смысла ноль.
|
|||
45
Asmody
16.07.16
✎
21:19
|
(30) Сколько их таких было!
Если что, Миста — не форум "про 1С". |
|||
46
Asmody
16.07.16
✎
21:22
|
(43) Какой смысл в передаче, например, какого-нибудь List<> в 1С?
|
|||
47
Asmody
16.07.16
✎
21:22
|
(44) нахрена?
|
|||
48
Serginio1
16.07.16
✎
21:33
|
(46) Что бы его заполнить и передать обратно в ВК.
На примере Вэб сервиса неподдерживаемого 1С. Там куча классов и клуча методов. Нужно создавать объекты и передавать их в методы. Например пример с HttpClient нужно создавать объектя для использования прокси, сжатия трафика, куков итд. Кроме того проще заполнять 1С совский массив внутр ВК, нежели снаружи. Итд Кстати ты критиковал мои разработки за не кроссплатформенность. Я специально для тебя сделал кроссплатфоменное использование классов .Net. А ты молчишь. Кроссплатформенное использование классов .Net в 1С через Native ВК. |
|||
49
Garykom
гуру
16.07.16
✎
21:54
|
(48) Нахрена? все равно внутри "объекты 1С" передавать низзя или выйдет обычный ole|com...
Если программист 1С не умеет сериализовать ручками то ему нафик не нуна ВК писать. |
|||
50
Garykom
гуру
16.07.16
✎
21:57
|
(48) Что кроссплатформенно сделал это супер!!!
Теперь только кому то осталось найти кучу времени и сил чтобы эти разработки причесать/допилить и выложить в удобоваримом виде с понятными короткими но полными инструкциями. И найти/оформить понятно несколько примеров из тех "много кода" )) |
|||
51
arsik
гуру
16.07.16
✎
22:01
|
(47) Ну что бы определенное суждение об авторе уже иметь, а не через полчаса общения с ним.
|
|||
52
Serginio1
16.07.16
✎
22:31
|
(49) Программист должен программировать, а не заниматься вручную сериализацией, как многие занимаются при использовании неподдерживаемыми 1С вэб сервисами через HTTPСоединение.
(50) Если бы это было кому то нужно. Посмотри даже на примере ТСД там где на Java или C# легко и главное интерфейс под аппарат используют RDP и считают это оптимальным. А потому, что есть 1С ник, а в других языках никто не разбирается. Опять же я один. Думал может 1С это заитересуют, но ..... никому это не нужно. Но все таки доделаю до конца. Прикручу события, методы расширения, методы с дефолтными параметрами. И плюну на все. Буду искать, что то другое для души. |
|||
53
Garykom
гуру
16.07.16
✎
22:37
|
В 1С есть встроенная сериализация со времен 1С77, а в 1С8 ее даже несколько видов.
Потому и не нужно что редко кто понимает "зачем оно?" ему надо. 1С если и заинтересует то сами реализуют своими силами нескольких топовых спецов написавших ТЗ и массы рядовых кодеров. |
|||
54
Garykom
гуру
16.07.16
✎
22:39
|
(53) к (52)
1С-ник хочет нагуглить простое решение чтобы оно заработало из коробки. А нагуглив ВК и нагуглив код на C#/.Net он нифига не сможет без изучения и "перевода в другую систему" |
|||
55
Serginio1
16.07.16
✎
22:49
|
(54) Есть куча примеров которые я написал. Многим тоже пишу код. Проблема даже не в этом, а в боязни использовать. Вот недавний пример. Получение HTML по https протоколу
1С может опаздывать, ломать. А тот же HTTPClient и мощнее и никогда проблем с поддержкой протоколов не было. Но люди боятся, так как это не 1С или известный COM. Но даже например Кирпич. Он может, но не будет. Ему проще ВК писать, чем DLL на C# или вообще код на 1С ипользующий классы .Net. Да и 1С может использовать легко причем кроссплатформенно. Куча основных библиотек это 60 мегабайт и куча компонент можно использовать. |
|||
56
Garykom
гуру
16.07.16
✎
22:52
|
(55) Люди любят "удобство", которого перейдя по любой приведенной ссылке нет и в помине.
Кирпич как и я написал уже удобный для себя способ использования/вызова кода на C# или Java. У меня еще есть десериализатор объектов 1С и обратный сериализатор на C# и на Java и все становится очень удобно. |
|||
57
Serginio1
16.07.16
✎
23:09
|
(56) И в чем там неудобство Получение HTML по https протоколу
Кирпич будет использовать либо COM как и ты. Либо писать свои ВК. Правда Кирпич еще использует Динамическую компиляцию. У меня есть все. И не надо писать никаких сериализаторов. Используй объекты. Для примера работа с Вэб сервисами через Объекты .Net удобнее чем с родными и кстати мало чем отличаются по сути. Есть типы, объекты пространство имен. Но ... |
|||
58
Serginio1
16.07.16
✎
23:13
|
57+ Кстати Кирпич признался, что если бы 1С от себя прелагалабы применение .Net классов в 1С, то он их бы использовал.
Кроссплатформенное использование классов .Net в 1С через Native ВК. |
|||
59
Garykom
гуру
16.07.16
✎
23:14
|
(57) (58) Ну напиши уже свой 1С на .Net ...
|
|||
60
Serginio1
16.07.16
✎
23:25
|
(59) Зачем? Я написал компоненту которая расширяет возможности 1С. Еще раз даже родные компоненты для работы с Вэб, файлами и прочие малофункциональны и не поддерживают всех возможностей. Зачем писать, что то свое если можно использовать стандартные библиотеки? И не надо писать прослойки между C++ и 1С.
|
|||
61
Serginio1
16.07.16
✎
23:33
|
Вернее не нужно писать отдельно прослойки между библиотеками на C++ и 1С. Есть уже одна готовая между 1С и библиотеками .Net кроссплатформенная!
Каждый раз создавая прослойку есть большая вероятность ошибки. Проще довести до ума одну. Это дает 1. Использовать бОльший функционал 2. И соответственно, так как 1 прослойка то её проще совершенствовать, тестировать и соответственно меньше ошибок. 3. Быстрее использовать нововведения в Вэб и прочих направлениях. 4. Более простое расширение с помощью пользовательских классов .Net. Это же относится и к Java. Просто я написал на .Net |
|||
62
Serginio1
17.07.16
✎
09:42
|
61+ Что касается перегрузки методов и чувствительность к регистру, то ткаие классы можно помечать специальным атрибутом и обрабатывать соответствующим способом. Это даже проще.
|
|||
63
Провинциальный 1сник
17.07.16
✎
09:54
|
Тут все общаются на тему создания внешних компонент native api, но у меня вопрос немного другой. Можно ли через native api подключиться из одной ИБ к другой и соответственно иметь com-подобный доступ к объектам подключенной базы? Или как можно реализовать COM/OLE-подобный доступ, если система не виндовс?
|
|||
64
Фрэнки
17.07.16
✎
10:18
|
Закину сюда, чтоб ветку не плодить
|
|||
65
Фрэнки
17.07.16
✎
10:26
|
<BLOCKQUOTE>После двух лет с момента прошлого выпуска компания Microsoft объявила о начале альфа-тестирования новой версии Skype для Linux. Новый Skype примечателен полной переработкой с переходом на использование web-технологий для интерфейса и протокола WebRTC для организации канала связи. Новый клиент Skype построен с использованием платформы electron, т.е. по сути является упакованной в самодостаточное приложение надстройкой над Chromium и Node.js, в которой выполняется расширенный web-клиент.</BLOCKQUOTE>
|
|||
66
Serginio1
17.07.16
✎
10:53
|
(63) Здесь несколько вариантов web,Http сервисы, ODATA
или прямой доступ http://catalog.mista.ru/public/393228/ |
|||
67
mistеr
17.07.16
✎
11:21
|
(64) Сюда-то зачем?
|
|||
68
Фрэнки
17.07.16
✎
11:30
|
(67) там в полной версии новости, если бы я ссылку вставил, обсуждалось в комментах использование NODE.js http://www.opennet.ru/opennews/art.shtml?num=44783
|
|||
69
mistеr
17.07.16
✎
15:09
|
(68) И каким боком это к ВК и 1С?
|
|||
70
Провинциальный 1сник
17.07.16
✎
19:31
|
(66) Все эти "доступы" не дают доступа напрямую к объектной модели, как в com/ole. Значит, никак?
|
|||
71
Serginio1
17.07.16
✎
21:30
|
(70) Пока 1С не сделает аналог COM
|
|||
72
Garykom
гуру
17.07.16
✎
21:40
|
(71) Для чего нужен этот "аналог COM" ?
|
|||
73
Serginio1
17.07.16
✎
21:47
|
(72) Кроссплатформенное использование классов .Net в 1С через Native ВК.
То есть не надо писать ВК. Можно просто писать определенные классы на .Net или Java и использовать их в 1С. Например сейчас на Линуксе из-за отсутствия COM в основном используют Вэб или HTTP сервисы. Но это отдельный процесс и скорость низкая из-за маршалинга (сериализации десериализации) и задержками между процессами. ВК это тоже аналог COM только кастрированный. |
|||
74
Garykom
гуру
17.07.16
✎
21:58
|
(73) Лучше сюда ссылку давай https://habrahabr.ru/post/304482/ тут хотя бы слегка причесано, интересно сколько времени убил ))
OLE/COM это тоже отдельный процесс и низкая скорость, но т.к. изначально программисты вынужденно пишут свой код чтобы оно поддерживалось из коробки то тормоза не так заметны. И 1С потихоньку идет к этому например http://v8.1c.ru/o7/201312rest/. |
|||
75
Garykom
гуру
17.07.16
✎
21:59
|
(74)+ И попытка уже была http://www.pvsm.ru/java/15893 не от 1С.
|
|||
76
Провинциальный 1сник
17.07.16
✎
22:08
|
(74) Это еще вопрос, что лучше - терпеть накладные расходы на сериализацию-десериализацию данных через новомодные методы веб-доступа, или же прямой доступ к com-серверу в общем адресном пространстве. Конечно, com сам по себе тоже весьма убог, потеря точности при неявном преобразовании чисел 1с в плавучку чего стоит. Было бы неплохо, если бы 1с изобрела очередной велосипед "native com", лишенный всех недостатков виндового и в то же время чтобы он был кроссплатформенным.. Но наверное это дико сложно.
|
|||
77
Serginio1
17.07.16
✎
22:09
|
(74) 2 Недели на реализацию. Но много дал опыт комовской реализации.
Оле/Com есть как внутрипроцессорный (v83.comconnector ) и внешний сервер (v83.Application) Там разница нехилая. |
|||
78
Garykom
гуру
17.07.16
✎
22:11
|
(76) Прямой доступ в общем адресном пространстве это когда на одной машине. Но сейчас это уже глупость так как комп/прога без сети/инета уже ничто.
Т.е. механизма нужна сетевая когда клиент и сервер разделены сеткой вот и выходят самыми удобными "новомодные методы веб-доступа". |
|||
79
Serginio1
17.07.16
✎
22:11
|
(76) COM поддерживает Decimal.
Это не дико сложно. Уже есть в 73. https://habrahabr.ru/post/304482/ https://habrahabr.ru/post/304542/ |
|||
80
Garykom
гуру
17.07.16
✎
22:12
|
(77) Дык спрашивал не про время кодинга, а про время чтобы оформить статейку ))
|
|||
81
Serginio1
17.07.16
✎
22:13
|
(80) Да день.
|
|||
82
Провинциальный 1сник
17.07.16
✎
22:14
|
(79) А 1с об этом знает? С какой версии?
|
|||
83
Serginio1
17.07.16
✎
22:20
|
(82) В любой. Только вот для нормального использования нужно либо интегрировать в 1С либо допиливать ВК для возврата объектов (аналогов ВК)и передачи объектов в параметрах. В статье этот аспект подробно описан.
|
|||
84
Провинциальный 1сник
18.07.16
✎
06:26
|
(83) Речь не о ВК, а о связи 1с с 1с.
|
|||
85
Serginio1
18.07.16
✎
07:37
|
(84) Посмотри http://catalog.mista.ru/public/402038/
|
|||
86
Провинциальный 1сник
18.07.16
✎
07:41
|
(85) Какие-то непонятные костыли на каком-то сишарпе.. При чем тут вообще 1с?
|
|||
87
Beretta
18.07.16
✎
07:51
|
(86) Не обижайте художника! Он так видит!
|
|||
88
Serginio1
18.07.16
✎
08:17
|
(86) Ты спрашивал про ком под Линукс. В 1С это не реализовано, но через 79 и 83 это можно реализовать. Тема то про ВК.
|
|||
89
Garykom
гуру
18.07.16
✎
08:27
|
(88) гм ту про oscript.io напомнили, вот бы туда еще обычную net|mono добавить по твоему методу
|
|||
90
Serginio1
18.07.16
✎
10:13
|
(89) Ну проект интересен, но "Проект является независимой кросс-платформенной реализацией виртуальной машины, исполняющей скрипты на языке 1С:Предприятие." то есть 1С никам которые не знакомы с другими языками, но хотят делать приложения на языке 1С.
|
|||
91
Garykom
гуру
18.07.16
✎
11:00
|
(90) Так это же как раз твоя фишка по использованию мощностей .Net из языка 1С.
Тама есть язык 1С, а мощностей не наблюдается все порезано. Вот сделал бы http://oscript.io/dev/page/components чтобы все как в 1C с твоим изобретением было )) |
|||
92
Beretta
18.07.16
✎
14:14
|
(91) Ему не надо 1С, ему надо, чтобы народ на c# писал, как же ты не поймешь =)
Просто написать ВК на том же с# и использовать ее - скучно. Поэтому надо заипаться связкой с 1С через ъТип и прочую невразумительную поипень, да еще и еще заипать других ссылками на stackoverflow с чистым с#.. А потом удивляться, почему это никого не штырит =) |
|||
93
Serginio1
18.07.16
✎
14:57
|
(91) Они там как раз .Net внутри используют.
http://oscript.io/dev/page/Как%20добавить%20класс (92) А потому, что Native ВК нет возможности передать объект или передать объект в параметрах. Но это все равно значительно проще чем писать ВК. |
|||
94
Serginio1
18.07.16
✎
14:58
|
(92) Я тебя впервый раз слышу, а уж тем более не занимался с тобой сексом.
|
|||
95
Serginio1
18.07.16
✎
15:01
|
(92) Посмотри исходники https://github.com/EvilBeaver/OneScript/tree/develop/src/ScriptEngine
|
|||
96
Beretta
18.07.16
✎
15:16
|
(94) Удобная позиция, чо.
|
|||
97
Serginio1
18.07.16
✎
15:24
|
(96) Я никого не заставляю использовать мои продукты. Я только показываю пути решения, если на 1С их решить нельзя.
А у того кто задает вопрос есть выбор. |
|||
98
Serginio1
18.07.16
✎
15:26
|
И вроде я тебе никогда советов не давал, а если тебя раздражает советы чужим, то можешь просто не читать. Но тебе самому хочется дать совет причем отнюдь не конструктивный. Я его применить не могу. А то, что даю я можно использовать.
|
|||
99
Garykom
гуру
18.07.16
✎
15:30
|
(93) Да оно на .Net наваяно интерпретатор языка 1С, но к обычной 1С напрямую из языка 1С нету доступа.
Через плагины/компоненты можно с экспортом своих методов для языка 1С. Ситуация аналогичная платформе 1С. |
|||
100
trdm
18.07.16
✎
15:37
|
(19) > Чтобы было ядро, подсистема метаданных, подсистема хранения/бд и т.д.
Вы линупсонутые везде модульность впихvйствуете. И того не понимаете, что не всякая задача таким образом оптимально решается. А если решается, то получается голимый САП, внедреж которого обходится дороже чем целессобразная сумма. НАпишите свое нормальное и внедряй. |
|||
101
trdm
18.07.16
✎
15:47
|
(87) > Не обижайте художника! Он так видит!
Нкоторым художникам необходимо время от времени в интерфейс красками плеснуть. |
|||
102
Garykom
гуру
18.07.16
✎
15:50
|
(100) Заказчика нужно в виде спонсора, художники жадные пошли кушать хотят и кредиты платить.
|
|||
103
trdm
18.07.16
✎
15:59
|
Мечты, мечты, где ваши грезы....
|
|||
104
Garykom
гуру
18.07.16
✎
16:15
|
Да нафуй грезы, тут реальные траблы чтобы 1С77 под линукс с xrdp запустить оказывается етерсофт уже нафуй не нужен, штатный wine прекрасно пашет но нужна хитрая настройка самбы под сетевой режим
|
|||
105
Garykom
гуру
18.07.16
✎
16:17
|
(104)+ вот большое желание не свой 1С, а 1С от 1С древненькую 77 на чем то новом запускать без траблов и дописываемо штатно
|
|||
106
тарам пам пам
18.07.16
✎
16:46
|
Мда, нафлудили тут на сотню постов, а по теме один orefkov отписался.
Serginio1, я же специально написал про .net сразу - на инфостарте я все это видел и это мне не нужно. А ты тут портянки кода непонятно для кого кидаешь. (6) char16_t мне поможет тем, что можно будет сразу литералы в виде u"MethodName" задавать. Для работы с char16_t есть отдельный u16string; IDE, вероятнее всего, будет мне их сразу в виде строк показывать, а не в виде массивов чисел, как в случае с uint16_t. Во внешние библиотеки мне передавать строки не нужно; конвертация останется в данном случае только в методе SetLocale(), который под linux вызывает setlocale, которому нужен строго char*. Удобства хочется, в общем. По интерфейсу - в лоб написать его несложно; но перфекционист во мне негодует, когда описание 5 методов в примере растянуто на 1000 строк, из которых работа самих методов укладывается в 20 строк. В идеале хотелось бы видеть нечто вроде такого: ComponentInterface<MyClass> iface("MyClass", "MyClassExtension", Method("Method1", &MyClass::Method1, ReturnValue<int>(), Arg<int>(0), Arg<double>(10) ), Method("Method2", &MyClass::Method2, ReturnValue<void>(), Arg<int>() ) Property("Prop1", &MyClass::SetProp1, &MyClass::GetProp1) ) Т. е. все, что экспортирует компонента описано в одном месте, MyClass ни о какой 1с и знать не знает, автоматическая запаковка-распаковка tVariant. Надеялся, что кто-то уже сделал это, потому как я с++ помню слабо (последний стандарт, с которым я работал - C++03) и сам писать это буду медленно и неэффективно. Похоже, однако, что придется писать свой велосипед. Ну да ладно, хоть с++ вспомню да посмотрю, что там в c++11 и c++14 нового ввели. |
|||
107
Serginio1
18.07.16
✎
16:49
|
||||
108
Garykom
гуру
18.07.16
✎
16:56
|
(107) признавайся в чем код пишешь и почему CTRL+K, CTRL+D не пользуешь или иное?
|
|||
109
Serginio1
18.07.16
✎
16:59
|
(108) На VS. Там форматирование есть. А при пасте бин там часть вручную писал.
|
|||
110
тарам пам пам
18.07.16
✎
16:59
|
(107) угу, там какой-то огрызок кода для прослойки 1c->с++->.net. А это ну совсем не относится к .net.
|
|||
111
Serginio1
18.07.16
✎
17:02
|
(110) Где ты увидел .Net?
Этот код универсален. И пишешь только методы и нициализируешь массивы описания методов. Забываешь о GetNMethods(), FindMethod(), GetMethodName(), GetNParams(), GetParamDefValue(), HasRetVal(), CallAsProc(), CallAsFunc()). |
|||
112
Serginio1
18.07.16
✎
17:06
|
Все что тебе нужно это
//Затем в классе наследнике определить реальный массив MethodsArray MethodsArray[2]; //А в конструкторе pMethodsArray = MethodsArray; // получаем ссылку на реальный массив SizeArray = 2; // Инициализируем массив задавая ссылки на реальные методы pMethodsArray->Init(L"СоздатьОбертку", CreateDamain, 3, true); MethodsArray[1].Init(L"ЗагрузитьDLL", LoadDLL, 1, true); |
|||
113
Serginio1
18.07.16
✎
17:15
|
Тоже самое сделать и для Свойств
|
|||
114
тарам пам пам
18.07.16
✎
17:22
|
.Net я увидел в наименованиях функций, как минимум. Что говорит мне о том, что ты просто выдернул работу с методами из своей прослойки. А не подходит мне это как минимум потому что:
1. Необходимо вручную задавать размер массива методов. Мелочь, но неприятно. 2. Нет автоматической работы с tVariant - нужно писать методы с жестко заданной сигнатурой bool(*CallAsFunc) (void * , tVariant* , tVariant* , const long) и вручную распаковывать tVariant'ы. 3. Нет преобразования строк wchar_t <-> WCHAR_T, что говорит о том, что под linux нужно этот код допиливать. 4. Для использования класса, который про 1c не в курсе, нужно создавать лишний класс-наследник от твоего, где описывать все взаимодействие. Я выше уже писал, что мне хотелось бы видеть в итоге. Именно в таком виде я этого не нашел, твой код для использования нужно допиливать. Поэтому буду пилить свое. |
|||
115
Serginio1
18.07.16
✎
17:39
|
(114) Я для него код вычищал, специально запостил на http://pastebin.com/8bAXi2MV а он еще и не доволен. Где ты увидел названия функций нетовские?
1. Используй size(MethodsArray)/size(MethodsArray) 2. А как ты хотел? В С++ нет иерархии от Object из которого можно получить тип 3. Это смотря что и как ты будешь вызывать. Я об этом ничего не знаю. 4. Наследник реализует все методы GetNMethods(), FindMethod(), GetMethodName(), GetNParams(), GetParamDefValue(), HasRetVal(), CallAsProc(), CallAsFunc()). А в нследнике ты думаешь только о реализации. Такой подход значительно сокращает объем кода. |
|||
116
Serginio1
18.07.16
✎
17:49
|
Вернее
size(MethodsArray)/size(MethodInfo) |
|||
117
Serginio1
18.07.16
✎
18:05
|
Прошу прощения. Нехватка практики на C++
sizeof(MethodsArray) / sizeof(MethodInfo); |
|||
118
тарам пам пам
19.07.16
✎
08:32
|
(115)
1. На кой черт вообще задавать размер явно? что помешало использовать vector? 2. Object и рефлексии нет, но тут она и не нужна - у нас есть сигнатура экспортируемого метода. Скорее всего, можно это все сделать через шаблоны. 3. Вызывать буду не я, а платформа. Для которой под Linux WCHAR_T определен как двухбайтовый uint16_t, а wchar_t имеет размер 4 байта. И, например, строка if (pMethodsArray[i].MethodName == MethodName) где у тебя будет wstring сравниваться с uint16_t* даже не скомпилируется. 4. Вот именно - нужен лишний класс-наследник. В общем, попробую покурить шаблоны; может и выйдет что-то путное. |
|||
119
orefkov
19.07.16
✎
08:56
|
(106)
По поводу char16 - ясно. Главное, что-бы ты сам понимал, что за чем стоит, и что от того, что на клетке со львом написать "заяц" - мясо он жрать не перестанет. По поводу вменяемого интерфейса - для 7ки этузазисты такое делали. Хотя, стоп, делали в рамках "родного-внутреннего" семёрочночного интерфейса. Для 8ки придётся делать самому, это не сложно. |
|||
120
orefkov
19.07.16
✎
09:02
|
+119
Одно из решений было создание массива с описаниями функций и указателями на них - смотри исходники 1С++. Типа struct MethodInfo { const char nameEng; const char nameRus; int paramsCount; bool hasRetVal; int(BaseClass::callAsProc)(......); int(BaseClass::callAsFunc)(......); int(BaseClass::*getDefVal)(.....); }; и потом методы-реализации берут всю инфу из массива. В классах наследниках только задаешь свой массив. |
|||
121
тарам пам пам
19.07.16
✎
09:19
|
orefkov, у меня главное сомнение по поводу char16_t в плане byte order. Не получится ли так, что платформа работает со строками с в little-endian, а компонента - с big-endian? Стандарт endianness для char16_t не регламентирует.
А по поводу интерфейса - как в (120) реализовать можно; это собственно первое, что пришло в голову. Но мне хочется шаблон сделать так, чтобы вообще наследника не нужно было создавать (так, как в (106) описано). Сейчас уже - просто ради спортивного интереса :) |
|||
122
orefkov
19.07.16
✎
09:32
|
(121)
По поводу порядка байт - даю хинт - 1С с юникодом работает не сама, а посредством ICU (которая кстати как-раз всегда с двухбайтовыми символами работает). Не, ну длину строки сама наверное считает, но для этого порядок байт не важен. Насчёт обёртки - имхо, на современном С++ можно сделать всё. |
|||
123
Serginio1
19.07.16
✎
10:02
|
(120) То, что я ему и предлагаю http://pastebin.com/8bAXi2MV
(118) Используй Вектор, Хэш таблицы. Смысл в создании коллекции с информацией о методе. По поводу варианта Сделай функцию Convet для преобразования tVariant в нужный тип Аналог COM VarCast |
|||
124
Garykom
гуру
19.07.16
✎
11:22
|
Кто в курсе платформа 1С "читает" список методов что умеет NativeAPI ВК только 1 раз при подключении или можно как то заставить в процессе расширить кол-во методов?
|
|||
125
Кирпич
19.07.16
✎
11:29
|
(124) можно расширить
|
|||
126
Garykom
гуру
19.07.16
✎
11:37
|
(125) Это штатно без левых извратов?
Смысл хочу сделать одну ВК к которой можно подсовывать любые другие (в т.ч. на других языках). В 1С-ку подключается только 1-я, затем дается из 1С команда какую внешнюю "ВК" и откуда подключить = в 1-й ВК появляются все методы из дополнительной "ВК". |
|||
127
Serginio1
19.07.16
✎
11:40
|
(124) Посмотри мою компоненту. Я список методов вообще не передаю.
|
|||
128
Кирпич
19.07.16
✎
11:40
|
(126) да нету никаких извратов. вон все приблуды Serginio1 на этом держатся. и я так делаю.
|
|||
129
Serginio1
19.07.16
✎
11:41
|
127 Там как реализовано то, что ты хочешь. Я её сегодня подправил
|
|||
130
Кирпич
19.07.16
✎
11:42
|
(127) только не вываливай сюда листинг, я умоляю :)
|
|||
131
Serginio1
19.07.16
✎
11:43
|
(130) Скачай https://yadi.sk/d/jRSHEA19svgrn
|
|||
132
Garykom
гуру
19.07.16
✎
11:45
|
(128) т.е. 1С каждый раз при попытке вызова метода заново перечитывает список их из ВК? А если их дофига?
|
|||
133
Кирпич
19.07.16
✎
11:45
|
(126) "В 1С-ку подключается только 1-я, затем дается из 1С команда какую внешнюю "ВК" и откуда подключить"
тоже решил осчастливить унылое сообщество своим гениальным изобретением? (131) да оно мне не надо |
|||
134
Кирпич
19.07.16
✎
11:46
|
(132) зачем список. фомилию конкретного метода спросит и номер получит
|
|||
135
Кирпич
19.07.16
✎
11:48
|
+(134) блин, умудрился фамилию через О написать
|
|||
136
Garykom
гуру
19.07.16
✎
11:48
|
(134) Не используется GetNMethods работает чисто FindMethod шо ли
|
|||
137
orefkov
19.07.16
✎
11:50
|
(124)
Она вообще не читает список методов. 1С тут как "рыбка Дори" - проблемы с краткосрочной памятью. Каждый раз при вызове она будет просить найти метод, спрашивать, сколько у него параметров, возвращает ли он значение. Тыщу раз вызываешь метод в цикле - тыщу раз и прогонит это всё. |
|||
138
Кирпич
19.07.16
✎
11:50
|
(136) ну проведи эксперимент. выведи лог в файл и посмотри. я уже забыл чо там к чему.
|
|||
139
Garykom
гуру
19.07.16
✎
11:54
|
(137) (138) Угу сенкс попробую, просто ВК делал но чисто по шаблону не озадачиваясь этими вопросами.
|
|||
140
Serginio1
19.07.16
✎
11:58
|
(133) Я всегда интересуюсь чужим опытом. Но не надо так не надо. Было бы предложено.
|
|||
141
Кирпич
19.07.16
✎
11:59
|
(137) Сканер и весы подключаются и ладно. А на любителей использовать классы .NET и прочие питоны, 1С плюёт с глубокой колокольни.
|
|||
142
Кирпич
19.07.16
✎
12:00
|
(140) а какой там нужен опыт? в справке 1с всё написано.
|
|||
143
Garykom
гуру
19.07.16
✎
12:01
|
(133) Нафуй кого то насильно осчастливливать, пусть сами добывают где хотят или пишут с 0 по статейке-докладику если прокатит.
|
|||
144
Кирпич
19.07.16
✎
12:03
|
(143) ну некоторым нравится, когда их именно насильно осчастливливают :)
|
|||
145
Serginio1
19.07.16
✎
12:36
|
(142) На заборе тоже написано ...
|
|||
146
Serginio1
19.07.16
✎
12:47
|
Кстати проблема
public void TestВнешнегоСобытия() { for(int i=0;i<100; i++) { var значение = i.ToString(); Task.Run(async() => { await Task.Delay(1000).ConfigureAwait(false); this?.ВнешнееСобытие1С("Тестовый", "ТестовоеСообщение", значение); }); } } Внешнее событие вызывается 100 раз, но вызывается только 1 Процедура ВнешнееСобытие(Источник, Событие, Данные) // Вставить содержимое обработчика. Сообщить("Источник="+Источник); Сообщить("Событие="+Событие); Сообщить("Данные="+Данные); КонецПроцедуры Сейчас с задержками поэкспериментирую. Поставлю Sleep |
|||
147
Serginio1
19.07.16
✎
12:57
|
В общем с задержкаи в 50 миллисекунд работает
public async void TestВнешнегоСобытия() { for(int i=0;i<100; i++) { var значение = i.ToString(); Task.Run(async() => { await Task.Delay(1000).ConfigureAwait(false); this?.ВнешнееСобытие1С("Тестовый", "ТестовоеСообщение", значение); }); await Task.Delay(50).ConfigureAwait(false); } } |
|||
148
Serginio1
19.07.16
✎
16:13
|
orefkov ты же вроде с ними общаешься? Не можешь им посоветовать
1. Абсолютно не нужны методы FindMethod, FindProp, IsPropReadable, IsPropWritable, GetNParams, HasRetVal, GetParamDefValue Так как у методов bool CallAsProc bool CallAsFunc bool SetPropVal и bool GetPropVal есть возвращаемое значение об успешном выполнении Информация об ошибке возвращается через AddError. Да и вызов по индексу это анахронизм от IDiapatch где было описание диспинтерфейсов для увеличения скорости вызова. 2. При возвращении методами SetPropVal и GetPropVal исключение не вызывается 3. Зачем то происходит установка свойств, там где в коде этого не требуется. 4. Вызывается метод как функция, там где метод вызывается как процедура. 5. Один из основных это нельзя вернуть и передать экземпляр ВК из методов ВК. Я лично не вижу никаких проблем. Определить значение для такого типа и установить ссылку в поле pInterfaceVal. Подсчет ссылок происходит на стороне 1С. Передавать можно в том числе и объекты 1С только на время вызова метода. Например практически все программисты 1С используют ComОбъект. По моей методе можно использовать NetОбъект,NetТип JavaОбъект,JavaТип И эти объявления будут реально кроссплатформенны. При это различия с ComОбъект минимальны. Имя класса равноценно комовскому ProgID. При этом нет ограничений на используемые типы. Ты можешь написать свою библиотеку поместить в определенное место и использовать её вместо COM. Без регистрации итд. Расширять возможности 1С станет легче. |
|||
149
Кирпич
19.07.16
✎
16:19
|
(148)+1
а еще передай, что англичане ружья кирпичом не чистят |
|||
150
Serginio1
19.07.16
✎
16:26
|
(149) Там реально куча ошибок. Плюс получить двоичные данные можно, а вот передать нельзя. Просто довести до ума немного нужно то. И тогда надобность в ВК просто не нужна. Пиши обычный класс на C# или Java. Подключай события.
Ну а ВК могут пользоваться любители натива. |
|||
151
orefkov
19.07.16
✎
16:29
|
(149)
Блин, с языка снял. Читал и то же самое думал :) (148) Не общаюсь я с ними. Просто вот представь - уже написаны куча компонент, различные руководства, методические материалы, примеры, статьи там всякие на ИТС. И вдруг так - "всё, стоп. Всё отзываем и переделываем по другому, по-красивому". В большом корпоративном софте никто просто так ничего не переделывает. Работает - не трожь. |
|||
152
Serginio1
19.07.16
✎
16:34
|
(151) Не надо отзывать ничего. Для примера сначала был ILanguageExtender, потом пришел Native ВК. Эволюция.
Добавить возврат из ВК экземпляр ВК и возможность передачи экземпляра ВК в параметрах ничего не ломает. Дальше 2. При возвращении методами SetPropVal и GetPropVal исключение не вызывается 3. Зачем то происходит установка свойств, там где в коде этого не требуется. 4. Вызывается метод как функция, там где метод вызывается как процедура. Это тоже ничего не ломает. Можно добавить ВК номер 3. |
|||
153
Кирпич
19.07.16
✎
16:35
|
(150) умоляй 1с и они специально для тебя придумают новый стандарт ВК, какой нибудь "NETAPI" и будет тебе счастье.
|
|||
154
orefkov
19.07.16
✎
16:36
|
(150)
Да когда ты уже поймешь - нет цели у разработчиков платформы дать способ пользователям изящно её расширять. Основная цель появления ВК - задачи типа связи с торговым оборудованием. Данную задачу интерфейс ВК решает, а насколько эстетично - всем плевать в-принципе. Для большинства одиэсников все эти неты, моны, джавы и прочее существуют в параллельной вселенной. Где одинсник и где json-парсер? Если человек дошёл до понимания того, что ему в 1С понабился какойнить json-парсер - к этому времени он уже сам знает пять способов это сделать. |
|||
155
Кирпич
19.07.16
✎
16:38
|
(154) ему таких постов уже накидали сотни. не впитывает. ровно сидит на стуле, не моргает, требует дотнета в 1с.
|
|||
156
orefkov
19.07.16
✎
16:39
|
(152)
Если присмотреться внимательнее, то NativeAPI это тот же ILanguageExtender, только обрезанный в части передачи объектов и плевавший на имплементацию чем-либо кроме C++. То есть как-бы даже шаг назад по сравнению c ILanguageExtender. Оно и понятно - нужно было подключить фискальник с весами под линуксом, вот и слепили на скорую руку. |
|||
157
Serginio1
19.07.16
✎
16:43
|
(154) Постоянно проиходится использовать, то чего в 1С нет. Мне эта кроссплатформенность по барабану. Сейчас вообще на 7.7 программирую.
Так проблема то в том, например HTTPClient никаких проблем никогда не было. В 1С даже стандартные классы могут не работать либо быть значительно менее функциональны. Половина кода в 1С это по сути стандартные библиотеки .Net или Java. 1С делает постоянно прослойку между С++ библиотеками и 1С. 1 прослойка это намного проще и использовать уже оттестированные миллионами программистами классы. И если на Линуксе туго с COM, то при таком подходе и на линуксе сразу станет проще писать. (156) Уже время куча прошло. А воз и ныне там. |
|||
158
Serginio1
19.07.16
✎
16:46
|
(155) Я не требую дотнета, я за использование .Net и Java в 1С и показываю как это можно реализовать на конкретных примерах.
Ты же сам сказал, что если 1С реализует поддержку .Net и Java классов в 1С ты будешь их использовать. |
|||
159
Кирпич
19.07.16
✎
16:50
|
(158) "Ты же сам сказал, что если 1С реализует поддержку .Net и Java классов в 1С ты будешь их использовать."
ну если 1с сделает и это будет так же удобно как COM, то буду использовать, но в исключительных случаях(как и COM). Но 1с этого не сделает, а я свои задачи решаю и так. И нужны эти дотнеы мне раз в три года. |
|||
160
Кирпич
19.07.16
✎
16:52
|
А если увижу у себя в конторе, что кто-то пишет чего то на твоих врапах и ъТипах, то я ему так по рукам линейкой тресну...
|
|||
161
Serginio1
19.07.16
✎
16:58
|
(159) Ты их раз в 3 года используешь потому, что обходишься подручными средствами.
Например аналог String.Format появился совсем недавно. Работу с датами http://catalog.mista.ru/public/434345/ все в рукопашную. Split это все в конфигурации отдельными методами. Итд. (160) ъТипах это от безысходности. А так пиши ВК или COM, вместо обычного класса. Суть одна и таже. Только с COM тебе нужно регистрировать каждую библиотеку, а Native ВК малофункционален из-за невозможности передавать объекты. Да и в COM можно передавать только COM совместимые типы. В моем Врапе нет никаких ограничений. Так, что ... |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |