Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) OleExSup- очередной костыль к семерке (число прочтений - 20411 )
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
OleExSup- очередной костыль к семерке
10. Февраля 2009 :: 16:15
Печать  
по мотивам проблемы обсуждаемой в ветке 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", Массив); 


« Последняя редакция: 09. Февраля 2013 :: 05:33 - trad »  

OLEExSup_001.zip ( 34 KB | Загрузки )

1&&2&&3
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: OleExSup (beta) - очередной костыль к семерке
Ответ #1 - 10. Февраля 2009 :: 18:02
Печать  
А есть ли возможность получить массив в ТЗ сразу, как это делает
метод ВыполнитьИнструкцию() ? (сравнимый с ним по скорости)
В примере вроде обход по циклу.

P.S.  Можно тогда писать com-сервер и получать данные в 1С, если в сервере есть метод возвращающий массив.
http://www.1cpp.ru/forum/YaBB.pl?num=1216110955/6#6
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: OleExSup (beta) - очередной костыль к семерке
Ответ #2 - 11. Февраля 2009 :: 06:15
Печать  
kiruha писал(а) 10. Февраля 2009 :: 18:02:
А есть ли возможность получить массив в ТЗ сразу, как это делает
метод ВыполнитьИнструкцию() ? (сравнимый с ним по скорости)

Предложи принцип перегрузки N-мерного массива в ТЗ.
  

1&&2&&3
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: OleExSup (beta) - очередной костыль к семерке
Ответ #3 - 11. Февраля 2009 :: 06:19
Печать  
kiruha писал(а) 10. Февраля 2009 :: 18:02:
P.S.  Можно тогда писать com-сервер и получать данные в 1С, если в сервере есть метод возвращающий массив.
собственно для этого и сделаны OleExSup+OleSafeArray

kiruha писал(а) 10. Февраля 2009 :: 18:02:
думаю для начала стоит проверить такой код:
Код
Выбрать все
OLEExSup=CreateObject("OLEExSup");
ComServer=CreateObject("myserver.t1")
myArray=OLEExSup.InvokeOLEMethod(ComServer, "GetMyArray"); 

  

1&&2&&3
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: OleExSup (beta) - очередной костыль к семерке
Ответ #4 - 11. Февраля 2009 :: 08:28
Печать  
trad писал(а) 11. Февраля 2009 :: 06:19:
kiruha писал(а) 10. Февраля 2009 :: 18:02:
P.S.  Можно тогда писать com-сервер и получать данные в 1С, если в сервере есть метод возвращающий массив.
собственно для этого и сделаны OleExSup+OleSafeArray

kiruha писал(а) 10. Февраля 2009 :: 18:02:
думаю для начала стоит проверить такой код:
Код
Выбрать все
OLEExSup=CreateObject("OLEExSup");
ComServer=CreateObject("myserver.t1")
myArray=OLEExSup.InvokeOLEMethod(ComServer, "GetMyArray"); 



Отработало на ура - правильно и быстро.
(вывел дополнительно данные в цикле)
Видимо метод подходит для работы с произвольными com-серверами.

Как двумерный массив выводить?

P.S> Непонятный эффект - при первой загрузке компоненты окно 1С стало неактивным.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: OleExSup (beta) - очередной костыль к семерке
Ответ #5 - 11. Февраля 2009 :: 08:52
Печать  
trad писал(а) 11. Февраля 2009 :: 06:15:
kiruha писал(а) 10. Февраля 2009 :: 18:02:
А есть ли возможность получить массив в ТЗ сразу, как это делает
метод ВыполнитьИнструкцию() ? (сравнимый с ним по скорости)

Предложи принцип перегрузки N-мерного массива в ТЗ.


Сам я не писал компонент никогда - вот Dmitro для ADO делал выгрузку в ТЗ
GameWithFire
Обсуждение компоненты
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: OleExSup (beta) - очередной костыль к семерке
Ответ #6 - 11. Февраля 2009 :: 09:04
Печать  
kiruha писал(а) 11. Февраля 2009 :: 08:28:
Как двумерный массив выводить?
ну вы блин даете...

Вывод двумерного массива:
Код
Выбрать все
Для Инд1=Массив.GetLBound(1) По Массив.GetUBound(1) Цикл
	Для Инд2=Массив.GetLBound(2) По Массив.GetUBound(2) Цикл
		Сообщить(Массив.GetValue(Инд1,Инд2));
	КонецЦикла;
КонецЦикла;
 

  

1&&2&&3
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: OleExSup (beta) - очередной костыль к семерке
Ответ #7 - 11. Февраля 2009 :: 09:09
Печать  
Обход N-мерного массива (рекурсивный, три варианта)
Код
Выбрать все
Процедура ОбойтиМассив1(Массив, Измерение=1, Индексы="")
	Если Измерение = 1 Тогда
		Индексы = СоздатьОбъект("СписокЗначений");
	КонецЕсли;
	Если Индексы.РазмерСписка()<Измерение Тогда
		Индексы.ДобавитьЗначение("");
	КонецЕсли;
	Для Инд = Массив.GetLBound(Измерение) По Массив.GetUBound(Измерение) Цикл
		Индексы.УстановитьЗначение(Измерение, Инд);
		Если Измерение < Массив.GetDim() Тогда
			ОбойтиМассив1(Массив, Измерение+1, Индексы);
		Иначе
			Значение = Массив.GetValue(Индексы);
			Сообщить(ТипЗначенияСтр(Значение)+" "+Значение);
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

Процедура ОбойтиМассив2(Массив, Измерение=1, Индексы="")
	Если Измерение = 1 Тогда
		Индексы = СоздатьОбъект("ТаблицаЗначений");
		Индексы.КоличествоКолонок(1);
		Индексы.КоличествоСтрок(Массив.GetDim());
	КонецЕсли;
	Для Инд = Массив.GetLBound(Измерение) По Массив.GetUBound(Измерение) Цикл
		Индексы.УстановитьЗначение(Измерение, 1, Инд);
		Если Измерение < Массив.GetDim() Тогда
			ОбойтиМассив2(Массив, Измерение+1, Индексы);
		Иначе
			Значение = Массив.GetValue(Индексы);
			Сообщить(ТипЗначенияСтр(Значение)+" "+Значение);
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

Процедура ОбойтиМассив3(Массив, Измерение=1, Индексы="")
	Если Измерение = 1 Тогда
		Индексы = СоздатьОбъект("OLESafeArray");
		Индексы.Create(Индексы.VarTypes.VT_I2, Массив.GetDim());
	КонецЕсли;
	Для Инд = Массив.GetLBound(Измерение) По Массив.GetUBound(Измерение) Цикл
		Индексы.SetValue(Измерение-1, Инд);
		Если Измерение < Массив.GetDim() Тогда
			ОбойтиМассив3(Массив, Измерение+1, Индексы);
		Иначе
			Значение = Массив.GetValue(Индексы);
			Сообщить(ТипЗначенияСтр(Значение)+" "+Значение);
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

ОбойтиМассив1(Массив);
ОбойтиМассив2(Массив);
ОбойтиМассив3(Массив);
 

  

1&&2&&3
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: OleExSup (beta) - очередной костыль к семерке
Ответ #8 - 11. Февраля 2009 :: 09:13
Печать  
kiruha писал(а) 11. Февраля 2009 :: 08:28:
P.S> Непонятный эффект - при первой загрузке компоненты окно 1С стало неактивным.

уверен что это связано с компонентой?
  

1&&2&&3
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: OleExSup (beta) - очередной костыль к семерке
Ответ #9 - 11. Февраля 2009 :: 09:15
Печать  
kiruha писал(а) 11. Февраля 2009 :: 08:52:
Сам я не писал компонент никогда - вот Dmitro для ADO делал выгрузку в ТЗ

что касается GameWithFire...
Разницу между древовидными и многомерными структурами данных чувствуешь?
  

1&&2&&3
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: OleExSup (beta) - очередной костыль к семерке
Ответ #10 - 11. Февраля 2009 :: 09:23
Печать  
trad писал(а) 11. Февраля 2009 :: 09:13:
kiruha писал(а) 11. Февраля 2009 :: 08:28:
P.S> Непонятный эффект - при первой загрузке компоненты окно 1С стало неактивным.

уверен что это связано с компонентой?


Повторить не получилось.
Но вспоминаю, что при работе с com (например V77.Application  ) 1С иногда теряет фокус.
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: OleExSup (beta) - очередной костыль к семерке
Ответ #11 - 11. Февраля 2009 :: 09:26
Печать  
kiruha писал(а) 11. Февраля 2009 :: 09:23:
trad писал(а) 11. Февраля 2009 :: 09:13:
kiruha писал(а) 11. Февраля 2009 :: 08:28:
P.S> Непонятный эффект - при первой загрузке компоненты окно 1С стало неактивным.

уверен что это связано с компонентой?


Повторить не получилось.
Но вспоминаю, что при работе с com (например V77.Application  ) 1С иногда теряет фокус.

не исключаю возможности такого поведение, но оно скорее связано с работой OLE-сервера, а не этой компоненты.
  

1&&2&&3
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: OleExSup (beta) - очередной костыль к семерке
Ответ #12 - 11. Февраля 2009 :: 09:49
Печать  
Провел тест обхода массива - у меня получилось
0.032 сек на чтение 3000 значений - достаточно мало - можно конструировать сервер и без ТЗ  Улыбка
Большой фэнкс за разработку  Улыбка
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: OleExSup (beta) - очередной костыль к семерке
Ответ #13 - 11. Февраля 2009 :: 10:03
Печать  
kiruha писал(а) 11. Февраля 2009 :: 09:49:
Провел тест обхода массива - у меня получилось
0.032 сек на чтение 3000 значений - достаточно мало - можно конструировать сервер и без ТЗ  Улыбка

Нужно сказать что при получении массива от OLE-сервера данные не копируются в OleSafeArray. OleSafeArray только агрегирует указатель на массив и лочит его. И получение данных происходит непосредственно из первично размещенного массива.
  

1&&2&&3
Наверх
 
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: OleExSup (beta) - очередной костыль к семерке
Ответ #14 - 11. Февраля 2009 :: 13:33
Печать  
kiruha писал(а) 11. Февраля 2009 :: 08:52:
Сам я не писал компонент никогда - вот Dmitro для ADO делал выгрузку в ТЗ
GameWithFire
Обсуждение компоненты

Собственно причем тут GameWithFire? ADO ведь не возвращает результат запроса в виде SafeArray. ADO возвращает значение длинного (BLOB) поля в виде SafeArray.

В виде SafeArray(VT_UI1) в OLE обычно обмениваются двоичными данными (картинки, тамбнейлы например, и прочая такая хрень), так что желательно иметь метод выгрузки в файл, или передачу в конструктор прикладного объекта (Картинка, ДвоичныеДанные например), чего 8ка кстати не умеет.
  
Наверх
ICQ  
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: OleExSup (beta) - очередной костыль к семерке
Ответ #15 - 11. Февраля 2009 :: 14:30
Печать  
DmitrO писал(а) 11. Февраля 2009 :: 13:33:
В виде SafeArray(VT_UI1) в OLE обычно обмениваются двоичными данными (картинки, тамбнейлы например, и прочая такая хрень), так что желательно иметь метод выгрузки в файл, или передачу в конструктор прикладного объекта (Картинка, ДвоичныеДанные например), чего 8ка кстати не умеет.
Улыбка
буквально сегодня утром думал об этом
  

1&&2&&3
Наверх
 
IP записан
 
vip
1c++ power user
Отсутствует



Сообщений: 1570
Зарегистрирован: 19. Мая 2006
Re: OleExSup (beta) - очередной костыль к семерке
Ответ #16 - 17. Марта 2009 :: 06:49
Печать  
trad
Очередное спасибо. Улыбка
Использовал для работы с Traffic Inspector.
Все чудно.
  
Наверх
ICQ  
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: OleExSup (beta) - очередной костыль к семерке
Ответ #17 - 17. Марта 2009 :: 07:04
Печать  
Рад за тебя.
Если не сложно, опиши в общих чертах как применил инструмент
  

1&&2&&3
Наверх
 
IP записан
 
vip
1c++ power user
Отсутствует



Сообщений: 1570
Зарегистрирован: 19. Мая 2006
Re: OleExSup (beta) - очередной костыль к семерке
Ответ #18 - 17. Марта 2009 :: 07:10
Печать  
trad писал(а) 17. Марта 2009 :: 07:04:
Рад за тебя.
Если не сложно, опиши в общих чертах как применил инструмент

Вспомнил про эту ВК, когда столкнулся с тем, что Трафик Инспектор возвращает массивы.
Код
Выбрать все
ТИ=СоздатьОбъект("TrafInsp.TrafInspAdmin");

Массив=Трэд.InvokeOLEMethod(ТИ,"APIGetUserState","Проба");
Для Сч=Массив.GetLBound() По Массив.GetUBound() Цикл
	Сообщить(Массив.GetValue(Сч));
КонецЦикла;
 

  
Наверх
ICQ  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: OleExSup (beta) - очередной костыль к семерке
Ответ #19 - 17. Марта 2009 :: 08:59
Печать  
vip, а можешь поконкретнее рассказать что именно программно ты делаешь с ТрафикИнспектором?
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: OleExSup (beta) - очередной костыль к семерке
Ответ #20 - 17. Марта 2009 :: 09:12
Печать  
JohnyDeath писал(а) 17. Марта 2009 :: 08:59:
vip, а можешь поконкретнее рассказать что именно программно ты делаешь с ТрафикИнспектором?

если можно, то в отдельной ветке
  

1&&2&&3
Наверх
 
IP записан
 
vip
1c++ power user
Отсутствует



Сообщений: 1570
Зарегистрирован: 19. Мая 2006
Re: OleExSup (beta) - очередной костыль к семерке
Ответ #21 - 17. Марта 2009 :: 10:16
Печать  
JohnyDeath писал(а) 17. Марта 2009 :: 08:59:
vip, а можешь поконкретнее рассказать что именно программно ты делаешь с ТрафикИнспектором?

Ничего, кроме как пополняю баланс клиента.

trad
Вопрос не стоит отдельной ветки. Серер Трафик Инспектора предоставляет обычный COM-объект.
  
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: OleExSup (beta) - очередной костыль к семерке
Ответ #22 - 17. Марта 2009 :: 13:07
Печать  
Интересный вариант для передачи массивов

http://www.kb.mista.ru/article.php?id=180

Цитата:
OpenOffice

Основная проблема при работе с 7.7 - это проблема передачи массивов через COM.
Здесь предлагается, вероятно, наилучшее решение этой проблемы.
Оно базируется на идее и коде smаhаrbА на Нью-Территории 1С.

   scr = СоздатьОбъект("MSScriptControl.ScriptControl");
   scr.language = "javascript";
   scr.eval("Массив=new Array()");
   Массив = scr.eval("Массив");
   scr.AddCode("function SetItem(ind,val){Массив[ind]=val}");
   
   ServiceManager=СоздатьОбъект("com.sun.star.ServiceManager");
   scr.AddObject("ServiceManager",ServiceManager);
   Desktop = ServiceManager.createInstance("com.sun.star.frame.Desktop");
   Document = Desktop.LoadComponentFromURL("private:factory/scalc", "_blank", 0, Массив);
   Листы = Document.getSheets();
   Лист = Листы.getByIndex(0);
   Для к = 0 По 10 Цикл
     Лист.getCellByPosition(0,к).value = к;
   КонецЦикла;
   SaveParam =
   SaveParam.Name = "FilterName";
   SaveParam.Value = "MS Excel 97";
   scr.CodeObject.SetItem(0,SaveParam);
   Document.storeToURL("file:///c:/Test.xls",Массив);
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
vip
1c++ power user
Отсутствует



Сообщений: 1570
Зарегистрирован: 19. Мая 2006
Re: OleExSup (beta) - очередной костыль к семерке
Ответ #23 - 27. Марта 2009 :: 12:11
Печать  
trad
GetValue(Индекс1[, ..., ИндексN]) это понятно.

Объясни про GetValue(ТаблицаЗначений), плиз.
  
Наверх
ICQ  
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: OleExSup (beta) - очередной костыль к семерке
Ответ #24 - 27. Марта 2009 :: 12:19
Печать  
есть 3х-мерный массив

можно так
GetValue(10, 5, 14)

а можно так
Индексы=СоздатьОбъект("ТаблицаЗначений");
Индексы.КоличествоКолонок(1);
Индексы.КоличествоСтрок(3);
Индексы.УстановитьЗначение(1,1, 10);
Индексы.УстановитьЗначение(2,1, 5);
Индексы.УстановитьЗначение(3,1, 14);
GetValue(Индексы)
  

1&&2&&3
Наверх
 
IP записан
 
vip
1c++ power user
Отсутствует



Сообщений: 1570
Зарегистрирован: 19. Мая 2006
Re: OleExSup (beta) - очередной костыль к семерке
Ответ #25 - 27. Марта 2009 :: 12:20
Печать  
А... Улыбка
Спасибо.
  
Наверх
ICQ  
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: OleExSup (beta) - очередной костыль к семерке
Ответ #26 - 27. Марта 2009 :: 12:22
Печать  
еще можно посмотреть пример рекурсивного обхода массива ОбойтиМассив2 в http://www.1cpp.ru/forum/YaBB.pl?num=1234282554/7#7
  

1&&2&&3
Наверх
 
IP записан
 
Bertysh
Junior Member
**
Отсутствует


KuziMed

Сообщений: 15
Местоположение: Брянск
Зарегистрирован: 13. Февраля 2007
Пол: Мужской
Re: OleExSup (beta) - очередной костыль к семерке
Ответ #27 - 23. Апреля 2009 :: 14:05
Печать  
Объясните чайнику как с помощью данной компоненты получить тип значения. Соль моего интереса в следующем я хочу подключится к восьмёрке и как то определить что вернула мне восьмёрка по ОЛЕ тип булево или тип число. Дело в том что восьмёрка восьмёрке передаёт тип булево, а вот 7.7 интерпретирует его как число. Пример на который я нарвался и смоделировал находится тут
http://1cniku.ru/Articles/V8OLE.html
  

Всё норм
Наверх
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: OleExSup (beta) - очередной костыль к семерке
Ответ #28 - 24. Апреля 2009 :: 08:12
Печать  
Bertysh писал(а) 23. Апреля 2009 :: 14:05:
Объясните чайнику как с помощью данной компоненты получить тип значения.

никак
  

1&&2&&3
Наверх
 
IP записан
 
Bertysh
Junior Member
**
Отсутствует


KuziMed

Сообщений: 15
Местоположение: Брянск
Зарегистрирован: 13. Февраля 2007
Пол: Мужской
Re: OleExSup (beta) - очередной костыль к семерке
Ответ #29 - 26. Апреля 2009 :: 14:16
Печать  
trad писал(а) 24. Апреля 2009 :: 08:12:
Bertysh писал(а) 23. Апреля 2009 :: 14:05:
Объясните чайнику как с помощью данной компоненты получить тип значения.

никак

А есть какие то принципиальные непреодолимые ограничения или никак в данной версии компоненты.
  

Всё норм
Наверх
IP записан
 
vip
1c++ power user
Отсутствует



Сообщений: 1570
Зарегистрирован: 19. Мая 2006
Re: OleExSup- очередной костыль к семерке
Ответ #30 - 09. Июля 2009 :: 13:49
Печать  
trad
Получаю из массива com-объекты.
Возвращаются циферки.
ПолучитьТип() возвращает 13.
Чего дальше делать? Как получить сам объект?
  
Наверх
ICQ  
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: OleExSup- очередной костыль к семерке
Ответ #31 - 09. Июля 2009 :: 14:09
Печать  
да, 13 - это VT_UNKNOWN
OleSafeArray не умеет работать с любыми com-объектами. Толко с ole.
Т.е. только VT_DISPATCH
Печаль
  

1&&2&&3
Наверх
 
IP записан
 
vip
1c++ power user
Отсутствует



Сообщений: 1570
Зарегистрирован: 19. Мая 2006
Re: OleExSup- очередной костыль к семерке
Ответ #32 - 09. Июля 2009 :: 14:12
Печать  
trad писал(а) 09. Июля 2009 :: 14:09:
да, 13 - это VT_UNKNOWN
OleSafeArray не умеет работать с любыми com-объектами. Толко с ole.
Т.е. только VT_DISPATCH
Печаль

Спасибо. Так и думал.
Придумаем что-нибудь.
  
Наверх
ICQ  
IP записан
 
vip
1c++ power user
Отсутствует



Сообщений: 1570
Зарегистрирован: 19. Мая 2006
Re: OleExSup- очередной костыль к семерке
Ответ #33 - 09. Июля 2009 :: 16:28
Печать  
trad
Все порешалось. Еще раз спасибо. Улыбка
  
Наверх
ICQ  
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: OleExSup- очередной костыль к семерке
Ответ #34 - 10. Июля 2009 :: 04:48
Печать  
vip писал(а) 09. Июля 2009 :: 16:28:
Все порешалось.
как? в двух словах.
  

1&&2&&3
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: OleExSup- очередной костыль к семерке
Ответ #35 - 10. Июля 2009 :: 05:26
Печать  
Да, Андрей, расскажи. Я так понимаю, ты получаешь фигурки от компоненты Душелова?
  
Наверх
 
IP записан
 
vip
1c++ power user
Отсутствует



Сообщений: 1570
Зарегистрирован: 19. Мая 2006
Re: OleExSup- очередной костыль к семерке
Ответ #36 - 10. Июля 2009 :: 06:41
Печать  
JohnyDeath писал(а) 10. Июля 2009 :: 05:26:
Да, Андрей, расскажи. Я так понимаю, ты получаешь фигурки от компоненты Душелова?

Пральна. Улыбка
И по подсказке trad'а Василий наладил компоненту.
Теперь все возвращается правильно, VT_DISPATCH

Кстати компонента плавно превращается в чудную вещь.
Близок час победы Улыбка
  
Наверх
ICQ  
IP записан
 
MrDen
Junior Member
**
Отсутствует



Сообщений: 50
Местоположение: Краснодар
Зарегистрирован: 19. Ноября 2008
Пол: Мужской
Re: OleExSup- очередной костыль к семерке
Ответ #37 - 31. Августа 2009 :: 19:45
Печать  
Спасибо автору! Выручила ВК для передачи массивов данных в ActiveX!
  
Наверх
ICQ  
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: OleExSup- очередной костыль к семерке
Ответ #38 - 04. Марта 2010 :: 09:16
Печать  
Новое в версии 1.0.0.6
Добавлены методы OLEExSup :: ПолучитьСвойство, УстановитьСвойство
OleExSup
  

1&&2&&3
Наверх
 
IP записан
 
Donat
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 152
Зарегистрирован: 29. Мая 2006
Re: OleExSup- очередной костыль к семерке
Ответ #39 - 04. Марта 2010 :: 17:50
Печать  
При попытке скачать, говорит: Публикация не активна Печаль
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: OleExSup- очередной костыль к семерке
Ответ #40 - 04. Марта 2010 :: 19:11
Печать  
Donat писал(а) 04. Марта 2010 :: 17:50:
При попытке скачать, говорит: Публикация не активна Печаль

сорри, поправил.

ps
как ни зайдешь на ИС так там каждый раз что то по другому.
я там теряюсь во всем множестве контекстных "фреймов"
  

1&&2&&3
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: OleExSup- очередной костыль к семерке
Ответ #41 - 05. Марта 2010 :: 06:32
Печать  
а понадобился мне это функционал для реализации заполнения листа Excel в один присест.
Код
Выбрать все
Excel=СоздатьОбъект("excel.application");
Книга=Excel.Workbooks.Add(ФайлШаблон);
ЛевоВерх=Excel.Cells(НачВыхСтр,1);
ПравоНиз=Excel.Cells(НачВыхСтр+ВсегоСтрокДанных-1,ВсегоКолонокДанных);
Диапазон=Excel.Range(ЛевоВерх, ПравоНиз);

Массив = СоздатьОбъект("OleSafeArray");
х);
//... тут заполнение массива (и строки и числа и даты)

OLEExSup.УстановитьСвойство(Диапазон,"Value",Массив);
Excel.Visible=-1; 

  

1&&2&&3
Наверх
 
IP записан
 
baxxik
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 4
Зарегистрирован: 23. Июня 2009
Re: OleExSup- очередной костыль к семерке
Ответ #42 - 27. Ноября 2012 :: 21:05
Печать  
Добрый день!

Возникла ситуация, когда приложение, успешно работающее под 1с8.х потребовалось реализовать на 1с 77

в кратце так:
есть wsdl схема:
Код
Выбрать все
<s:element name="SendBalanse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="_BalanceData" type="tns:ArrayBalanse"/>
</s:sequence>
</s:complexType>
</s:element>
<s:complexType name="ArrayOfBalanse">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="Balanse" nillable="true" type="tns: Balanse"/>
</s:sequence>
</s:complexType>
<s:complexType name="Balanse">
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="SkuID" type="s:int"/>
<s:element minOccurs="1" maxOccurs="1" name="DistribID" type="s:int"/>
<s:element minOccurs="1" maxOccurs="1" name="ID" type="s:int"/>
<s:element minOccurs="1" maxOccurs="1" name="Nums" type="s:double"/>
</s:sequence>
</s:complexType> 



код 1с 8.х
Код
Выбрать все
Определение = Новый WSОпределения("ht_tp://localhost/Web.asmx?wsdl");
Сервис = Новый WSПрокси(Определение, Определение.Сервисы[0].URIПространстваИмен, Определение.Сервисы[0].Имя, "WebSoap" );
Фабрика = Сервис.ФабрикаXDTO;
СтрокаСессии = Сервис.AuthSession ("root","qwerty");
Остатки = Фабрика.Создать(Фабрика.Тип("ht_tp://localhost /Web.asmx","ArrayOfBalanse"));
Места = Фабрика.Создать(Фабрика.Тип("ht_tp://localhost /Web.asmx", "Balanse"));
 Склады.SkuID = 1;
Склады.WareHouseID = 3;
Склады. ID = 114;
Склады.Nums = 6;
Остатки. Balanse.Добавить(Места)
Сервис.SendBalanse (Остатки); //Отправляем 


Если выгрузить фабрику Остатки в XML то получаем
Код
Выбрать все
<ArrayOfBalanse xmlns="ht_tp://localhost/Web.asmx" xmlns:xs="ht_tp://w_ww.w3.org/2001/XMLSchema" xmlns:xsi="ht_tp://w_ww.w3.org/2001/XMLSchema-instance">
<Balanse>
		<SkuID>1</SkuID>
		<DistribID>3</DistribID>
		<ID>114</ID>
		<Nums>6</Nums>
	</Balanse>
</ArrayOfBalanse> 


На 1с8 все работает отлично.

Но проблема встала в реализации этого же на 7.7
Код
Выбрать все
OLEExSup = СоздатьОбъект("OLEExSup");
SOAPN = CreateObject( "MSSOAP.SoapClient30");
SOAPN.ClientProperty("Serverht_tpRequest", 1);
SOAPN.MSSOAPInit("ht_tp://localhost/Web.asmx?wsdl", "Web", "WebSoap");
Результат = OLEExSup.InvokeOLEMethod(SOAPN,"AuthSession","root","qwerty");
СтрокаДанных = "<ArrayOfBalanse xmlns=""ht_tp://localhost/Web.asmx"" xmlns:xs=""ht_tp://w_ww.w3.org/2001/XMLSchema"" xmlns:xsi=""ht_tp://w_ww.w3.org/2001/XMLSchema-instance"">
|<Balanse>
|		<SkuID>1</SkuID>
|		<DistribID>3</DistribID>
|		<ID>114</ID>
|		<Nums>6</Nums>
|	</Balanse>
|</ArrayOfBalanse>";

Результат = OLEExSup.InvokeOLEMethod(SOAPN,"SendBalanse",СтрокаДанных);
 


И на этом месте выдает ошибку: 0x80020005 : Несовпадение типов.

Подскажите пожалуйста - как мне передать в этот метод данные? И в каком формате это посылать??
Заранее спасибо!
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: OleExSup- очередной костыль к семерке
Ответ #43 - 28. Ноября 2012 :: 05:31
Печать  
Уверенности нет, но попробуй такой код:
Код
Выбрать все
	//создаем массив структур IDispatch
	Структура = СоздатьОбъект("Структура");
	Структура.Вставить("SkuID",1);
	Структура.Вставить("DistribID",3);
	Структура.Вставить("ID",114);
	Структура.Вставить("Nums",6);
	Массив = СоздатьОбъект("OleSafeArray");
	Массив.Создать(Массив.ТипыЗначений.VT_DISPATCH,1);
	Массив.УстановитьЗначение(0,Структура);


	OLEExSup = СоздатьОбъект("OLEExSup");
	SOAPN = CreateObject( "MSSOAP.SoapClient30");
	SOAPN.ClientProperty("Serverht_tpRequest", 1);
	SOAPN.MSSOAPInit("ht_tp://localhost/Web.asmx?wsdl", "Web", "WebSoap");

	СтрокаСессии = SOAPN.AuthSession("root","qwerty");//если метод получает и возвращает только типы которые 1с понимает, то использовать OLEExSup.InvokeOLEMethod необязательно

	Результат = OLEExSup.InvokeOLEMethod(SOAPN,"SendBalanse",Массив);
 

  

1&&2&&3
Наверх
 
IP записан
 
baxxik
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 4
Зарегистрирован: 23. Июня 2009
Re: OleExSup- очередной костыль к семерке
Ответ #44 - 28. Ноября 2012 :: 08:48
Печать  
trad писал(а) 28. Ноября 2012 :: 05:31:
Уверенности нет, но попробуй такой код:


Не сработало Печаль
Выдало

Результат = OLEExSup.InvokeOLEMethod(SOAPN,"SendBalanse",Массив);
{D:\TEST.ERT(310)}: 0x80004002 : Интерфейс не поддерживается

Какие еще есть идеи??? Печаль

делать на ServerXMLHTTP?
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: OleExSup- очередной костыль к семерке
Ответ #45 - 28. Ноября 2012 :: 09:05
Печать  
в MS SOAP toolkit 3.0 наверно тоже есть фабрика
  

1&&2&&3
Наверх
 
IP записан
 
baxxik
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 4
Зарегистрирован: 23. Июня 2009
Re: OleExSup- очередной костыль к семерке
Ответ #46 - 28. Ноября 2012 :: 10:56
Печать  
Сделал через MSXML2.ServerXMLHTTP.4.0

через wireshark выдрал все данные запросов 8-ки
и сделал все один в один Улыбка
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: OleExSup- очередной костыль к семерке
Ответ #47 - 18. Марта 2015 :: 08:48
Печать  
Кто-то может выложить здесь версию 1.0.0.6? На Инфостарте уже нет странички для этой ВК.
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: OleExSup- очередной костыль к семерке
Ответ #48 - 18. Марта 2015 :: 09:22
Печать  
в топе 1.0.0.7
нужен обязательно 1.0.0.6 ?
  

1&&2&&3
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: OleExSup- очередной костыль к семерке
Ответ #49 - 18. Марта 2015 :: 12:57
Печать  
Ага, я повелся на 001. И не проверил. Спасибо. 1.0.0.6 не нужно.
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать