Форум программистов, компьютерный форум, киберфорум
Наши страницы
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.93/29: Рейтинг темы: голосов - 29, средняя оценка - 4.93
BVladimir2
16 / 16 / 0
Регистрация: 26.02.2013
Сообщений: 359
1

8.3 Упр.Прил.: COMSafeArray и массив из COM объектов ?

01.11.2013, 16:18. Просмотров 5888. Ответов 15
Метки нет (Все метки)

Есть СОМ объект, некое его свойство само по себе массив из других СОМ объектов. Вопрос, можно ли этот массив перегнать в COMSafeArray, и, собственно, как ?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.11.2013, 16:18
Ответы с готовыми решениями:

8.3 Упр.прил - Конвертация из 7.7
Конфигурация на 7.7 имеет свою структуру на 8.3 пишется сейчас и имеет свою. Вопрос как можно...

8.3 Упр.прил.: Дерево из Запроса ?
Есть справочник с группами и элементами - нужно получить дерево с видом: Группа Элемент...

8.3 Упр.прил.: ДеревоЗначений и .НайтиСтроки
Ситуация такая, нужно вывести на экран дерево с отбором строк. Делаю это путем полного...

ОбработкаЗаполнения. СтандартнаяОбработка (упр. прил: ДанныеЗаполнения)
Иерархическому справочнику Номенклатура добавили реквизит Услуга (Булево). Этому реквизиту задали...

8.3 Упр.прил. - Оптимизация работы с переменными ?
Все на клиенте: Одна процедура заполняет массив неизвестного размера, другая должна его...

15
Dethmontt
Модератор
Эксперт 1С
2674 / 2456 / 426
Регистрация: 10.03.2011
Сообщений: 8,804
Записей в блоге: 1
Завершенные тесты: 1
01.11.2013, 19:59 2
1C
1
Array = New COMSafeArray(МойМассив,"VT_VARIANT",РазмерностьМассива0,РамерностьМассива2);
//////////////////////////////////////////////////////////////
<ТипЭлемента> (обязательный)

Тип: Строка.
Определяет тип элемента COMSafeArray.
Тип элемента задается строкой и может принимать одно из следующих значений:
VT_I1 - знаковое целое 1 байт;
VT_I2 - знаковое целое 2 байта;
VT_I4 - знаковое целое 4 байта;
VT_I8 - знаковое целое 8 байт;
VT_INT - знаковое целое;
VT_UI1 - беззнаковое целое 1 байт;
VT_UI2 - беззнаковое целое 2 байта;
VT_UI4 - беззнаковое целое 4 байта;
VT_UI8 - беззнаковое целое 8 байт;
VT_UINT - беззнаковое целое;
VT_R4 - действительное число 4 байта;
VT_R8 - действительное число 8 байт;
VT_DECIMAL - десятичное число с фиксированной точкой 12 байт;
VT_CY - значение денежного типа;
VT_DATE - значение типа дата;
VT_BSTR - значение типа строка;
VT_DISPATCH - указатель на интерфейс IDispatch;
VT_ERROR - код ошибки;
VT_BOOL - значение логического типа;
VT_UNKNOWN - указатель на интерфейс IUnknown;
VT_VARIANT - вариантный тип.


P.S. Кстати в СП все написано...
0
BVladimir2
16 / 16 / 0
Регистрация: 26.02.2013
Сообщений: 359
01.11.2013, 20:28  [ТС] 3
Цитата Сообщение от Dethmontt Посмотреть сообщение
1C
1
Array = New COMSafeArray(МойМассив,"VT_VARIANT",РазмерностьМассива0,РамерностьМассива2);
P.S. Кстати в СП все написано...
Неа, пишет- несоответствие параметра 1
0
Dethmontt
Модератор
Эксперт 1С
2674 / 2456 / 426
Регистрация: 10.03.2011
Сообщений: 8,804
Записей в блоге: 1
Завершенные тесты: 1
01.11.2013, 20:35 4
Что передаешь в параметр 1 ?

Добавлено через 3 минуты
1C
1
2
3
4
5
6
7
// Построить двумерный COMSafeArray с типом элемента VT_I4
// из двух строк и трех колонок. Значения элементов
// взять из массива.
Массив1 = Новый Массив;
// заполнение массива Массив1 значениями
// ...
Массив2 = Новый COMSafeArray(Массив1, "VT_I4", 2, 3);
0
01.11.2013, 20:35
BVladimir2
16 / 16 / 0
Регистрация: 26.02.2013
Сообщений: 359
01.11.2013, 22:36  [ТС] 5
Цитата Сообщение от Dethmontt Посмотреть сообщение
Что передаешь в параметр 1 ?

Добавлено через 3 минуты
1C
1
2
3
4
5
6
7
// Построить двумерный COMSafeArray с типом элемента VT_I4
// из двух строк и трех колонок. Значения элементов
// взять из массива.
Массив1 = Новый Массив;
// заполнение массива Массив1 значениями
// ...
Массив2 = Новый COMSafeArray(Массив1, "VT_I4", 2, 3);
На месте "Массив1" у меня COMОбъект.
0
Dethmontt
Модератор
Эксперт 1С
2674 / 2456 / 426
Регистрация: 10.03.2011
Сообщений: 8,804
Записей в блоге: 1
Завершенные тесты: 1
02.11.2013, 02:09 6
На месте массив1 должен быть МАССИВ

Добавлено через 5 минут
Надоело наугад писать... (есть что то - хочу поместить куда то...)
0
BVladimir2
16 / 16 / 0
Регистрация: 26.02.2013
Сообщений: 359
02.11.2013, 11:51  [ТС] 7
Цитата Сообщение от Dethmontt Посмотреть сообщение
На месте массив1 должен быть МАССИВ

Добавлено через 5 минут
Надоело наугад писать... (есть что то - хочу поместить куда то...)

Тогда вопрос по синтаксису - есть СОМОбъект, скажем "тмп" в нем коллекция других СОМОбъектов, скажем 500 штук. Каким образом мне перегнать эти 500 штук в СОМSafeArray ? Сейчас эти 500 штук я перебираю в цикле Для Каждого ... Из тмп Цикл. Но думается с массивом будет полегче обращаться к известному элементу.
0
Dethmontt
Модератор
Эксперт 1С
2674 / 2456 / 426
Регистрация: 10.03.2011
Сообщений: 8,804
Записей в блоге: 1
Завершенные тесты: 1
02.11.2013, 21:27 8
Цитата Сообщение от BVladimir2 Посмотреть сообщение
Тогда вопрос по синтаксису - есть СОМОбъект
Что это за COM объект? Откуда я могу знать его методы...
0
BVladimir2
16 / 16 / 0
Регистрация: 26.02.2013
Сообщений: 359
03.11.2013, 13:30  [ТС] 9
Цитата Сообщение от Dethmontt Посмотреть сообщение
Что это за COM объект? Откуда я могу знать его методы...
Это документ HTML полученный от Internet Explorer - все методы и свойства в соответствии со спецификацией DOM. Просто в 8-ке он пишется как СОМОбъект. Там много разных коллекций, с которыми нужно работать. Напрямую обратится к элементу такой коллекции не получается - ошибка. Сейчас только в цикле перебирать можно...
0
Dethmontt
Модератор
Эксперт 1С
2674 / 2456 / 426
Регистрация: 10.03.2011
Сообщений: 8,804
Записей в блоге: 1
Завершенные тесты: 1
03.11.2013, 15:53 10
Тогда вообще ничего не понятно... Зачем вам тогда ComSafeArray?
0
BVladimir2
16 / 16 / 0
Регистрация: 26.02.2013
Сообщений: 359
03.11.2013, 18:17  [ТС] 11
Цитата Сообщение от Dethmontt Посмотреть сообщение
Тогда вообще ничего не понятно... Зачем вам тогда ComSafeArray?
В том СОМОбъекте (DOMОбъекте по сути) коллекция других СОМОбъектов (DOM). Мне нужен определенный элемент из этой коллекции. Если пишу "тмп = ОбъектСОМ[2]", к примеру, то ошибка, мол не предусмотрено так обращаться. Приходится перебирать всю коллекцию "Для Каждого ЭлементСОМ ИЗ ОбъектСОМ Цикл...", что работает, но лишний код...

Добавлено через 1 час 36 минут
Затупил я что-то нужно было не квадратные скобки а обычные круглые Вопрос решен...
0
Dethmontt
Модератор
Эксперт 1С
2674 / 2456 / 426
Регистрация: 10.03.2011
Сообщений: 8,804
Записей в блоге: 1
Завершенные тесты: 1
03.11.2013, 19:05 12
ComSafeArray предназначен для передачи параметров между COM объектами
0
BVladimir2
16 / 16 / 0
Регистрация: 26.02.2013
Сообщений: 359
04.11.2013, 11:24  [ТС] 13
Цитата Сообщение от Dethmontt Посмотреть сообщение
ComSafeArray предназначен для передачи параметров между COM объектами
И как конкретно его использовать с СОМОбъектами ? При работе с Экселом все просто - помещаю рандж прямо в ComSafeArray и все работает нормально...
0
Dethmontt
Модератор
Эксперт 1С
2674 / 2456 / 426
Регистрация: 10.03.2011
Сообщений: 8,804
Записей в блоге: 1
Завершенные тесты: 1
04.11.2013, 16:43 14
В контексте 1С все можно помещать в обычный массив ( Массив = Новый Массив; )

Но вот если тебе понадобиться передать массив параметров для обработки в какую нибудь внешнюю компоненту, то эта компонента не поймет что такое 1С-овский "Массив" вот тут и нужен будет COMSafeArray - это тип КОМ сервера и практически все языки знают этот тип.

Добавлено через 4 минуты
Цитата Сообщение от BVladimir2 Посмотреть сообщение
При работе с Экселом все просто - помещаю рандж прямо в ComSafeArray и все работает нормально
Зачем?
Массив1С = Новый Массив;
Массив1С.Добавить(Эксель);

Зачем тут COMSafeArray ???
0
BVladimir2
16 / 16 / 0
Регистрация: 26.02.2013
Сообщений: 359
04.11.2013, 19:19  [ТС] 15
1C
1
2
МассивСОМ = Новый COMSafeArray(ЭкселКОМ.ActiveSheet.Range(ЭкселКОМ.ActiveSheet.Cells(1, 1), ЭкселКОМ.ActiveSheet.Cells(100, 100)).Value);
МассивОб = МассивСОМ.Выгрузить();
0
Dethmontt
Модератор
Эксперт 1С
2674 / 2456 / 426
Регистрация: 10.03.2011
Сообщений: 8,804
Записей в блоге: 1
Завершенные тесты: 1
05.11.2013, 02:08 16
1C
1
2
Область = ЭкселКОМ.ActiveSheet.Range(ЭкселКОМ.ActiveSheet.Cells(1,1), ЭкселКОМ.ActiveSheet.Cells(100,100));
МассивДанных = Область.Value.Выгрузить();
Проще...

Добавлено через 1 минуту
Я не могу придумать себе примера создания ComSafeArray кроме как для передачи его внешнему обработчику который не знает типов 1С
1
05.11.2013, 02:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.11.2013, 02:08

8.3 Упр.Прил.: Сохранить реквизит формы типа СписокЗначений ?
Тут такая вещь возникла - у формы реквизит с типом СписокЗначений (не у объекта) стоят галочки...

8.3 Упр.прил.: Вывести страницу в поле HTML документа ?
Возникла необходимость, загрузить на форму страницу с сайта внести в опр. поля даные и сделать...

8.3 Упр.прил - обработчик Автоподбор, можно ли менять ожидание ?
Сейчас по умолчанию обработчик &quot;АвтоПодбор&quot; срабатывает через 0,2 секунды после ввода символа - его...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru