по мотивам проблемы обсуждаемой в ветке SOAP клиент на 7.7...OleExSup - внешняя компонента расширяющая штатные возможности обращения к OLE-объектам
В настоящее время это касается только передачи массивов SAFEARRAY, в качестве параметров и возвращаемого значения, при вызове метода объекта через интерфейс IDispatch или при обращении к свойствам.
Цитата:Раздел I
Краткая предыстория:
Иногда возникает необходимость передать массив в некоторый OLE-объект или получить массив из него.
Пример с использованием MSScriptControl.ScriptControl
//Создание скрипта и получение объекта
ScrCtrl = СоздатьОбъект("ScriptControl");
ScrCtrl.Language="VBScript";
ScrCtrl.AddCode("
|Function Method1()
| Method1 = Array(1.2345, ""_Строка_"", Date)
|End Function
|
|Function Method2(Arr)
| For Each Item In Arr
| MsgBox Item
| Next
|End Function
|");
CodeObject = ScrCtrl.Modules("Global").CodeObject;
//Вызов метода объекта
Массив = CodeObject.Method1();
При попытке выполнить такой код получим исключение на последней строке с описанием ошибки:
"Тип переменой не поддерживается".
Оно и понятно - v7.7 не умеет хранить в своих переменных массивы типа SAFEARRAY (в отличии, кстати, от v8.X)
Вывод: нужно во-первых реализовать объект-контейнер массива.
Во-вторых реализовать возможность вызова методов IDispatch умеющую обращаться с этим контейнером.
Цитата:Раздел II
Класс OleSafeArray
....
Цитата:Раздел III
Класс OLEExSup
....
Цитата:Раздел IV
Что получили.
Изменив вызов метода в коде из Раздела I получаем, изменяем и предаем массив.
//Вызов метода объекта
OLEExSup = СоздатьОбъект("OLEExSup");
Массив = OLEExSup.InvokeOLEMethod(CodeObject, "Method1");
Для Инд = Массив.GetLBound() По Массив.GetUBound() Цикл
Значение = Массив.GetValue(Инд);
Сообщить(Значение);
Массив.SetValue(Инд, Значение+1);
КонецЦикла;
OLEExSup.InvokeOLEMethod(CodeObject, "Method2", Массив);