Имя: Пароль:
1C
1С v8
NativeAPI и VTYPE_VARIANT
0 vasbur
 
10.10.13
11:22
Есть у меня компонента для 1С. написана на С++ с использованием технологии COM.
Компонента развесистая, в частости, некоторые методы объектов в качестве результата возвращают другие объекты. Типа объектная модель, в полный рост.
Решил реализовать компоненту под native API, т.к. пользователи хотят запускать ее на сервере 1С 8.2.
В документации (http://its.1c.ru/db/metod81?db=metod81#content:3221:1) написано следующее:
"Внимание! Типы VTYPE_INTERFACE, VTYPE_VARIANT не поддерживаются."

Вопрос - как в кмпоненте под Native API возвращать объекты? компонента под СОМ это умеет, что для 7.7, что для 8.x. Неужели Native API не умеет?
1 orefkov
 
10.10.13
11:25
Никак.
2 vasbur
 
10.10.13
11:27
WTF?
3 orefkov
 
10.10.13
11:33
(2)
"Жизнь такова, какова она есть, и больше не какова"
:(
Печально, но так есть.
4 vasbur
 
10.10.13
11:34
(3) А есть какие-нибудь паттерны, позвляющие наиболее "красиво" модифицировать соm-интерфейс в native API?

Наверняка, кто-то уже сталкивался с подобной проблемой и как-то решал ее?
5 Кирпич
 
10.10.13
11:46
(4) нет. ты первый. тебе выпало совершить сей акт высокого программирования.
6 H A D G E H O G s
 
10.10.13
11:51
(4) А что ты возвращаешь в 1С-ку?
Свой объект, или объект 1С?
7 vasbur
 
10.10.13
11:51
(6) свой объект
8 H A D G E H O G s
 
10.10.13
11:59
(7) Никак.

p.s. не занимайтесь извращениями - пишите на COM/
9 vasbur
 
10.10.13
12:03
(8) Клиенты хотят использовать компоненту в регламентных заданиях :(
10 H A D G E H O G s
 
10.10.13
12:07
(9) Иииии?
11 Serginio1
 
10.10.13
12:31
Интересно а какой смысл в ВК если в 1С есть события.
Для вычислений можно использовать Модуль или внешнюю обработку в которой сделать метод
Функция Вычислить(Параметры,Команда)
  возврат Вычислить(Команда);
КонецФункции

Модуль можно передать в СОМ и вызывать из него все что угодно
Например
Парам=Модуль.Вычислить("Новый Массив");
Парам.Добаввить(6);
Парам.Добаввить(7);
Рез=Модуль.Вычислить("Параметры[0]+Параметры[1]");
12 Serginio1
 
10.10.13
12:32
Вернее можно определить в Модуле обработки и передать ЭтотОбъек
и добавить директиву Экспорт
13 Serginio1
 
10.10.13
12:34
Тьфу наоборот

Функция Вычислить(Команда,Параметры="" Экспорт)
  возврат Вычислить(Команда);
КонецФункции


Парам=Модуль.Вычислить("Новый Массив");
Парам.Добаввить(6);
Парам.Добаввить(7);
Рез=Модуль.Вычислить("Параметры[0]+Параметры[1]",Парам);
14 Rie
 
10.10.13
12:34
(11) А если нужно сделать то, на что 1С не способна? Внешняя обработка тут не поможет.
Что касается COM - то 1С существует не только под Windows.
15 Serginio1
 
10.10.13
12:37
(14) Человеку нужно передавать объекты. То кто не на Win ССЗС
16 Serginio1
 
10.10.13
12:38
А в 8 ке ВК на СОM по сути не нужна.
17 Принт
 
10.10.13
12:40
Нужно бы какой-нибудь MPI приладить.
18 Rie
 
10.10.13
12:41
(15) У человека был изначально вопрос насчёт VTYPE_VARIANT и почему его нет. Вот поэтому и нет.
Если надо передавать объекты - ясен день, что Native API тут не годится.
19 vasbur
 
10.10.13
12:41
(10) И в 8.2 регламетные задания запускаются на сервере. А в 8.2 на сервере можно использовать только внешние компоненты на технологии native API. Финиш, приплыли.
20 vasbur
 
10.10.13
12:43
(17) Это что еще за зверь?
21 Принт
 
10.10.13
12:43
(20) Мысли вслух. IPC
22 vasbur
 
10.10.13
12:43
(16) в типовых 8-ках почти все компоненты на COM. Всякое торговое оборудование и т.п.
Как это у них в веб-клиенте работает - щас буду разбираться.
23 jsmith82
 
10.10.13
12:44
(20)
Message Passing Interface (MPI, интерфейс передачи сообщений) — программный интерфейс (API) для передачи информации, который позволяет обмениваться сообщениями между процессами, выполняющими одну задачу
IPC: Inter Process Communications — методы взаимодействия между процессами
24 vasbur
 
10.10.13
12:46
(21) Это, блин, сложно.
Нашу внешнюю компоненту используют сторонние разработчики. Объектная модель, которая реализована через COM, получается понятной и привычной 1с-специалисту. Не хочется терять эту понятность и простоту.
25 Зойч
 
10.10.13
12:47
а просто ком не подойдет использовать ?
26 Serginio1
 
10.10.13
12:50
(19) Зачем на сервере ВК?
27 jsmith82
 
10.10.13
12:51
(19) мути сразу для SQL
28 jsmith82
 
10.10.13
12:52
минуя 1с кагбе
29 Serginio1
 
10.10.13
12:52
(19) У тебя Линукс?
30 H A D G E H O G s
 
10.10.13
12:52
(19) Кто такое сказал?
31 H A D G E H O G s
 
10.10.13
12:54
"Сервер может работать со всеми компонентами. Компонент кэшируется на сеанс работы сервера. "
32 H A D G E H O G s
 
10.10.13
12:54
Глобальный контекст (Global context)
ПодключитьВнешнююКомпоненту (AttachAddIn)
Вариант синтаксиса: По имени и местоположению

Синтаксис:

ПодключитьВнешнююКомпоненту(<Местоположение>, <Имя>, <Тип>)
33 H A D G E H O G s
 
10.10.13
13:01
В веб-клиенте надо писать отдельную, годную компоненту под каждый тип клиента, например, изучив воот это

https://developer.mozilla.org/en-US/docs/Gecko_Plugin_API_Reference/Plug-in_Development_Overview#Writing_Plug-ins

Вердикт: Нахер!
34 vasbur
 
10.10.13
13:02
(32) и правда.
Я-то повелся на то, что "ЗагрузитьВнешнююКомпоненту" не работает на сервере.
Щас попробуем.
35 H A D G E H O G s
 
10.10.13
13:07
(34) Я тоже повелся как-то. Это вылилось в 2 месяца переписания компоненты и извращений с XDTO-преобразованиями.

Моя native компонента возвращала XDTO текст, который легким движением ноги превращался в ТЗ, СЗ, Массивы и.т.д.
36 vasbur
 
10.10.13
13:09
(33) А в доке к 1С написано, что:
"При работе на сервере «1С:Предприятия» допустимо использовать только компоненты, разработанные по технологии Native API, которые могут быть как отдельными файлами, так и упакованными в специальные ZIP-архивы."

ссылька: http://its.1c.ru/db/v8doc#content:85:1
37 vasbur
 
10.10.13
13:11
(35) в итоге - вам удалось запустить com-компоненту на сервере 1С, и использовать там ее?
38 vasbur
 
10.10.13
13:21
(29) нет у меня виндоус
39 vasbur
 
10.10.13
13:22
(25) судя по результатам поиска на форуме, с этим на сервере 1С тоже разнообразные проблемы связаны.

есть, правда, еще OLE :)
40 Serginio1
 
10.10.13
13:27
(38) Тогда какой смысл ВК на сервере?
(39) Какие например. Я лет 10 использую простую оболочку IlanguageExtender через ITypeInfo

http://1c.proclub.ru/modules/mydownloads/personal.php?cid=115&lid=2019

Там проблемы только с 64 разрядным библиотеками и правами DCOM касаемыми для EXE.
41 vasbur
 
10.10.13
13:29
(40) Внешняя компонента позволяет получать информацию от веб-сервера, в удобном для программиста 1С виде.
Есть компании, которые хотят эту процедуру (получение информации от веб-сервера) запилить в регламентное задание 1С, которая запускается на стороне сервере 1С
42 Зойч
 
10.10.13
13:33
(41) уж с веб сервером можно и без всяких компонент обойтись.
43 Serginio1
 
10.10.13
13:36
(41) А в чем проблема. Кстати v8: Вопрос по NetObjectToIDispatch
оборачивал сборку .Net к Вэб сервису через эту приблуду и прекрасно читал нечитаемые на 1С сайты.
СОМ лучшее решение. ВК нужны только для асинхронных вызовов. Сейчас 1С поддерживает события, а текущий интерфейс можно передавать как в 13. Ну а так хозяин барин
44 vasbur
 
10.10.13
13:36
(42) теоретически - можно. практически - нельзя.
потому что есть существующая инфраструктура, и она удобна.
Пока код выполняется на клиенте - всем все понятно: часть логики вынесена на уровень компоненты, чать логики реализуется в 1С.

В како-то момент разработчик думает "а давай ка я эту вот процедуру помещу в регламетное задание" - и тут, херакс, низзя.
Говорить разработчику в этот момент "ты туда (во внешнюю компоненту) не ходи, ты сюда (через апи сервера) ходи - не есть гуд".

Тем более, апи сервера реально через одно место написано.
45 vasbur
 
10.10.13
13:39
(43) Асинхронные вызовы тоже, кстати, есть.
Как раз сейчас мы их активно впиливаем.
46 vasbur
 
10.10.13
13:48
(42) К слову сказать:
был у нас клиент, который использовал как-то древний навижн.
Он взял исходники нашей компоненты, что-то там помутил и адаптировал под свой навижин. И сказал, что ему так проще и прикольнее, чем работать с сервером напрямую через http
47 Serginio1
 
10.10.13
13:49
(45) И где они на сервере используются?
1C позволяет подключать событие например

msword = Новый COMОбъект("Word.Application");
ДобавитьОбработчик msword.DocumentChange, ПриИзмененииДокумента;

Процедура ПриИзмененииДокумента()
    Сообщить("Документ изменен");
КонецПроцедуры
48 vasbur
 
10.10.13
13:50
(47) Это на стороне сервера точно работает?
если да - то это вариант.
49 Serginio1
 
10.10.13
13:50
(47) Правда ты должен сам следить за вызовом в потоке 1С. В Net удобно использовать SynchronizationContext
50 vasbur
 
10.10.13
13:51
(49) как раз обработчики событий мы не используем.
Только прямые вызовы методов компоненты.
51 Serginio1
 
10.10.13
13:53
(48) Навряд ли. А кого ты собрался оповещать?
Ты можешь вызвать метод как в 13.
52 Serginio1
 
10.10.13
13:54
(50) Тогда зачем ВК на сервере, если можно спокойно обойтись COM?
53 vasbur
 
10.10.13
13:54
(51) не понял.
если не работает на стороне сервера - то как это решит проблему запуска компоненты на стороне сервера?
54 vasbur
 
10.10.13
13:56
(52) так сложилось исторически - мы реализовали технологию под названием "внешняя компонента".

По идее - можно сделать просто ком. Если это буждет на сервере работать.
55 Serginio1
 
10.10.13
13:57
(53) В 47 Это аналог события. Например
Sc.Send(d => EventTo1C.ExternalEvent("ДанныеОтСканера", sp1.PortName, indata), null);

Еще раз. Зачем тебе ВК на сервере, если можно обойтись COM ом
56 Serginio1
 
10.10.13
13:58
(54) Будет работать если окомпилировать по anyProcessor и зарегистрировать по 32 и 64
57 Serginio1
 
10.10.13
13:58
56+ вернее по до под чем работает сервер приложений 1С
58 vasbur
 
10.10.13
13:59
(55) идея понятна. попробуем
59 Serginio1
 
10.10.13
14:20
Кстати можно подгружать СОМ и без регистрации
v8: Можно ли использовать библиотеки без COM-сервера?
60 H A D G E H O G s
 
10.10.13
14:25
(59) Только надо CLSID знать объекта.

Но, я думаю, это не проблема, сделав залипуху на реестр и вызвав dllregisterserver.
61 H A D G E H O G s
 
10.10.13
14:27
(59) И если там IDispatch лежит.
62 Serginio1
 
10.10.13
14:35
(61) В как раз там IDispatch и лежит.
Сначала получаешь фабрику, а затем IDispath

DllGetClassObject(CLSID_XVID, IClassFactory, ClassF);
       ClassF.CreateInstance(nil, IID_IDispatch, res);
63 H A D G E H O G s
 
10.10.13
14:38
(62) Там кроме IDispatch может что угодно лежать, в т.ч. самописное. Я правильно понимаю?
64 Serginio1
 
10.10.13
14:40
65 Serginio1
 
10.10.13
14:42
Может все что угодно, но в большинстве случаев по дефолту нужен IDispatch. Что кстати и вызывает CoGetClassObject
66 H A D G E H O G s
 
10.10.13
14:43
(64) Я это читал.

Можно как-то получить CLSID для "незнакомой" dll, кроме как попыток вызвать dllregisterserver с перехватом реестра?
67 Rie
 
10.10.13
14:47
(66) Если она уже зарегистрирована - то можно просто поискать в реестре InprocServer32 с этой dll.
68 H A D G E H O G s
 
10.10.13
14:48
(67) Именно что без регистрации.
69 Serginio1
 
10.10.13
14:50
(68) Можно вытащит ITypeInfo
70 Serginio1
 
10.10.13
14:52
71 H A D G E H O G s
 
10.10.13
14:53
(70) Глянем.
72 Rie
 
10.10.13
14:54
(69) Для этого надо сначала зарегистрировать её, создать объект (не у dll же интерфейс запрашивать). А потом уж развлекаться. А тут - (68).
73 H A D G E H O G s
 
10.10.13
15:02
(72) Можно попросить этот интерфейс через GetClassObject, ведь его clsid и интерфейс стандартен и известен.
74 Rie
 
10.10.13
15:07
(73) У GetClassObject первый параметр - как раз CLSID.
75 Serginio1
 
10.10.13
15:15
76 Serginio1
 
10.10.13
15:16
77 Rie
 
10.10.13
15:21
(75), (76) Интересный вариант.
78 Капитан Смоллет
 
10.10.13
15:50
Дилетантский вопрос к
orefkov, H A D G E H O G s,
Rie
А вот работа с ОРС сервером (оборудование, весы, электросчетчики и тд) 1С поддерживает?
79 Serginio1
 
10.10.13
16:09
http://www.rsdn.ru/forum/com/40868?tree=tree
(78) Через ВК или COM с событиями