Имя: Пароль:
1C
1С v8
Плагин 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
если робит, то копай дальше

Set Клиент = CreateObject("LI_OLE_Library.LI_Client")
х = Клиент.RaceList.CurrentRace
Msgbox Клиент.RaceList.RaceData(х)
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) а если

vbs = Новый COMОбъект("MSScriptControl.ScriptControl");
    vbs.language="vbscript";
    Code = "
    |Function GetDataLong
    |Set OLE = CreateObject(""LI_OLE_Library.LI_Client"")
    |GetDataLong1 = OLE.RaceList.RaceData(OLE.RaceList.CurrentRace)
    |GetDataLong = 1
    |End Function
    |";
    vbs.addcode(Code);
    Сообщить(vbs.Eval("GetDataLong"));

т.е. надо понять где ошибка
в вбс или в момент получения в 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
Основная теорема систематики: Новые системы плодят новые проблемы.