Текстовое представление объектов 1С во внешней компонентеЧасто требуется получить текстовое представление объектов 1С, например, чтобы записать их в базу данных или вернуть их из базы данных. Приведен пример внешней компоненты на Delphi. | | Автор статьи: romix | Редакторы: Последняя редакция №3 от 23.01.07 | История URL: http://kb.mista.ru/article.php?id=449 | |
Ключевые слова: ЗначениеВСтрокуВнутр, ЗначениеИзСтрокиВнутр, ВК, Delphi
Тестовый пример для скачивания:
http://x-romix.narod.ru/2007_11_22_Rekv.rar
(~58 К, скачивать ЛЕВОЙ кнопкой мыши).
///////////////////////////////////////////////////////////////////////
//Удваивает кавычки " в строке
function DoubleQuotes(str: String): String;
var i: Integer;
var c: char;
begin
Result:='';
for i:=1 to Length(str) do begin
c:=str[i];
if c='"' then begin
Result:=Result+'""';
end else begin
Result:=Result+c;
end;
end;
end;
///////////////////////////////////////////////////////////////////////
function AddInObject.CallAsFunc(lMethodNum: Integer; var pvarRetValue: OleVariant; var paParams: PSafeArray): HResult; stdcall;
{Здесь 1С выполняет код внешних функций}
var
obj : IDispatch;
obj1 : OleVariant;
obj0 : OleVariant;
var s: String;
begin
try
pvarRetValue:=0;
ErrorMsg:='';
case TMethods(lMethodNum) of
methValueToString: //ЗначениеВСтрокуВнутр
begin
obj := OleVariant(i1cv7).AppDispatch;
obj._AddRef;
obj0:=GetNParam(paParams,0); //1-й параметр метода
s:=Variant(obj).ValueToStringInternal(obj0);
pvarRetValue:=s; //возвращаем строку вида {"B","0","0","12","0","0"," 2 "}
end;
methValueFromString: begin //ЗначениеИзСтрокиВнутр
obj := OleVariant(i1cv7).AppDispatch;
obj._AddRef;
s:=GetNParam(paParams,0); //1-й параметр метода - строка вида {"B","0","0","12","0","0"," 2 "}
s:=trim(s);
s:=DoubleQuotes(s); //удваиваем кавычки
obj1:=Variant(obj).EvalExpr('ЗначениеИзСтрокиВнутр("'+s+'")');
pvarRetValue:=IDispatch(obj1); //возвращаем ссылку на объект
end;
else begin
CallAsFunc := S_FALSE;
Exit;
end;
end; //case
except
on E: Exception do begin
ShowErrorLog(E.Message);
ErrorMsg:=E.Message;
end;
end;
CallAsFunc := S_OK;
end;
|