Имя: Пароль:
1C
1С v8
Проблема с получением интерфейсов COM-объекта
0 ЕстьПроблемка
 
31.07.14
05:31
Всем доброго времени суток!

Подскажите, пожалуйста, кто знает, как победить следующую ситуацию: есть COM-объект сторонней разработки для доступа к параметрам оборудования. Требуется собственно получить эти параметры из 1С 8.2. Делаю следующее:

Перем ptAttributeExt;
pt = НОВЫЙ COMОбъект("PyronTrans.Application");
pt.Connent("user", "password");
ptAttributes = pt.GetAttributes(); //возвращается COMSafeArray
Для Каждого ptAttribute Из ptAttributes Цикл
    //ptAttribute является COMОбъектом, поддерживающим 2 интерфейса: IAttr и IExtAttr из 1С же видно только интерфейс по умолчанию (IAttr), а нужно как-то достучаться до интерфейса IExtAttr...
    ptAttribute.QueryInterface("IExtAttr", ptAttributeExt); // Так тоже не получилось, выдает ошибку несовпадения типов!
КонецЦикла;

Пробовал тоже самое сделать в VBA - никаких проблем, можно обращаться к обоим интерфейсам. Но мне нужно это в 1С.
Подскажите, пожалуйста, кто с подобным сталкивался.

Заранее спасибо всем откликнувшимся!
1 ЕстьПроблемка
 
31.07.14
18:59
Совсем никаких идей? (((
2 Господин ПЖ
 
31.07.14
19:10
пиши обертку... не все что есть на свете обязано работать с 1с
3 ЕстьПроблемка
 
31.07.14
19:24
(3) - ну, видимо, придется... Хоть и очень не хотелось бы. Там в это COMе очень много всяких функций, а проблема только с одним параметром. Остальное нужное все в дефолтных интерфейсах... Ну все-равно, спасибо.
4 Torquader
 
31.07.14
23:19
Сначала попробовать в VbScript - если прокатывает, то вставить VbScript в 1С.
Но, QueryInterface требует передачи указателя, а скриптовые языки как и 1С умеют передавать только ссылку на Variant, и если тот, который отвечает на запрос, не умеет работать с Variant, то ничем и не поможешь.
Да и потом, кроме IDispatch, 1С ничего не умеет.
5 ЕстьПроблемка
 
31.07.14
23:41
(4) - А вставить VBScript в 1С - это как?
В принципе обертку я уже написал - так что критичной проблемы уже нет. Но если получится обойти через VBScript - то было бы гораздо лучше, лишние обертки ни к чему хорошему не приводят. Подскажите, пожалуйста, что имелось ввиду, как его можно вставить?
6 ADirks
 
01.08.14
07:56
(5) примерно так

Скрипт = СоздатьОбъект("MSScriptControl.ScriptControl");
Скрипт.Language = "JScript";
Стр = "
|function GetNum(str)
|{
|    var re = new RegExp('(.*)(Cумма [\\d-\\.,]*.*)', 'i'); //Откинем хвост с суммами
|    var arr = re.exec(str);
|    if( arr != null ) str = arr[1];
|
|    re = new RegExp('(.*)(НДС[\\s(]*[\\d]*.*)', 'i'); //Откинем хвост с суммами
|    arr = re.exec(str);
|    if( arr != null ) str = arr[1];
|
|    re = new RegExp('\\d\\d\\.\\d\\d\\.\\d{2,4}', 'ig'); //вычистим даты
|    str = str.replace(re, '');
|    re = new RegExp('\\d{2,4}\\s*[гГ]', 'ig'); //вычистим даты
|    str = str.replace(re, '');
|
|    re = new RegExp('\\d{3,}', 'ig'); //вот теперь все циферки будем считать потенциальными номерами счетов
|    arr = str.match(re);
|    if( arr == null ) return '';
|
|    return '' + arr;
|}
|";
Скрипт.AddCode(стр);

стрНомера = Скрипт.Run("GetNum", стрНазначениеПлатежа);
7 ADirks
 
01.08.14
07:59
ещё у MSScriptControl.ScriptControl есть такая штука, как AddObject() - добавляет внешний COM-объект в пространство имён скрипта, тип:

Скрипт.AddObject("myObject", ToolBar);
8 ЕстьПроблемка
 
01.08.14
17:32
(6) - Блин, извините, не понимаю... А можно как-то чуть более подробно, что именно надо написать, вот, например, в моем случае? Необходимый код в самом начале, он вроде простой очень, я из него все лишнее убрал - оставил только то, что является проблемой.
9 Garykom
 
гуру
01.08.14
17:46
(8) суть в (6) это обертка в виде программы-скрипта на каком то скриптовом языке (jscript, vbscript etc)  вызов этой обертки из 1С.

Если могешь на c++, c# и прочих сделать обертку то не парься таким
10 ЕстьПроблемка
 
01.08.14
18:33
(9) - В том-то и дело, что нормальную обертку я сделать не могу, C никогда не пользовался. Сделал на VB dll-ку, в принципе работает, но это какое-то небольшое извращение. Просто если как-то можно несложно просто обернуть этот COM в VBScript и все тоже будет работать - было бы гораздо проще. Можете подсказать, как это сделать? Или это не так и просто?
11 Garykom
 
гуру
01.08.14
21:00
(10) пишешь скрипт на wiki:Visual_Basic_Scripting_Edition

добиваешься чтобы все работало и были нужные функции, которые возвращали то что надо (не забываем про только простые типы в return'ах)

потому это дело заталкиваешь в 1С по принципу как в (6),

т.е. 1С используя "MSScriptControl.ScriptControl" запускает твои скрипты...
12 Garykom
 
гуру
01.08.14
21:05
(11)+ поищи учебника по vbscript или jscript

вот например http://dunaevv1.narod.ru/vbs_refers.htm

файлики ИмяСкрипта.vbs создаешь и запускаешь пока пишешь ))
13 ЕстьПроблемка
 
01.08.14
21:28
Garykom, спасибо. Буду пробовать!
14 Defender aka LINN
 
01.08.14
21:30
(0) Калгари... 1С... Чего-то я не понимаю в этой жизни
15 ЕстьПроблемка
 
01.08.14
21:34
(14) - В жизни всякое бывает )