Имя: Пароль:
1C
1С v8
delphi activeX + 1C (не NativeAPI)
0 qeos
 
04.06.13
09:45
ктото имеет опыт разработки компонент не используя 1CNativeLib и подобные вещи?

т.е. интересует глобальный вопрос: как получить pConnection в компоненте?
1 ZanderZ
 
04.06.13
09:50
а в чем проблема ?
2 Diversus
 
04.06.13
09:50
Я как то делал. Но давно было.

Посмотри, там с исходниками.
http://infostart.ru/public/21758/
3 qeos
 
04.06.13
09:52
(1) если создаю все через wizard то у меня нет объекта 1с, например для создания массива или запроса..
4 ZanderZ
 
04.06.13
09:54
в init инициализируй переменную класса и передав в нее pConnection
5 qeos
 
04.06.13
09:56
(2) так все работает но мне надо к примеру вернуть массив.. как? )

(4) вот как? можно подробней? )
6 ZanderZ
 
04.06.13
09:59
7 qeos
 
04.06.13
10:17
(6) а может просто примером покажешь?
8 qeos
 
04.06.13
10:22
если я правильно понимаю, то надо изменить процедуру

 procedure Inialize; override;

под мои нужды:

 procedure Initialize(const pConnection: IDispatch); override;

но так он ругается что описани отличается от предыдущего.

если же я указываю reintrodused, то у меня в эту процедуру не заходит вообще.
9 ZanderZ
 
04.06.13
10:24
(8) я не понял ты каким образом хочешь с 1с связать то ?
10 Кирпич
 
04.06.13
10:33
(0) сначала учить матчасть в (6), потом смотреть доку 1С, потом смотреть сюда

function TAddInObject.Init(pConnection: IDispatch): HResult; stdcall;
begin
 MyConnection := pConnection;

end;
11 qeos
 
04.06.13
10:35
(9) в примерах 1с nativeAPI есть инициализация

 bool CAddInNative::Init(void* pConnection)

в переделаном под delphi тоже есть такая

 function _Init(Obj: PV8ObjectRec; disp: pointer): boolean; stdcall;

соответственно это IDispatch на 1с.. с помощью pConnection можно создавать объекты 1с.

вот как это переложить на нормальный язык, я чтото никак не вкурю.

по теории 1С при создании (подкгрузке) компонента вызывает процедуры инициализации. вот их-то, как я понимаю, я и должен изменить. т.к. в документации написано так:

[code]Инициализация и выгрузка компоненты

Для инициализации и выгрузки компоненты используется интерфейс IInitDone. Этот интерфейс наследован от IUnknown и предназначен для инициализации объекта и завершения работы с объектом.

Init

Синтаксис:
HRESULT Init(IDispatch *pBackConnection)

Параметры:
<pBackConnection> Тип: IDispatch. Указатель на интерфейс 1С:Предприятия.

Возвращаемое значение:
E_FAIL - при инициализации произошла ошибка
S_OK - инициализация прошла успешно

Описание:
При загрузке 1С:Предприятие инициализирует объект компоненты, вызывая метод Init и передавая указатель на IDispatch. Объект может сохранить этот указатель для дальнейшего использования. Все остальные интерфейсы 1С:Предприятия объект может получить, вызвав метод QueryInterface переданного ему интерфейса IDispatch. Объект должен возвратить S_OK, если инициализация прошла успешно, и E_FAIL при возникновении ошибки. Данный метод может использовать интерфейс IErrorLog для вывода информации об ошибках. При этом инициализация считается неудачной, если одна из переданных структур EXCEPINFO имеет поле scode, не равное S_OK. Все переданные в IErrorLog данные обрабатываются при возврате из данного метода. В момент вызова этого метода свойство AppDispatch не определено.[/code]
12 Кирпич
 
04.06.13
10:36
можно действовать в обратном порядке, но тогда будет на годы дольше.
13 qeos
 
04.06.13
10:36
(10) я ж говорю: не используя nativeAPI
14 Кирпич
 
04.06.13
10:39
ну тебе про nativeAPI никто и не писал.
15 qeos
 
04.06.13
10:42
(14) при визарде никаких процедур Init нету, есть Initialize, но она описана в базовом классе и не имеет параметров.
16 Кирпич
 
04.06.13
10:45
(15) шо ищо за визард? если это та древняя фигня, то у TFPList есть pConnection. уже готовый
17 Serginio1
 
04.06.13
10:45
Посмотри http://1c.proclub.ru/modules/mydownloads/personal.php?cid=115&lid=2019
Исходник ВК которая загружает Объект Автоматизации поддерживающий ITypeInfo и выполняет все его свойства и методы через IlanguageExtender.
Использую 10 лет
18 qeos
 
04.06.13
10:47
(16) вот эти визарды или как их там..
http://my.jetscreenshot.com/5394/20130604-2kyi-48kb.jpg
19 Кирпич
 
04.06.13
10:48
+(16)  TDM.AddInFPList.pConnection

типа так
20 Кирпич
 
04.06.13
10:48
(18) у блин. попутал
21 Кирпич
 
04.06.13
10:49
короче (10)
или, если горит, запешитесь на прием к программисту
22 qeos
 
04.06.13
10:51
(21) готов записаться. к кому?
23 Кирпич
 
04.06.13
10:52
(22) ну ко мне запишись
24 qeos
 
04.06.13
11:06
(23) gtalk есть? skype? icq?...etc
25 Кирпич
 
04.06.13
11:06
(24) есть электронная почка
26 Кирпич
 
04.06.13
11:06
)))) пардон. почта
27 Кирпич
 
04.06.13
11:08
пиши чего надо
qxlreport кошка mail RU
28 qeos
 
04.06.13
11:12
смысла нет почтой общаться.

вобщем нужно победить BackConnection для XE4 не используя жесткие костыли.
т.е. элегантно получить backConnection

называй свою цену.
29 ЧеловекДуши
 
04.06.13
11:13
(2) Жесть :)
30 Кирпич
 
04.06.13
11:14
(28) ну нет смысла так нет
31 qeos
 
04.06.13
11:15
(30) просто тут проще.
если будет оплата, тогда почтой ;)
32 Кирпич
 
04.06.13
11:17
что такое "победить BackConnection для XE4" я не понял. да и к тому же XE4 у меня нет.
33 Кирпич
 
04.06.13
11:18
лучше бы на mail написал.и сам заодно понял бы, чего хочешь.
34 qeos
 
04.06.13
11:19
[spoiler]как тут под спойлер поместить?[/spoiler]
[спойлер]или так?[/спойлер]
или так
35 qeos
 
04.06.13
11:20
(33) jr
36 Serginio1
 
04.06.13
11:20
Вообще восьмерка поддерживает события, так же можно передать ссылку на модуль в которой реализовать метод с определенной сигнатурой
v8: Вопрос по NetObjectToIDispatch
37 Serginio1
 
04.06.13
11:26
То есть создай в свем ком объекте событие например DocumentChange и подпишись из 1С.
Не забывай вызывать в потоке 1С. 1С совский эвент ассинхронный.

msword = Новый COMОбъект("Word.Application");

ДобавитьОбработчик msword.DocumentChange, ПриИзмененииДокумента;

Процедура ПриИзмененииДокумента()    Сообщить("Документ изменен");КонецПроцедуры
38 Кирпич
 
04.06.13
11:29
(35) Что jr?
39 qeos
 
04.06.13
11:32
(38) jr = ок

отправил письмо
40 qeos
 
04.06.13
11:33
(37) события работают.. как в компоненте создать объект 1с?
41 Serginio1
 
04.06.13
11:57
(40) Если тебе нужен контекст то, можешь из него передавать, что хочешь. Второй способ это V83.COMConnector
. Ну если посмотришь мою компоненту тебе нужно только создать метод
procedure TAddinTypeInfo.InitFrom1C(const pCon: IDispatch);
Var wnd: HWND;
   pExtWndsSupport:IExtWndsSupport;
begin
    If Not Assigned(pConn) Then
    Begin
    pConn := pCon;
    PEvent := nil;
    IDispatch(pCon).QueryInterface(IAsyncEvent,PEvent);
    pExtWndsSupport := nil;
    IDispatch(pCon).QueryInterface(IExtWndsSupport,pExtWndsSupport);
    If Assigned(pExtWndsSupport) Then
    Begin
    pExtWndsSupport.GetAppMainFrame(wnd);
    Application.Handle := wnd;
    pExtWndsSupport.GetAppMDIFrame(ChildWnd);
    end;
    end;
end

Например для семерки это
obj:=OleVariant(Pconn).AppDispatch;
IDispatch(obj)._AddRef;
Text2:=Obj.CreateObject('Справочник.Товары');

Который вызовется при подключении.
42 Serginio1
 
04.06.13
12:00
41 Вернее ты можешь создать компоненту которая вернет в 1с pCon, а её уже передавать в любой COM объект
43 Serginio1
 
04.06.13
12:01
И тогда тебе вообще не нужно заморачиваться с ВК.
44 qeos
 
04.06.13
12:05
(41) вообще ничего не понял.. надо пообедать сходить мож мозг остынет..
45 qeos
 
04.06.13
14:04
(41) где твоя компонента?
46 qeos
 
04.06.13
14:05
(45) а..
47 Serginio1
 
04.06.13
14:06
Я тебе в 17 ссылку на неё давал
48 qeos
 
04.06.13
14:14
(47) дада...
но это все не то..
чтото здесь я упускаю..

у меня все работает прекрасно кроме того что нету этого BackConnection..
49 Serginio1
 
04.06.13
14:23
Как это нет. PEvent := nil;
    IDispatch(pCon).QueryInterface(IAsyncEvent,PEvent);
Это что? Эта компонента тебе дает возможность просто писать ком объект. От тебя требуется только реализовать метод
procedure TAddinTypeInfo.InitFrom1C(const pCon: IDispatch);

А вот из этого pCon получай что тебе нужно.

IAsyncEvent = interface(IUnknown)
   ['{AB634004-F13D-11D0-A459-004095E1DAEA}']
   procedure SetEventBufferDepth(lDepth: Integer); safecall;
   procedure GetEventBufferDepth(var plDepth: Integer); safecall;
   procedure ExternalEvent(const bstrSource, bstrMessage, bstrData: WideString); safecall;
   procedure CleanBuffer; safecall;
 end;
50 Serginio1
 
04.06.13
14:25
Из него же получай свой BackConnection

obj:=OleVariant(Pconn).AppDispatch;
IDispatch(obj)._AddRef;
Номенклатура:=Obj.Справочники.Номенклатура.СоздатьОбъект();
51 qeos
 
04.06.13
14:38
(50) ты на аське есть?
52 Serginio1
 
04.06.13
15:03
нет
53 qeos
 
04.06.13
15:10
(52) жаль..

тогда пару вопросов.

для получения backConnection, как минимум, достаточно реализовать только IInitDone?
54 qeos
 
04.06.13
15:24
(49) взял твой пример из папки AddinTypeInfo

в 1С я должен создать объект
   попытка
       тест = Новый COMОбъект("AddInTypeInfo.AddInTypeInfo");
   исключение
       с = новый СообщениеПользователю;
       с.Текст = "Ошибка создания объекта "+ОписаниеОшибки();
       с.Сообщить();
   КонецПопытки;
   //тест.Init(Метаданные);
   тест.ProbaWind();
   

окошко из ProbaWind открывается.

как мне вызвать InitFrom1C?
что в параметрах писать?
55 qeos
 
04.06.13
15:26
я уже близко к разгадке )) только не пропадай сейчас -_-
56 Serginio1
 
04.06.13
16:02
(55) Ты не весь пример показал. Это ты создаешь компоненту.
Затем из компоненты ты должен загрузить свой ком объект
тест.LoadOleObject(ПрогИДТвоегоКомОбъекта);

А внутри Ком объекта ты должен реализовать то что написал в 41. Посмотри примеры
57 Serginio1
 
04.06.13
16:04
Для понимания 41 вот объявление класса.
TAddinTypeInfo = class(TAutoObject, IAddinTypeInfo)
  Pconn:Idispatch;
 ChildWnd:HWND;
 PEvent:IAsyncEvent;

У меня очень много работы. Так, что появляться буду не часто.
58 Кирпич
 
04.06.13
16:06
(0) смотри почту. там простой пример. вроде работает
59 qeos
 
04.06.13
16:34
оказывается правильный вариант был такой:
   Если ПодключитьВнешнююКомпоненту("test.test100500") Тогда
       тест = Новый COMОбъект("test.test100500");
       тест.hello();
   Иначе
       с = новый СообщениеПользователю;
       с.Текст = "Ошибка создания объекта "+ОписаниеОшибки();
       с.Сообщить();
   КонецЕсли;


а вот теперь вопрос еще сложнее..
а если у меня компонента должна встраиваться в форме, то ПодключитьВнешнююКомпоненту я все равно эе должен делать гдето в коде?
60 qeos
 
04.06.13
16:37
*же
61 Serginio1
 
04.06.13
16:41
Если тебе нужны создавать окна, то тебе нужны родительские окна
IDispatch(pCon).QueryInterface(IExtWndsSupport,pExtWndsSupport);
    If Assigned(pExtWndsSupport) Then
    Begin
    pExtWndsSupport.GetAppMainFrame(wnd);
    Application.Handle := wnd;
    pExtWndsSupport.GetAppMDIFrame(ChildWnd);

Для контейнеров нужно реализовывать другие интерфейсы и они с ВК никак не связаны.
62 Serginio1
 
04.06.13
16:43
56 это выглядит так
Загружаем ВК
  TypeInfo = СоздатьОбъект("AddIn.AddInFromITypeInfo");

Затем загружаем КОМ объект в котором реализован метод
procedure TAddinTypeInfo.InitFrom1C(const pCon: IDispatch);

     TypeInfo.LoadOleObject("AddinTypeInfo.AddinTypeInfo");
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.