Имя: Пароль:
1C
 
Создать дочерний класс COM объекта
0 N-S-B
 
21.07.22
18:22
Есть COM объект содержащий главный родительский класс и несколько дочерних. У родительского класса есть метод, который принимает в качестве параметра тип одного из дочерних классов.
То есть при создании нового COM объекта, создается объект класса ForeCourt. У класса ForeCourt есть дочерний класс PriceGroup. Так же у класса ForeCourt есть метод GetPrice, который принимает параметр с типом PriceGroup. Передается туда ссылка, которая внутри метода и заполняется: Forecourt.GetPrice(PriceGroupParam). После выполнения метода в PriceGroupParam будут данные.
Проблема в том, что я не могу создать ком объект класса PriceGroup, а параметр другого типа функция не принимает и ругается на несоответствие типов. Может быть у ком объектов есть какие-то стандартные функции, с помощью которых можно получить другие классы, которые реализует ком объект?
У меня есть исходник с примером работы с этим ком объектом на VB. Там ком объект подключается просто в свойствах проекта. После этого сама IDE видит все интерфейсы, классы и методы этого ком объекта. То есть я просто создаю переменную с типом PriceGroup и передаю ее в функцию GetPrice().
Как можно решить эту задачу на платформе?
1 Ryzeman
 
21.07.22
18:26
(0) Стандартных нет. COM объект для 1с это посторонний класс. В них ровно то, что заложено разработчиком. Читай документацию, возможно там есть что-то вроде CreatePriceGroup
2 Ryzeman
 
21.07.22
18:32
>>Там ком объект подключается просто в свойствах проекта

Каким образом? Свойства и методы у них одинаковые, по идее ты тем же кодом можешь получить нужное тебе.
3 sitex
 
naïve
21.07.22
19:07
(0) Пробовал сделать тоже самое что в VB ? Возможно, что то упускаешь.
4 ДедМорроз
 
21.07.22
19:26
В VB просто создается тип и это сразу неинициализированный Com-объект.
Если предполагается,что они создаются только так,ьо нигде,кроме VB с ними работать нельзя.
5 Мультук
 
гуру
21.07.22
19:36
(1)

Я возможно глупость скажу, но раз нельзя в 1С, значит нужно на другом языке, где "можно" написать обертку (внешнюю компоненту и т.п.) и использовать ?
6 Ryzeman
 
21.07.22
19:41
(5) Да нет, может используется класс, который есть в другой среде разработке как пишет (4). Но это режим Ванги, мы же не видим документацию сами
7 ДедМорроз
 
21.07.22
20:52
В любом языке,который знает,что такое TypeLib и умеет из нее создавать объекты.
8 N-S-B
 
21.07.22
20:57
(1) Документацию всю прочитал, метода или свойства, который возвращает нужный класс нет. Есть методы, которые возвращают другие классы, но конкретно этот нет.
9 N-S-B
 
21.07.22
20:58
(2) Подключается просто через References. После этого в коде я могу создать переменную с типом любого класса.
Мало того, после объявления переменной этого класса, через точку я вижу все методы и свойства этого класса.
Каким образом VB это видит все?
10 N-S-B
 
21.07.22
21:02
(5) Я попробовал сделать тоже самое в питоне:

import win32com.client
Forecourt = win32com.client.Dispatch("PSS.Forecourt")

Но точно так же Forecourt.GetPrice() ругается на несоответствие типов и как получить переменную нужного типа либо объект класса - я не нашел.
Тут видимо вопрос в принципе с работой с СОМ объектом. Но опять же непонятно, как VB сразу видит все его внутренности.
11 Ryzeman
 
21.07.22
21:11
(9) >>Подключается просто через References.
Ничего себе "просто" :-D

https://docs.microsoft.com/ru-ru/dotnet/visual-basic/reference/command-line-compiler/reference

У тебя там отдельная библиотека подключается в котором этот объект описан?
12 H A D G E H O G s
 
21.07.22
21:13
(10) Скинь либу и доку или ссыль на сайт
13 H A D G E H O G s
 
21.07.22
21:15
14 ДедМорроз
 
21.07.22
21:18
Через Reference это и есть TypeLib соответственно,можно для Си++ сделать заголовки и внешку для 1с,если очень хочется.
15 N-S-B
 
21.07.22
21:27
(11) Ну в самой IDE это выглядит, как зайти в свойства проекта и поставить галочку напротив нужной библиотеки, которая отвечает за этот СОМ объект )
16 N-S-B
 
21.07.22
21:28
(13) Да, самой либо с доками сейчас у меня нет
17 N-S-B
 
21.07.22
22:04
(14) Мельком погуглил, нашел, что, вроде как, в 1С можно создать СОМ объект TypeLib. Это может как-то помочь?
18 H A D G E H O G s
 
21.07.22
22:52
(17) Нет. typelib - это просто помощь разработчику. COM с typelib просто будет в отладчике показывать свойства com объекта, не более.
19 H A D G E H O G s
 
21.07.22
22:52
(18) В случае 1С. В других ЯП - это полноценная подсказка в disaign-time
20 H A D G E H O G s
 
21.07.22
22:53
(17) Скидывай dll на [email protected]
21 ДедМорроз
 
21.07.22
23:12
На самом деле,там объект-singletone,который используется как элемент перечисления.
Обычно,ссылки на такие элементы получаются из корневого объекта,как свойства.
Дальше,нужно смотреть эту библиотеку и точно анализировать полученное значение,т.к.вполне вероятно,что оно будет всегда одно и то же.
И,если сама библиотека делалась на Си++,то там просто будет элемент перечисления(enum),который внутри число,а в объект преобразуется при выходе наружу.
22 ДедМорроз
 
21.07.22
23:19
И,чтобы было понятнее, ForeCount.GetPrice(Переменная) в 1с отработает не совсем,как ожидается,если так как переменные в Com-объекты передаются по значению,то есть создается копия переменной и она передается объекту,нсли он в нее запишет другое значение,то исходная переменная не изменится.
23 ДедМорроз
 
21.07.22
23:23
https://stackoverflow.com/questions/73064796/how-to-create-a-specific-com-object-class
Вот здесь описана та же проблема,но переменная-то выходная.
Если класс умеет IDispatch,то вы просто передаете переменную,и вам в нее создают ваш класс.
Если класс не умеет IDispatch,то там просто уепзатель на объект.

То есть VbScript должен помочь.
24 N-S-B
 
22.07.22
09:18
(22) В функцию как раз передается ссылка, которая внутри функции и заполняется и после выполнения функции в переменной оказывается значение.
(23) Это мой пост и есть )
25 N-S-B
 
22.07.22
10:56
(23) Хмм, описать логику работы с СОМ на VbScript, а сам VbScript вызывать из 1С - это вы имеете в виду? Интересная идея.
Попробовал, действительно VbScript видит так же все методы СОМ объекта, однако непонятно, как мне создать переменную определенного типа тут.
Да, я вижу в обозревателе, что все классы доступны, но как достучаться до них? Вот я создал объект Set PSSForeCourt = CreateObject("PSS.ForeCourt"), а как мне создать объект нужного класса?
26 N-S-B
 
22.07.22
13:36
(23) (25) Нет, не поможет VBS. В нескольких местах вычитал, что VBS не поддерживает TypeLib, только IDispatch
27 ДедМорроз
 
22.07.22
22:00
Метод объекта вызывается через IDispatch ?
Или делаем Export from dll ?
В первом случае,мы можем передать пустую переменную,так как согласно IDispatch, любая переменная млжет быть преобразована в ссылку на объект.
Если второй случай,то для нетипизированных языков работа с такой библиотекой невозможна.
28 ДедМорроз
 
22.07.22
22:01
В общем,присылай библиотеку и хоть какое-то описание,тогда будет ясно,куда нужно пнуть,и что подергать.