Имя: Пароль:
1C
 
Вопрос по вк: Delphi + 1с 8.1
0 DSSS
 
28.03.11
18:07
Доброго дня!
Delphi 7.0, 1С 8.2.13.205
Начал изучать вк, хочу решить простенькую задачу: нужно передать в вк номер и дату документа авансовый отчет, чтобы по этим параметрам получить ссылку на документ. Что делаю:
В Delphi:

 function T_LIB1_object.meth2(mode: TMode): String;
 var NUM: String;
     OLEDOC1: Variant;
     DATEDOC: TDateTime;
 begin
   case mode of
     m_rus_name: Result:='ПоискПоНомеру';
     m_eng_name: Result:='GetNUM';
     m_n_params: g_NParams:=2;
     m_execute: begin

       NUM:=GetParamAsString(0);

       ShowMessage(NUM);

       DATEDOC:=GetParamAsTDateTime(1);

       ShowMessage(DateTimeToStr(DATEDOC));

       OLEDOC1:=s1C8_ole.Документы.АвансовыйОтчет;
       OLEDOC1:=OLEDOC1.НайтиПоНомеру(NUM,DATEDOC);

       g_Value:=OLEDOC1;
     end;
   end;//case
 end;

В 1С:

Результат = LIB1.GetNUM("ТД00-000001",ТекущаяДата());

Тип значения "Результата" COMОбъект. Подскажите, пжл, как получить не COMОбъект, а именно ссылку?
1 H A D G E H O G s
 
28.03.11
18:23
s1C8_ole

как получаешь?
2 DSSS
 
28.03.11
18:27
(1)
s1C8_ole:=UnAssigned;
s1C8_ole:=CreateOleObject('V82.COMConnector');
s1C8_ole:=s1C8_ole.Connect(Trim(ConnectString));
3 DSSS
 
28.03.11
18:40
Где-то видел ссылку на форуме как раз по такой теме, не могу найти что-то, может кто подскажет, где почитать?
4 DSSS
 
28.03.11
19:10
Подниму.
5 H A D G E H O G s
 
28.03.11
21:33
Мистец.

А зачем оно тогда, это ВК?
6 H A D G E H O G s
 
28.03.11
21:39
s1C8_ole:=OleVariant(PConnect).AppDispatch;

Это мы получим "контекст" текущей базы, к которой подключена ВК.

Этот контекст поймет твою ссылку.

PConnect:IDispatch;
- свойство экземпляра класса T_vk_object.

romix за нас всех уже подумал.
7 DSSS
 
29.03.11
17:03
(6) Спасибо. Если использую s1C8_ole:=OleVariant(PConnect).AppDispatch;
В 1с возникает ошибка:
LIB1 : Access violation at address 0C8B648F in module 'LIB1.dll'. Read of address 00000000.

Подскажи, пжл, как побороть?
И если можно, подскажи где можно посмотреть пример использования OleVariant(PConnect).AppDispatch;
8 GenV
 
29.03.11
17:10
9 DSSS
 
29.03.11
19:11
(8) Спасибо! смотрел статью ромикса в КЗ, но в том примере нет работы со ссылочными типами. На его сайте скачал шаблон для работы специально со ссылками. Пытаюсь перевести его (шаблон) на работу с 8.2. Подскажите, пжл, почему возникает ошибка
"Внешняя компонента : Method 'ValueToStringInternal' not supported by automation object."
при выполнении вот такого кода в 8.2

   Ссылка = ПолучитьСсылкуНаСервере();
   
   Попытка
       СВнутр = vk_rekv.ЗначениеВСтрокуВнутр(Ссылка);
       Сообщить(СВнутр);
   Исключение
       Сообщить(ОписаниеОшибки());    
   КонецПопытки;
10 reanimator
 
29.03.11
20:00
(0) Набор невизуальных компонент для работы с 1С 7.7 через OLE (Pascal, Delphi 5)
http://www.1partner.nnov.ru/develop/opis180.shtml

Хоть и для пятого, но думаю будет полезно.
11 DSSS
 
29.03.11
20:23
(10) Спасибо, только все для 77.
На 77 библиотека Ромикса работает, все нормально, проблема
с 8.2 в (9)
12 DSSS
 
30.03.11
09:39
Подниму. Интересует ответ на (9)
13 lxs
 
30.03.11
09:42
(12) ссылка нужна в 16тиричном представлении?
14 DSSS
 
30.03.11
09:55
(13) без разницы. Нужно заставить ВК научиться принимать ссылку из 1с и обрабатывать ее. Пусть это будет ЗначениеВСтрокуВнутр, как в примере ромикса.
15 lxs
 
30.03.11
10:14
(1)
s1C8_ole:=UnAssigned;
s1C8_ole:=CreateOleObject('V82.COMConnector');
s1C8:=s1C8_ole.Connect(Trim(ConnectString));

id: = s1C8.string(s1C8.Документы.АвансовыйОтчет.НайтиПоНомеру(NUM,DATEDOC).uuid())
16 DSSS
 
30.03.11
11:08
(15) Спасибо, но мне нужно способом, который посоветовал   H A D G E H O G s в (6)
17 lxs
 
30.03.11
11:27
s1C8.ValueToStringInternal(s1C8.Документы.АвансовыйОтчет.НайтиПоНомеру(NUM,DATEDOC))
19 H A D G E H O G s
 
30.03.11
12:29
type T_vk_object = class(TObject)
 public
   g_Value: OleVariant;
   g_NParams: Integer;(???????)
   g_Params: PSafeArray;
   g_Event, g_Event_Data: String;
   pConnect:IDispatch;
..................


модуль
addinObj.pas
процедура
Init
 vk_object:=T_vk_object.Create();
 vk_object.pConnect:=pConnection;

процедура
Done

  vk_object.pConnect:=nil;

 vk_object.Destroy();
20 H A D G E H O G s
 
30.03.11
12:38
function T_vk_object.meth1(mode: TMode): String;
 var NUM: String;
     OLEDOC1: OleVariant;
     Res:OleVariant;
     DATEDOC: TDateTime;
     s1C8_ole:OleVariant;
 begin
   case mode of
     m_rus_name: Result:='?????????????';
     m_eng_name: Result:='GetNUM';
     m_n_params: g_NParams:=2;
     m_execute: begin
       NUM:=GetParamAsString(0);
       DATEDOC:=GetParamAsTDateTime(1);
       s1C8_ole:=OleVariant(PConnect).AppDispatch;
       OLEDOC1:=s1C8_ole.Документы.АвансовыйОтчет;
       Res:=OLEDOC1.НайтиПоНомеру(NUM,DATEDOC);
       OLEDOC1:=unassigned;
       s1C8_ole:=unassigned;
       g_Value:=Res;
     end;
   end;//case

 end;

В процедуре AddInObject.CallAsFunc модуля AddinObj.pas заменить
pvarRetValue := vk_object.g_Value;
         
на
pvarRetValue := vk_object.g_Value;
vk_object.g_Value:=unassigned;

И добавить variants в uses

Недоработал Ромикс.
21 DSSS
 
30.03.11
12:45
(19), (20) Спасибо тебе, дома попробую.
22 romix
 
31.03.11
13:55
23 DSSS
 
06.04.11
02:34
(19),(20)
Попробовал, вроде все сделал по твоим рекомендациям.

При выполнении в 1С
&НаКлиенте
Процедура Команда(Команда)
   
   Ссылка = TestVK.GetNUM("ТД00-000001",ТекущаяДата());
       
КонецПроцедуры

Возникает ошибка:

TestVK : Method 'Документы' not supported by automation object.

Как побороть?
24 H A D G E H O G s
 
06.04.11
11:22
(23) Скинь свой проджект на файлообменник.
25 DSSS
 
06.04.11
11:29
(24). ОК. Через несколько часов, когда буду дома.
26 DSSS
 
06.04.11
15:38
(24)
Delphi 7.0 (4.453)
1C 8.2.13.205
УНФ(демо) 1.2.3.2

http://rghost.ru/5098007
27 DSSS
 
06.04.11
16:50
Может все дело в

&НаКлиенте
Ссылка = TestVK.GetNUM("ТД00-000001",ТекущаяДата());

По-хорошему бы ссылку получить на сервере надо..
В ВК тоже получается в контексте клиента все выполняется? Вот интересно в ВК для 8.2 можно указывать среду исполнения?
28 H A D G E H O G s
 
06.04.11
16:54
(27) RTFM!
29 H A D G E H O G s
 
06.04.11
16:54
COM ВК не работает на Тонком и Веб клиентах!
30 H A D G E H O G s
 
06.04.11
16:55
Только NativeAPI.

Так что либо сервер, либо nativeAPI
31 H A D G E H O G s
 
06.04.11
16:59
Хотя в FM этого не написано. Странно.

p.s. Запусти на сервере.
32 DSSS
 
07.04.11
09:12
(29)>> COM ВК не работает на Тонком и Веб клиентах!
Точно, не работает. Спасибо!
Запустил толстого клиента, все работает нормально.
33 DSSS
 
07.04.11
09:15
(30)>> Так что либо сервер, либо nativeAPI
Насчет nativeAPI как я понимаю та нельзя работать со ссылочными типами, а только с примитивными.., так что не вариант.
Остается COM &НаСервере. Не подскажешь, где можно посмотреть такой способ реализации ВК в 8.2? что-то все что нашел про ПодключитьВнешнююКомпоненту в 8.2 все про nativeAPI.
34 DSSS
 
07.04.11
09:16
Небольшая просьба к модераторам: исправьте, пожалуйста, в названии ветки 8.1 на 8.2
35 H A D G E H O G s
 
07.04.11
12:10
(33) Чуть позже прмиер выложу
36 DSSS
 
07.04.11
14:49
(35) ОК. Буду очень признателен.
37 Kerk
 
07.04.11
18:12
Закладка.