Имя: Пароль:
1C
1С v8
COMObject
0 MrSmola
 
25.10.12
11:15
С COMObject столкнулся впервые. Что требуется
В 1с есть функция которая возвращает результат запроса в виде таблицы значений.
Например:
Функция ПолучитьТЗ()
1 rutony
 
25.10.12
11:17
(0) Нипанятно нисего...
2 Axel2009
 
25.10.12
11:17
написать можно любую функцию..
3 Wobland
 
25.10.12
11:17
(0) так. теперь говори, что есть
4 yuch
 
25.10.12
11:18
Там можно практически все что угодно.
А чего тебе надо, нимпанятна...
5 1Страх
 
25.10.12
11:18
(0) ставлю на слово "экспорт" и имя модуля
6 Wobland
 
25.10.12
11:19
телепатов тут много. телепатирую: не используй свои корявые функции, используй запрос ком-объекта
7 rutony
 
25.10.12
11:19
(5) Вот так взял и все карты на стол выложил =(
8 Reset
 
25.10.12
11:23
Наверное, ему COMобъект вернула функция и он не может его, запример, Загрузить()
9 MrSmola
 
25.10.12
11:25
Функция ПолучитьТЗ() Экспорт
   Запрос = Новый Запрос;
   ...
   Результат = Запрос.Выполнить().Выгрузить();
   
  Возврат Результат;
КонецФункции;

Делаю из "соседней" базы 1С:
Ole1C = Новый COMObject("V82.COMConnector");
Ole1C2 = Ole1C.Connect("Srvr=1c:1741;Ref=База;Usr=Пользователь;Pwd=Пароль");    
Result = Ole1C2.МойМодуль.ПолучитьТЗ();

Работает. Возвращает ТЗ как COM

Делаю так (в Delphi):
var
   Ole1C : OleVariant;
   Ole1C2 : OleVariant;
   
begin
   Ole1C := CreateOleObject('V82.Application');  
   Ole1C2 := Ole1C.Connect('Srvr=1c:1741;Ref=База;Usr=Пользователь;Pwd=Пароль');    
   Result := Ole1C2.МойМодуль.ПолучитьТЗ();
end;

Не работает. выдает ошибку [Record, object or class type required]

Куда смотреть?(
10 Wobland
 
25.10.12
11:26
а мы продолжаем серию игр "Что, почему и как". сегодняшняя команда знатоков борется против телезрителя MrSmola
итак, время вышло. кто будет отвечать?
11 Wobland
 
25.10.12
11:27
итак, Reset объявляется победителем состязаний и получает в награду шапочку из фольги
12 MrSmola
 
25.10.12
11:27
(10) мне тут помощь нужна, а не поговорить
13 1Сергей
 
25.10.12
11:28
(9) ты думаешь в дельфях есть таблицы значений?
14 1Страх
 
25.10.12
11:29
а так?

Result := Ole1C2.МойМодуль.ПолучитьТЗ;
15 Reset
 
25.10.12
11:29
Я не шарю в дельфях(разве на уровне турбо паскаля 8х г.в.), но разве переменная Result не должна была быть объявленной в секции var?
Хотя это так, "поговорить"
16 1Страх
 
25.10.12
11:31
(15) это скорее всего тело функции, Result это предопределенная в контексте функции переменная - ее результат
17 Reset
 
25.10.12
11:32
(16) т.е. имя функции Result? дада что-то было такое
18 Wobland
 
25.10.12
11:32
соревнования продолжаются. телезритель уже телепатически передаёт знатокам второй вопрос
19 1Страх
 
25.10.12
11:33
(17) нет, имя другое
20 Wobland
 
25.10.12
11:33
(17) типа ретурн?
21 1Страх
 
25.10.12
11:34
(20) типа, только без выхода из функции

http://delphibasics.ru/Result.php
22 Wobland
 
25.10.12
11:34
а отвечать на этот раз будет 1Сергей
23 Reset
 
25.10.12
11:34
хм ну ладно.
А может, раз это возвращаемое значение, то описана функция не с тем типом
24 Reset
 
25.10.12
11:35
(21) Спасибо
25 1Страх
 
25.10.12
11:35
(23) возможно надо узнать, что делается с этим результатом дальше
26 1Сергей
 
25.10.12
11:36
Не поймёт Дельфя ТЗ. Возможно передавать только простые типы
27 1Страх
 
25.10.12
11:37
(26) да что ты говоришь, она поймет любой COM-объект
просто надо работать с ним правильно
28 Wobland
 
25.10.12
11:37
ну что, 1:1?
29 Wobland
 
25.10.12
11:38
я вот тоже, как (27) задумался, что возвращается-то не ТЗ, а КОМ
30 Wobland
 
25.10.12
11:38
(29) ну.. подлежит возвращению
31 MrSmola
 
25.10.12
11:38
(14)  а если надо параметры передать?
32 1Страх
 
25.10.12
11:39
(31) тогда со скобками, нет параметров - нет скобок
33 Wobland
 
25.10.12
11:40
меня смущает это "результат запроса в виде таблицы значений". не лучше ль взять и самостоятельно запросить?
34 1Страх
 
25.10.12
11:42
хотя насчет (14) могу врать, но попробовать стоит
35 MrSmola
 
25.10.12
11:43
вот что делается с Result^

procedure TShpScript.Make;
var
       ResultTable : OleVariant;
       JvInterpreterProgram1: TJvInterpreterProgram;
       Row, Col : Integer;
       FieldsStr : String;
       InsField, InsVal : String;      
begin
       JvInterpreterProgram1 := TJvInterpreterProgram.Create(nil);
       try
               JvInterpreterProgram1.Pas.Text := InitParamInSQL((Collection as TShpScripts).Report.Params.ListOfParams, Text);
               JvInterpreterProgram1.Run;
               ResultTable := JvInterpreterProgram1.VResult;
               FieldsStr := '';
               for Col := 0 to ResultTable.Columns.Count() - 1 do
                       FieldsStr := FieldsStr + '"'+ResultTable.Columns.Get(Col).Name+'" VARCHAR2(2000), ';
               SetLength(FieldsStr, Length(FieldsStr) - 2);
               DropTable(OraDBName, TableName);
               RunSQL(OraDBName,'CREATE TABLE %s (%s) %s',[TableName, FieldsStr, TableSpace4CreateTMPTables]);
               // Заполняем DataSet
               for Row := 0 to ResultTable.Count() - 1 do
               begin
                       InsField := '';
                       InsVal := '';
                       for Col := 0 to ResultTable.Columns.Count() - 1 do
                       begin
                               if not VarIsType(ResultTable.Get(Row).Get(Col),varDispatch)
                               then begin
                                       InsField := InsField + '"'+ResultTable.Columns.Get(Col).Name+'", ';
                                       InsVal := InsVal + ''''+ VarToStr(ResultTable.Get(Row).Get(Col))+''', ';
                               end;
                       end;
                       SetLength(InsField, Length(InsField) - 2);
                       SetLength(InsVal, Length(InsVal) - 2);
                       RunSQL(OraDBName,'insert into %s (%s) values (%s)',[TableName,InsField, InsVal]);
               end;
 finally
       JvInterpreterProgram1.Free;
 end;
end;
36 1Сергей
 
25.10.12
11:44
(35) И какой тип у ResultTable?
37 MrSmola
 
25.10.12
11:46
здесь выполняется часть скрипта описанного ранее:              
JvInterpreterProgram1.Pas.Text := InitParamInSQL((Collection as TShpScripts).Report.Params.ListOfParams, Text);
               JvInterpreterProgram1.Run;

в том скрипте есть переменная Result которой присваевается результат скрипта (т.е. ком объект)

строчку-
ResultTable := JvInterpreterProgram1.VResult;

можно рассматривать как: ResultTable := Result;
38 MrSmola
 
25.10.12
11:47
(36) ResultTable := ---это COM
39 1Страх
 
25.10.12
11:48
так ошибка то в какой строке?
40 MrSmola
 
25.10.12
11:49
(39) JvInterpreterProgram1.Run;
41 1Страх
 
25.10.12
11:50
(40) может твой интерпретатор не умеет работать с COM-объектами?
Если этот код всунуть непосредственно в код Delphi?
42 MrSmola
 
25.10.12
11:50
Скажу что обработка КОМа работет - проверено, не работает вот эта часть

var
   Ole1C : OleVariant;
   Ole1C2 : OleVariant;
   
begin
   Ole1C := CreateOleObject('V82.Application');  
   Ole1C2 := Ole1C.Connect('Srvr=1c:1741;Ref=База;Usr=Пользователь;Pwd=Пароль');    
   Result := Ole1C2.МойМодуль.ПолучитьТЗ();
end;
43 MrSmola
 
25.10.12
11:52
СОМ не хочет работать именно с моей функцией Result := Ole1C2.МойМодуль.ПолучитьТЗ();
44 1Страх
 
25.10.12
11:53
(43) так ты (14) пробовал?
45 MrSmola
 
25.10.12
11:55
(44) а как мне тогда параметры передать в мою функцию?
46 1Страх
 
25.10.12
11:56
(45) у тебя же их нет или ты как всегда не договариваешь?
47 MrSmola
 
25.10.12
11:58
(46) решил не перегружать подробностями. Да, мне надо ещё передать параметры.
48 1Страх
 
25.10.12
12:00
(47) какие параметры? интересно: не договарить как раз строку в которой ошибка
49 1Сергей
 
25.10.12
13:42
(47) параметры, поди, ещё агрегатные?
50 oleg_km
 
25.10.12
13:42
(43) А эта конструкция вообще дельфями компилируется? Насколько я понимаю, ты хочешь использовать раннее связывание, но для этого нужно импортнуть в проект библиотеку типов. Мне кажется в данном случае нужно использовать позднее связывание что-то типа:

   HRESULT hRes;
   CLSID ClsID;
   hRes = CLSIDFromProgID(cProgID, &ClsID);
   if (!CheckError(hRes, TEXT("CLSIDFromProgID")))
       return false;

   hRes = CoCreateInstance(ClsID, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch,

Это на VC++
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.