|   |   | 
| 
 | 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 с событиями | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |