|
Плагин OLE и 8.2 Типы не совпадают(-1). В чем дело? | ☑ | ||
---|---|---|---|---|
0
new1snik
30.07.13
✎
10:37
|
Добрый день. Работаю с плагином OLE. Получаю СОМ объект:
Попытка Клиент = Новый COMОбъект("LI_OLE_Library.LI_Client"); Исключение Сообщить("Необходимо запустить LocarusInformer" + "!"); //Возврат(0); КонецПопытки; Далее использую встроенные функции: х = Клиент.RaceList.CurrentRace; Сообщить(Клиент.RaceList.RaceData(х)); После выполнения этого кода вылазит ошибка: {ВнешняяОбработка.ВнешняяОбработка1.МодульОбъекта(68)}: Ошибка при вызове метода контекста (RaceData) Сообщить(Клиент.RaceList.RaceData(х)); по причине: Типы не совпадают (-1) Проблема в следующем: в описании плагина находится описание встроенных методов: long CurrentRace, TRaceListData RaceData(long Index). То есть Клиент.RaceList.CurrentRace возвратит long, а на вход RaceData требуется тоже long, и я не понимаю в чем причина. |
|||
1
Infsams654
30.07.13
✎
10:42
|
(0) TRaceListData RaceData(long Index , это как 1С может сообщить, она такого типа в глаза не видела
|
|||
2
dk
30.07.13
✎
10:42
|
можно попробовать обернуть все в VBS а там с типизацией получше
|
|||
3
Капитан О
30.07.13
✎
10:44
|
Клиент.RaceList.RaceData(Клиент.RaceList.CurrentRace) не спасёт?
|
|||
4
new1snik
30.07.13
✎
10:48
|
(3)Нет, пробовал так...
|
|||
5
Jaap Vduul
30.07.13
✎
10:49
|
(3)А в чём разница с (0)?
|
|||
6
Капитан О
30.07.13
✎
10:50
|
(5) в отсутствии переменной
|
|||
7
Jaap Vduul
30.07.13
✎
10:53
|
(6)А в 1цэ при помещении результата вычисления в переменную разве тип этого результата может поменяться?
|
|||
8
Капитан О
30.07.13
✎
10:53
|
(7) едва ли
|
|||
9
Infsams654
30.07.13
✎
11:05
|
(8) вернет скорее ComObject, так что, лучше Число(Клиент.RaceList.RaceData(х))
|
|||
10
Jaap Vduul
30.07.13
✎
11:10
|
(9)Откуда ComObject возьмётся?
Все числа 1цэ хранит с плавающей точкой, так что никакие изыски не помогут, в (2) верное направление задано. |
|||
11
Infsams654
30.07.13
✎
11:24
|
(10) не верю, там же TRaceListData, а не просто long. Так, что и отдаст TRaceListData, а 1С примет как ComObject, т.к. не поймет, что это за тип
|
|||
12
Капитан О
30.07.13
✎
11:26
|
(11) CurrentRace у него лонг
|
|||
13
Jaap Vduul
30.07.13
✎
11:26
|
(11)Чтобы получить TRaceListData нужно выполнить RaceData, а у ТС как раз это и не получается:
... Ошибка при вызове метода контекста (RaceData) |
|||
14
new1snik
30.07.13
✎
11:37
|
(2)Так мудрено звучит, что аж страшно...
|
|||
15
Serginio1
30.07.13
✎
11:44
|
(0) Может 1С не может отобразить структуру TRaceListData?
Обычно внутри всегда есть приведение типа через VarCast |
|||
16
new1snik
30.07.13
✎
11:45
|
(15) Тут пока дело не в отображении, а именно в том, что тип передаваемого в метод параметра не подходит. Если я правильно понимаю.
|
|||
17
Serginio1
30.07.13
✎
11:48
|
Что из себя представляет TRaceListData ?
|
|||
18
new1snik
30.07.13
✎
11:49
|
struct TRaceListData
{ long SectionBeginIndex; //Начало Рейса long SectionEndIndex; //Окончание рейса double SectionDist; //Пройденное расстояние double SectionFuel; //Расход топлива double FuelNorm; //Норма расхода на 100км double AverageSpeed; //Средняя скорость double MaxSpeed; //Максимальная скорость unsigned char UnPlagFlag; //В течение рейса было переподключение unsigned char NoPowerFlag; //В течение рейса было пропадение питания unsigned char TimeHoleFlag; //В течение рейса было пропадение навигации BSTR Drivers; //Водители на рейсе (только помеченные галочками) }; Но ведь это не важно должно быть, что мне вернет метод, я пока просто пытаюсь передать в него параметр и получаю отказ.. |
|||
19
Infsams654
30.07.13
✎
11:52
|
(18) ну и Сообщить(Клиент.RaceList.RaceData(х));
что тут можно сообщить ? |
|||
20
Капитан О
30.07.13
✎
11:54
|
(19) да пофих, пусть хоть "ком-объект"
|
|||
21
dk
30.07.13
✎
11:54
|
||||
22
Serginio1
30.07.13
✎
11:58
|
(19) TRaceListData это не "ком-объект" так как "ком-объект" это IDispatch.
|
|||
23
new1snik
30.07.13
✎
11:59
|
(21) Спасибо, посмотрю, попробую...
|
|||
24
dk
30.07.13
✎
12:06
|
(23) для начала тупо проверь эти же строки в vbs
если робит, то копай дальше
|
|||
25
Infsams654
30.07.13
✎
12:09
|
(21) как (19) да пофих, пусть хоть "ком-объект"
если 1С не понимает что-то из ole, то com-object. А что оно должно показать иначе ? |
|||
26
Кирпич
30.07.13
✎
12:23
|
Я так думаю, что 1с передает в ComObject тип Variant, а ComObject хочет получить long. Так что делай обертку для своего ComObject.
|
|||
27
Serginio1
30.07.13
✎
12:40
|
(25) Что ты понимашь под OLE. Все параметры в IDispatch передаются через OleVariant. ComObject для 1С это
TvarData(varPropVal).VType:=VT_DISPATCH то это ComObject если VT_RECORD то не уверен, что 1С может работать с таким параметром struct __tagBRECORD // VT_RECORD (структура) ByRef Type { PVOID pvRecord; // Указатель на структуру IRecordInfo *pRecInfo; // Описание структуры. } __VARIANT_NAME_4; |
|||
28
cw014
30.07.13
✎
12:45
|
А в х = Клиент.RaceList.CurrentRace;
x чему равен в отладчике? |
|||
29
Infsams654
30.07.13
✎
12:46
|
(27) так и я тоже про то. Если не понимает VT_RECORD, то как 1С у себя это проявит. Имхо, только как ComObject и пофиг. А дальше, уж, если получатель знает, что это за штука, то пусть обращается к нужному через точку, если это рекорд
|
|||
30
new1snik
30.07.13
✎
12:50
|
vbs = Новый COMОбъект("MSScriptControl.ScriptControl");
vbs.language="vbscript"; Code = " |Function GetDataLong |Set OLE = CreateObject(""LI_OLE_Library.LI_Client"") |GetDataLong = OLE.RaceList.RaceData(OLE.RaceList.CurrentRace) |End Function |"; vbs.addcode(Code); Сообщить(vbs.Eval("GetDataLong")); Та же самая ошибка: {ВнешняяОбработка.ВнешняяОбработка1.МодульОбъекта(81)}: Ошибка при вызове метода контекста (Eval) Сообщить(vbs.Eval("GetDataLong")); по причине: Типы не совпадают (-1) |
|||
31
Serginio1
30.07.13
✎
12:54
|
А теперь верни
GetDataLong = OLE.RaceList.RaceData(OLE.RaceList.CurrentRace).MaxSpeed |
|||
32
cw014
30.07.13
✎
12:55
|
Все, я вкурил. Там не КОМобъект возвращается, потому и тип не совпадает... В общем как в (31) описано
|
|||
33
new1snik
30.07.13
✎
13:01
|
(31)
{ВнешняяОбработка.ВнешняяОбработка1.МодульОбъекта(80)}: Ошибка при вызове метода контекста (Eval) Сообщить(vbs.Eval("GetDataLong")); по причине: Произошла исключительная ситуация (Ошибка выполнения Microsoft VBScript): Требуется объект: 'OLE.RaceList.RaceData(...)' Какая то беда... вот опять я что-то упустил совершенно очевидное |
|||
34
cw014
30.07.13
✎
13:02
|
(33) Нету объекта значимо...
|
|||
35
Кирпич
30.07.13
✎
13:12
|
(0)http://forum.infostart.ru/forum26/topic43129/
здесь смотрел? |
|||
36
new1snik
30.07.13
✎
13:16
|
(35)Скудно там написано и ничего нового.
|
|||
37
Кирпич
30.07.13
✎
13:21
|
А в (30) ковычки вроде лишние
|
|||
38
dk
30.07.13
✎
13:25
|
(37) так надо
(30) а если
т.е. надо понять где ошибка в вбс или в момент получения в 1с результата |
|||
39
Кирпич
30.07.13
✎
13:28
|
(0)Там же пример есть test.ert
в примере всё работает. |
|||
40
Кирпич
30.07.13
✎
13:28
|
и без vbs
|
|||
41
Jaap Vduul
30.07.13
✎
13:28
|
(18)
vbscript структуры тоже не умеет готовить. |
|||
42
Кирпич
30.07.13
✎
13:30
|
в LI_OLE_Library.dll есть описание типов. так что типы не причем. всё должно работать.
|
|||
43
new1snik
30.07.13
✎
13:30
|
(38) выводит 1
(39)Ты прям волшебник, я пытался запустить test.ert в 1с7.7, но тоже вылазило куча ошибок. Как сумел? |
|||
44
Кирпич
30.07.13
✎
13:34
|
(43) нажал кнопку "Сформировать"
|
|||
45
Jaap Vduul
30.07.13
✎
13:36
|
(43)(44)
Может, у вас разные версии LI_OLE_Library.dll ? |
|||
46
Serginio1
30.07.13
✎
13:36
|
||||
47
dk
30.07.13
✎
13:43
|
(43) значит проблема в получении в 1с
конвертируй например в строку в vbs и в 1с уже строку обрабатывай |
|||
48
Кирпич
30.07.13
✎
13:43
|
(0) я думаю не нужно обращаться напямую к RaceData, а использовать функции RaceList типа RaceSectionBeginIndex, RaceSectionFuel
|
|||
49
Кирпич
30.07.13
✎
13:45
|
так попробуй
кол=Клиент.RaceList.Count; Для НомерРейса=0 по кол-1 цикл Сообщить(Клиент.RaceList.RaceSectionFuel(НомерРейса)); конеццикла |
|||
50
Кирпич
30.07.13
✎
13:59
|
(0) чо молчишь? работает или нет?
|
|||
51
new1snik
30.07.13
✎
14:01
|
(50) Выдал единичку.
|
|||
52
new1snik
30.07.13
✎
14:01
|
Сообщить(Клиент.RaceList.RaceSectionFuel(0));
|
|||
53
Кирпич
30.07.13
✎
14:13
|
ну всё работает. вопрос закрыт.
|
|||
54
new1snik
30.07.13
✎
14:15
|
(52) Сообщить(Клиент.RaceList.RaceFuelNorm(0));
А вот это уже не работает.... Да и проблема, которая была в первом сообщении не решилась. |
|||
55
Кирпич
30.07.13
✎
14:17
|
проблемы нету. нужно просто вызывать нужные методы и всё.
|
|||
56
cw014
30.07.13
✎
14:17
|
(54) Проблема в том, что типы этих методов - это экземпляры сишных классов, а не Ком-интерфейсов. Потому возвращает тебе тот набор данных, которая 1С неосиливает. Читай внимательней мануал
|
|||
57
Кирпич
30.07.13
✎
14:19
|
(56) 1с читает типы из tlb. всё прекрасно работает. получать структуру RaceData автору не нужно. Для доступа к данным структуры есть специальные методы. Ими и надо пользоваться.
|
|||
58
new1snik
30.07.13
✎
14:20
|
(55)Ну раз такой умный, то поясни, пожалуйста, как понять какие методы правильные?
(56)Какой мануал? |
|||
59
new1snik
30.07.13
✎
14:23
|
(58)+ У меня просто на руках есть описание методов для работы с этим плагином в виде: TRaceListData RaceData(long Index) и все. Ну плюсом описание структур, которые я пока не трогал.
|
|||
60
Кирпич
30.07.13
✎
14:23
|
(58) в файле "New HTML Help.chm" всё написано
вот структура struct TRaceListData { long SectionBeginIndex; //Начало Рейса long SectionEndIndex; //Окончание рейса double SectionDist; //Пройденное расстояние double SectionFuel; //Расход топлива double FuelNorm; //Норма расхода на 100км double AverageSpeed; //Средняя скорость double MaxSpeed; //Максимальная скорость unsigned char UnPlagFlag; //В течение рейса было переподключение unsigned char NoPowerFlag; //В течение рейса было пропадение питания unsigned char TimeHoleFlag; //В течение рейса было пропадение навигации BSTR Drivers; //Водители на рейсе (только помеченные галочками) }; методы называются так же как поля структуры RaceSectionBeginIndex RaceSectionEndIndex и т.д. |
|||
61
Кирпич
30.07.13
✎
14:24
|
в метод передаешь номер структуры
|
|||
62
Кирпич
30.07.13
✎
14:26
|
(0)и еще. если есть рядом с тобой кто нибудь, попроси его треснуть тебе по башке линейкой. должно помочь. мне помогает.
|
|||
63
Infsams654
30.07.13
✎
14:27
|
(60)+ в (29) уже написано
|
|||
64
Кирпич
30.07.13
✎
14:33
|
+(61) я скачал этот долбаный Locarus Informer.
скачал демо данные от туда же. зарегил LI_OLE_Library.dll. запустил 1с. открыл test.ert открыл Locarus Informer тыкнул мышкой на машину в test.ert нажал кнопку "Сформировать" отчет выдал ахиренную таблицу всё работает. теперь делаю всё в обратной последовательности. вот какой я очень добрый сегодня. |
|||
65
new1snik
30.07.13
✎
14:46
|
(64)Вот нифига подобного у меня не происходит, запускал эту обработку на 1С 7.7, он мне выдавал ошибку при запущенном локарусе. Сейчас попытаюсь повторить это на другом ПК, вдруг какой косяк с неправильной работой dll...
|
|||
66
Кирпич
30.07.13
✎
14:48
|
(65) какую ошибку выдает?
|
|||
67
new1snik
30.07.13
✎
14:50
|
(66) ДатаВремя=Клиент.DataFunctions.BBDataDateTime(СчетчикЦикла);
{C:\DOCUMENTS AND SETTINGS\ADMIN\РАБОЧИЙ СТОЛ\РАБОТА\РИФ\ЛОКАРУС\TEST.ERT(19)}: Поле агрегатного объекта не обнаружено (BBDataDateTime) |
|||
68
Кирпич
30.07.13
✎
14:54
|
(67) ну не знаю. у меня без ошибок отработало. ковырять больше не буду. всё снёс.
|
|||
69
Кирпич
30.07.13
✎
15:09
|
||||
70
new1snik
30.07.13
✎
15:29
|
(69)Окей, значит ошибка точно у меня и практически наверняка с работой dll...
|
|||
71
Кирпич
30.07.13
✎
15:40
|
(70) скачай Плагин OLE заново
http://www.locarus.ru/support/plugins |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |