Текущий архив: 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.47 MB
Время: 0.006 c