Имя: Пароль:
1C
1С v8
пример внешней компоненты 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
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
Закину сюда, чтоб ветку не плодить


После двух лет с момента прошлого выпуска компания Microsoft объявила о начале альфа-тестирования новой версии Skype для Linux. Новый Skype примечателен полной переработкой с переходом на использование web-технологий для интерфейса и протокола WebRTC для организации канала связи. Новый клиент Skype построен с использованием платформы electron, т.е. по сути является упакованной в самодостаточное приложение надстройкой над Chromium и Node.js, в которой выполняется расширенный web-клиент.
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
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
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
А я тебе про .Net и не писал
http://pastebin.com/8bAXi2MV

Где ты увидел?
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 совместимые типы.
В моем Врапе нет никаких ограничений. Так, что ...