Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.06.16;
Скачать: [xml.tar.bz2];

Вниз

Делфи и 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.006 c
8-50407
grei
2003-03-03 20:15
2003.06.16
gif, gif, gif, gif, gif, gif...


1-50353
arcoant
2003-06-03 19:52
2003.06.16
Поиск файлов


3-50244
udf
2003-05-26 17:06
2003.06.16
при попытке обращения к функции ошибка...


3-50262
Rocker
2003-05-25 03:45
2003.06.16
Независимость от регистра


14-50512
Nikos
2003-05-31 14:21
2003.06.16
Какой компонент использовать?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский