Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.06.16;
Скачать: CL | DM;

Вниз

Делфи и 1с через OLE   Найти похожие ветки 

 
Maniacosaur ©   (2003-05-29 10:11) [0]

Может кто-нибудь сталкивался с проблемой передачи/получения данных из делфи в 1с через OLE?
Глюк у меня вот в чем.

--- Начало кусочка кода ---
var
OneS, Sotr: Variant;
s: string;

begin
try
OneS:=CreateOleObject("V77.Application");
except
on EOleSysError do begin
....
end
end;

OneS.Initialize(OneS.RMTrade,"/D"+Paths.Strings[ConfCombo.ItemIndex],"NO_SPLASH_SHOW");

Sotr:=OneS.CreateObject("Справочник.Сотрудники");
s:="Уволенные";

!!!! if Sotr.НайтиПоНаименованию(s)=0 then
begin
Sotr.НоваяГруппа;
Sotr.Наименование:="Уволенные";
Sotr.Записать;
end;

--- Конец кусочка кода ---

Вопрос касается строчки помеченно "!!!". Если в параметрах стоит
переменная типа string или variant, то вываливается с ошибкой о
недопустимом типе. Если стоит указатель на строку символов типа PChar,
то все проходит, но в итоге оказывается что хоть параметр и передался,
оно не нашло в справочнике то, что искал (хотя это заведомо есть).
НО. Если в параметре указать непосредственно "Уволенные", то все
работает как надо и все находится.


 
Skier ©   (2003-05-29 10:14) [1]

StringToOleStr(...) ?


 
MMF ©   (2003-05-29 10:23) [2]

Используй WideString


 
paxer   (2003-05-29 10:54) [3]

У НайтиПоНаименованию() три параметра. Все три надо передавать. Пустой параметр (не указанный) - Unassigned.


 
Maniacosaur ©   (2003-05-29 15:06) [4]

StringToOleStr тоже пробовал. Результат - не находит то, что нужно.
НайтиПоНаименованию пробовал и со всеми тремя параметрами (причем перебрал значения). Не помогает


 
Serginio   (2003-05-29 15:30) [5]

Вообще Delphi автоматически переводит String в WideString;
Можно использовать глобальные функции и переменные объявленные как Экспорт. (процедуры не прокатывают). Но твоя ситуация достаточно странная. Объяви на всякий случай s:WideString;

И учти опуская 3 параметр можешь получить не полное соответствие.
И используй не Variant а OleVariant;

НайтиПоНаименованию(<?>,,);
Синтаксис:
НайтиПоНаименованию(<Наименование>,<Режим>,<ФлагПоиска>)
Назначение:
Найти элемент справочника по наименованию.
Возвращает: 1 - если действие выполнено;
0 - если действие не выполнено (элемент не найден).
Параметры:
<Наименование> - строка с наименованием искомого элемента справочника,
<Режим> - необязательный параметр. Число: 1 - поиск внутри установленного подчинения (родителя); 0 - поиск во всем справочнике вне зависимости от родителя. Значение по умолчанию - 1.
<ФлагПоиска> - необязательный параметр. Число: 1 - найти точное соответствие наименования; 0 - найти наименование по первым символам. Значение по умолчанию - 0.
Замечание:
Метод можно использовать только для объектов, созданных функцией СоздатьОбъект.


 
Maniacosaur ©   (2003-05-30 11:49) [6]

Да, я забыл уточнить, что то, что я ищу - группа.
Когда вместо Variant поставил OleVariant - начало ругаться на несоответствие типа. :-(


 
Serginio   (2003-05-30 13:42) [7]

Одной из возможностей такого поведения 1С может буть что при передачи параметра Delphi использует ссылку на строку
Args[j-i].vt:=VT_BYREF or VT_BSTR ;
Args[j-i].byRef:=@p^[i];
Используй ВК или диспинтерфейсы. Для справки смотри
http://www.1c.hippo.ru/cgi-bin/predownl.cgi?id=2019


 
paxer   (2003-05-30 14:20) [8]

Все должно работать. Единственно, если параметр - строка, то это должна быть перемення типа String, а не Variant.


 
Serginio   (2003-05-30 14:43) [9]

Сейчас проверил "Неверно задана вызывающая сторона"
Так если вызывается строка через переменную идет код

BStr := StringToOleStr(PString(ParamPtr^)^);
PStr := PString(ParamPtr^);
ArgPtr^[0] := varOleStr or varByRef;
ArgPtr^[2] := Integer(@BStr);



Если же подставитьсторку
Sotr.НайтиПоНаименованию("Уволенные")=0
то вызывается
BStr := StringToOleStr(PString(ParamPtr)^);
PStr := nil;
ArgPtr^[0] := varOleStr;
ArgPtr^[2] := Integer(BStr);

То есть 1С не поддерживает параметры переданные как varByRef


 
Serginio   (2003-05-30 15:01) [10]

А вот такой код прокатывает на ура
procedure TForm1.Button1Click(Sender: TObject);
Var v1,sp:Olevariant;
s:String;
Procedure callSp(Const s:String);
begin
If sp.НайтиПоНаименованию(s,0,1)=1 Then
ShowMessage(sp.Наименование);
end;
Begin
v1:=CreateOleObject("v77.Application");
v1.initialize(v1.RMTrade,"","");
s:="Хозтовары";
sp:=v1.CreateObject("Справочник.Товары");
CallSp(s);


end;


 
Maniacosaur ©   (2003-06-03 11:37) [11]

Дааа. Голь на выдумки хитра!!!! ;-) ОГРОМНОЕ ЧЕЛОВЕЧЕСКОЕ СПАСИБО!!!!!!


 
Serginio   (2003-06-03 17:31) [12]

Как раз проверил вызов из ВК функций экспорт глобального модуля 1С. Там тоже была заковыка с передачей параметров объектов 1С. Лечится так же. Созданием дополнительной процедурой с определением переменной как Const.



Страницы: 1 вся ветка

Текущий архив: 2003.06.16;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.015 c
1-50350
killer
2003-06-03 17:48
2003.06.16
Как програмно создать кнопку?


3-50205
alextov
2003-05-26 10:26
2003.06.16
Запросом выбрать клиентов с днем рожд. в ближайшие 10 дн.


14-50439
Deflorator+
2003-05-22 14:25
2003.06.16
Залить фигню типа


1-50295
Andrei-BAM
2003-06-04 17:09
2003.06.16
Проблема с прятанием(HIDE) контрола


1-50289
killer
2003-06-03 17:58
2003.06.16
Как программно создать новую кнопку в ToolBar?