Имя: Пароль:
1C
 
Зачем нужны внешние компоненты
Ø
0 eyerie
 
25.09.06
12:41
А не легче ли написать произвольный COM компонент и получить доступ к его функциональности посредством оператора Новый, напрмер, вот так:
`
лалалвыавыпрвы = Новый COMОбъект("TestComponentLib.TestComponent");
где "TestComponentLib.TestComponent" ProgID моего компонента...
1 eyerie
 
25.09.06
12:56
Немного переформулирую вопрос: чем принципиально отличается загрузка внешней компоненты от создания COM объекта, если и в том и в другом случае это есть inproc COM сервера? Просто надо сейчас написать внешнюю компоненту для расширения функциональности 8.0 вот и возник вопрос.
2 megalodon
 
25.09.06
12:57
при ВК есть возможность в теле ВК использовать методы 1С.
3 eyerie
 
25.09.06
13:02
(2) 1C является сервером автоматизации и реализует IDispatch. Значит и в программном коде произвольного COM сервера я также могу использовать все доступные в режиме внешнего соединения методы и свойства 1С ...
4 megalodon
 
25.09.06
13:09
пробовал?
5 eyerie
 
25.09.06
13:19
(4) Да. Мой компонент написан на C# и без проблем работает с типами 1С посредством RunType...
Вот пример:
`
connectorType = Type.GetTypeFromProgID("V8.ComConnector");
comConnector = Activator.CreateInstance(connectorType);
ClassConnectionString connString = new ClassConnectionString();
string connStringCOM = connString.ConnectionString;
connection = connectorType.InvokeMember("connect", System.Reflection.BindingFlags.InvokeMethod, null, comConnector, new object[] { connStringCOM });
comConnector.GetType().InvokeMember("НачатьТранзакцию", BindingFlags.InvokeMethod, null, connection, null);
6 megalodon
 
25.09.06
13:26
ну здесь вроде бы создается еще один экземпляр 1С-ки. Или я ошибаюсь?
7 eyerie
 
25.09.06
13:35
(6)Нет, здесь мы имеем дело с классическим внутрипроцессорным COM сервером (1CV8 COM Connector Type Library).
8 megalodon
 
25.09.06
13:38
(7) я таких умных слов не знаю честно говоря. Эта твоя конструкция в монопольном режиме сработает?
9 eyerie
 
25.09.06
13:46
(8)Нет, не в монопольном. Просто устанавливаю соединение когда нужно.
10 megalodon
 
25.09.06
13:48
(9) ВК должна работать в любом режиме.
11 eyerie
 
25.09.06
13:58
(10) Вызов методов 1С во внешней компоненте осуществляется также, как и у меня - серез указатель на IDispatch. Просто у меня управляемая версия.
12 Gloom
 
25.09.06
14:04
(11)Просто у тебя немножко каша в голове...
13 eyerie
 
25.09.06
14:11
(12) Если не трудно, объясни...
14 eyerie
 
25.09.06
14:18
13+ То есть я утверждаю, что и в том и в другом случае - это внутрипроцессорные COM сервера. Это верно?
15 eyerie
 
25.09.06
14:25
(12) Сказав А неплохо бы сказать и Б...
16 Gloom
 
25.09.06
14:30
Внешняя компонента – программный модуль, расширяющий функциональность 1С:Предприятия. Внешние компоненты являются COM-серверами и вследствие этого могут быть написаны с использованием произвольных инструментов разработки программ, поддерживающих создание COM-объектов.
Возможности внешней компоненты:
расширение встроенного языка 1С:Предприятия (добавление новых агрегатных объектов);
добавление страницы свойств в параметры 1С:Предприятия;
сохранение параметров внешней компоненты через механизмы сохранения параметров 1С:Предприятия;
создание дополнительных окон в окне 1С:Предприятия (версия 2.0, только для 1С:Предприятия 7.7);
доступ к функциям 1С:Предприятия через OLE Automation (версия 2.0);
вызов процедуры обработки событий, контролируемых внешней компонентой;
доступ к строке состояния 1С:Предприятия.
17 megalodon
 
25.09.06
14:30
Главное тут не то что это, возможно "внутрипроцессорные COM сервера", а то, что в твоем случае СОМ объект работает не с твоим экземпляром 1С, а создает другой, со всеми вытекающими отсюда последствиями, главное из которых - работа ведется не через то же соединение с сервером базы данных, что при использовании обычной ВК, а через другое.
18 eyerie
 
25.09.06
14:41
(16) Это все так и достигается это путем реализации определенных интерфейсов. Но ничто не мешает мне создать COM сервер, реализовать в нем те интерфейсы, которые дожна реализовывать ВК, зарегистрировать ProgID и загрузить мой COM сервер с помощью оператора Новый. В чем разница между оператором Новый и ЗагрузитьВнешнююКомпоненту, вот в чем вопрос.
19 eyerie
 
26.09.06
13:53
Апну разок. Мож кто подскажет, зачем все же нужны внешние компоненты в 8.0, если там есть режим COM соединения?
20 АЛьФ
 
26.09.06
13:59
2(18) "ничто не мешает мне создать COM сервер, реализовать в нем те интерфейсы, которые дожна реализовывать ВК, зарегистрировать ProgID и загрузить мой COM сервер с помощью оператора Новый" - дык, это ж и получится самая натуральная ВК :)
21 eyerie
 
26.09.06
14:04
(20) Так вот вопрос собственно в этом: зачем тогда нужен механизм ВК в 8.0?
Может я чего не понимаю...
22 Lew50
 
27.09.06
10:12
(21) Наверное не все такие умные
23 АЛьФ
 
27.09.06
10:15
2(21) так затем и нужен, чтобы ты мог проделывать что-то типа (18). Не было бы его, и не получилось бы у тебя ничего подобного.
На самом деле, скорее всего, большенство функционала ВК просто оставлено для совместимости с 7.7. Хотя кому она нужна - х.з.
24 eyerie
 
27.09.06
10:22
(23) В общем я уже написал нужный мне COM сервер не так, как того требует ВК, а так, как я хочу. При загрузке в 8.0 все отлично работает, весь открытый сектор доступен. Посмотрим что дальше будет, но ВК мне пока не потребовалась...
25 Hadgehogs
 
27.09.06
10:32
(eyerie)Вопрос у меня к вам такой, раз такая бурная дисскусия:
"Подключил я COM-сервер (выполненный в DLL) к 1С8.0, выполнил, что хотел, а как его отключить?" По идее теперь код библиотеки находится среди кода 1С8.0, ведь так?
Библиотека простейшая, в Дельфи...
Нашел автоматически созданные Дельфями методы Connect() и Disconnect() в объекте,
из 1С8.0 вызываются, но ничего не происходит.
Как быть?
26 eyerie
 
27.09.06
10:46
(25) Ну вообще - то дискуссия не бурная :))
По поводу вопроса. COM объект САМ выгружает себя из памяти как только количество ссылок на него станет равным нулю. За вызов метода Release отвечает клиент COM объекта.
27 eyerie
 
27.09.06
10:59
(25)<< идее теперь код библиотеки находится среди кода 1С8.0, ведь так
Совершенно верно, при загрузке inproc сервера код dll проецируется на адресное пространство вызывающего процесса, то есть 1cv8.exe. А дальше все намного интереснее. dll реализует некие интерфейсы, но все они наследованы от IUnknown, который содержит три метода, в том числе и Release. Соответственно класс, реализующий пользовательские интерфейсы должен иметь и реализацию метода Release. А вот как вызвать этот метод из клиентского кода - тут у каждого языка программирования есть свои особенности. Ищи как это делается в дельфи. Я, честно говоря, не знаю... Сам я на плюсах пишу и на шарпе.
28 Hadgehogs
 
27.09.06
11:03
Буду глядеть...
Thanks...
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший