Имя: Пароль:
1C
 
Создание внешних компонент. Передача параметров. Delphi
0 totparen
 
29.06.11
11:37
Ребята, кто имел опыт написания ВК для 1С? Нашёл на Инфостате DLL-Loader: ВК для 1С, там есть пример написания функций на Delphi, при вызове из 1С возвращает тип "Строка".

 RESULT := trim(L.Text);


Внимание вопрос - каким образом возвращать в 1С тип данных "Структура"? Какой тип данных нужно прописать в delphi?
1 mic_net
 
29.06.11
11:54
Попробуй в delphi через двумерные массивы
2 Serginio1
 
29.06.11
17:08
Нужно создавать его на стороне 1С
3 H A D G E H O G s
 
29.06.11
17:12
Нужно создавать через AppDispatch
4 Serginio1
 
29.06.11
17:13
То есть имея Init(pConnection: IDispatch) вызвать AppDispatch
5 H A D G E H O G s
 
29.06.11
17:17
(4) Только не в самом Ините
6 H A D G E H O G s
 
29.06.11
17:18
Качаем TestVK от Ромикса. Качаем, качаем, там хорошая, рассово верная объектная модель.
7 Serginio1
 
29.06.11
17:24
(5) Ну разумеется. Имеется ввиду

На восьмерке не вызывал но новый должен работать через.


Объект=OleVariant(pConnection).AppDispatch;
ТипЗначения = Объект.Тип("Структура");
КвСтр = Новый(ТипЗначения);
8 Serginio1
 
29.06.11
17:25
Вернее Объект.Новый(ТипЗначения);
9 H A D G E H O G s
 
29.06.11
17:28
(7) Рускоязычные в моем Дельфи не катят.

Объект.NewObject(ТипЗначения);

и никак иначе.
10 H A D G E H O G s
 
29.06.11
17:28
Вернее
Объект.NewObject("Структура");
11 Serginio1
 
29.06.11
17:31
(0) Насчет ВК по сути тебе нужен только pConnection, для получения интерфейсов. Не знаю как сейчас в восьмерке но в семерке для объектов реализующих только IDIspatch была проблема с передачей в параметрах  объектов 1С, оут параметров. Я лично уже лет восемь пользуюясь  ВК которая загружает Объект Автоматизации поддерживающий ITypeInfo и выполняет все его свойства и методы через IlanguageExtender
http://1c.proclub.ru/modules/mydownloads/personal.php?cid=115&lid=2019
12 Serginio1
 
29.06.11
17:32
(9) Да давно я уже Delphi в руках не держал. На C# все проще. А я вспоминал про этот NewObject, спасибо за напоминание
13 Serginio1
 
29.06.11
17:33
(9) Почему? Помню в семерке через олеварианты любые вызовы
14 totparen
 
02.07.11
22:36
Может у кого пример кода есть, который вернёт в 1С, скажем ТабилицуЗначений?
15 Mashinist
 
02.07.11
23:15
Tab:=GetNParam(paParams,1); - из 1С передается таблица значений и она попадает в дельфи - второй параметр метода если считать от нуля...

Error:=Error+IsValueTable(Tab); - IsValueTable - функция проверяющая действительно ли передали таблицу значений

дальше выполним запрос и получим датасет
         if Error=0 then
         begin
           q:=Sql.OpenQuery(String(GetNParam(paParams,0)));

если все нормально - сконвертируем его в ТЗ
          if (Assigned(q)) and (sql.ErrorFlag = 0) then
           begin
             Error:=ConvertDataSetToValueTable(q,Tab);
           end

ConvertDataSetToValueTable(q,Tab); - конфертирует DataSet - тут уже нужно смотреть что есть у кого - в таблицу значений




{ Переводим DataSet в таблицу значений }
function TAddSQLObject.ConvertDataSetToValueTable(q: TDataSet; Tab: OleVariant): integer;
var
 Err: integer;
 i,j: integer;
 s: string;
 f: TField;
 Str: OleVariant;
begin
 Err:=IsValueTable(Tab);
 if Err = 0 then
 begin
   Tab.Очистить;
   if Assigned(q) then
   begin
     for i:=0 to q.FieldCount-1 do
     begin
       f:=q.Fields[i];
       if Ver1C = ver1cv8 then
         Tab.Колонки.Добавить(f.FieldName)
       else
         Tab.НоваяКолонка(f.FieldName,VT_EMPTY,VT_EMPTY,VT_EMPTY,f.FieldName,12);
     end;
     if Ver1C = ver1cv8 then
     begin
       while not q.EOF do
       begin
         Str:=Tab.Добавить;
         for j:=0 to q.FieldCount-1 do
         begin
           f:=q.Fields[j];
           if not(q.Fields[j].Value=null) then
           begin
             s:=f.AsString;
             if f.DataType=ftFloat then
               Str.Установить(j,StringReplace(s,',','.',[rfReplaceAll]))
             else
               Str.Установить(j,s);
           end;
         end;
         q.Next;
       end;
     end
     else
     begin
       i:=0;      
       while not q.EOF do
       begin
         Tab.НоваяСтрока;
         for j:=0 to q.FieldCount-1 do
         begin
           f:=q.Fields[j];
           if not(q.Fields[j].Value=null) then
           begin
             s:=f.AsString;
             if f.DataType=ftFloat then
               Tab.УстановитьЗначение(i+1,j+1,StringReplace(s,',','.',[rfReplaceAll]))
             else
               Tab.УстановитьЗначение(i+1,j+1,s);
           end;
         end;
         inc(i);
         q.Next;
       end;
     end;
   end
   else
   begin
     Err:=1;
     Tab.Очистить;
   end;
 end;
 Result:=Err;
end;


function TAddSQLObject.CallAsFunc(lMethodNum: Integer; var pVarRetValue: OleVariant; var paParams: PSafeArray{(OleVariant)}): HResult; stdcall;
var
 q: TDataSet;
 Tab: OleVariant;
begin
 case TMethods(lMethodNum) of
.....................
   methOpenQuery:
     begin
       { SQL -> OpenQuery }
       if sql.IsConnected then
       begin
         pStatusLine.SetStatusLine('Query is executing ...');
         Tab:=GetNParam(paParams,1);
         Error:=IsString(GetNParam(paParams,0));
         Error:=Error+IsValueTable(Tab);
         if Error=0 then
         begin
           q:=Sql.OpenQuery(String(GetNParam(paParams,0)));
           if (Assigned(q)) and (sql.ErrorFlag = 0) then
           begin
             Error:=ConvertDataSetToValueTable(q,Tab);
           end
           else if sql.ErrorFlag = 0 then
           begin
             sql.ErrorFlag:=1;
             Error:=1;
           end;
           q.Free;
         end
         else
         begin
           sql.ErrorFlag:=1;
           Error:=1;
         end;
         pStatusLine.ResetStatusLine;
       end
       else
       begin
         sql.ErrorFlag:=1;
         Error:=1;
       end;
       pVarRetValue:=Error;
     end;

unction TAddSQLObject.IsValueTable(Tab: OleVariant): integer;
var
 Err: integer;
begin
 Err:=0;
 try
   {если ошибка, считаем переменную не таблицей значений}
   if Ver1C = ver1cv8 then
     Tab.Колонки.Количество
   else      
     Tab.КоличествоКолонок;
 except
   Err:=1;
 end;
 Result:=Err;
end;
16 H A D G E H O G s
 
02.07.11
23:30
Лениво разбирать ахтунг код.
Тебе же сказали - юзать testvk от ромикса