|
Не релизится COM объект | ☑ | ||
---|---|---|---|---|
0
rowvg
naïve
08.03.20
✎
12:38
|
Вызываю 1С - ий inproc server из приложения на .net, код следующий:
COMConnector comConnector = new COMConnector(); dynamic comConn = comConnector.Connect(connectionString1C); dynamic doc = comConn.Документы.ПоступлениеГрузов.СоздатьДокумент(); doc.Дата = DateTime.Now; dynamic refB = comConn.Справочники.Поклажедатели.НайтиПоНаименованию("ОАО РЖД"); doc.Поклажедатель = refB; doc.Записать(); int countInRCW; countInRCW = Marshal.ReleaseComObject(refB); countInRCW = Marshal.ReleaseComObject(doc); countInRCW = Marshal.ReleaseComObject(comConn); countInRCW = Marshal.ReleaseComObject(comConnector); После всех этих вызовов количество ссылок в RCW равно нулю, но сервер не выгружает себя. Помогите, пжл, советом что не так? |
|||
1
Garykom
гуру
08.03.20
✎
12:39
|
(0) com is deprecated
|
|||
2
Garykom
гуру
08.03.20
✎
12:41
|
comConn.Close();
comConnector = null; |
|||
3
rowvg
naïve
08.03.20
✎
12:43
|
0+ Интересно отметить, что вот такой код не приводит к ошибкам в выгрузке COM объекта:
COMConnector comConnector = new COMConnector(); dynamic comConn = comConnector.Connect(connectionString1C); int countInRCW; countInRCW = Marshal.ReleaseComObject(comConn); countInRCW = Marshal.ReleaseComObject(comConnector); |
|||
4
rowvg
naïve
08.03.20
✎
12:47
|
(2) Зачем? В RCW и так количество ссылок равно нулю? Не вижу смысла.
comConn.Close(); - это что такое? Тем не менее я видел в интернете рекомендации присваивать переменным null, я попробовал, никак не помогло. |
|||
5
Garykom
гуру
08.03.20
✎
12:51
|
(4) да нету Close но есть прикол с "Для пользователя под которым выполняется подключение должен быть отключен флажок «Запрашивать подтверждение при закрытии программы» в его настройках."
http://professia1c.ru/obmen-dannyimi/integratsiya-1s-s-drugimi-prilozheniyami/com/obmen-dannyimi-mezhdu-bazami-1s-cherez-com-soedinenie/ Хз требуется ли это только для Application или для COMConnector тоже |
|||
6
Garykom
гуру
08.03.20
✎
12:52
|
И лучше все же отказаться от COM и перейти на http сервисы.
Можно сделать в 1С сервис который будет принимать код на 1С, выполнять его и возвращать результат |
|||
7
rowvg
naïve
08.03.20
✎
12:59
|
(6) От COM никто никогда не откажется. Глупо менять эту технологию на сервисы в пределах LAN. Вместо пары строк для начала обмена мне нужно будет описать XDTO, сгенерировать WSDL, придумать имя пространству имен, написать тело сервиса, поднять web сервер, опубликовать сервис.
|
|||
8
ДенисЧ
08.03.20
✎
13:01
|
(7) А кто тебе предлагал web-сервис?
Да и вообще - в свете всеобщей маргинализации рынка ОС - все скоро придут к линуху. А там ком живёт как-то не очень хорошо... |
|||
9
Garykom
гуру
08.03.20
✎
13:06
|
(7) HTTP сервис в 1С поднять если уже база опубликована на веб-сервере это блин пара минут.
Код который умеет на вход принимать код 1С, выполнять и результат отсылать назад еще минут 10. А потом хоть заюзайся не трогая 1С из разных софтин |
|||
10
rowvg
naïve
08.03.20
✎
13:11
|
(9) А если нельзя в конфигураторе изменения вносить? А если 50 совершенно одинаковых баз? А если нет времени web сервером заниматься, да и не хочется на это время тратить?
|
|||
11
Garykom
гуру
08.03.20
✎
13:12
|
(10) Сделай в расширении. ... А ипаться с глючным COM есть время?
|
|||
12
Garykom
гуру
08.03.20
✎
13:14
|
(10) Кстати да хоть 500 и больше баз - ибо все автоматизируется. Можно и расширение добавить и опубликовать кодом/скриптами
|
|||
13
Garykom
гуру
08.03.20
✎
13:15
|
(12)+ Есть даже готовая фича в обновляторе https://helpme1c.ru/upravlyaem-rasshireniyami-srazu-v-gruppe-baz-pri-pomoshhi-obnovlyatora-1s-2
Если кодом/скриптами самому влом |
|||
14
rowvg
naïve
08.03.20
✎
13:16
|
Что еще заметил. Если работать с сервером через P/Invoke вызовы, то проблемы нет, сервер прекрасненько выгружается из памяти.
Вот код, в котором все работает хорошо Type objectType = Type.GetTypeFromProgID("V83.COMConnector"); if (objectType != null) { object comCntrV83 = Activator.CreateInstance(objectType); object comConn = objectType.InvokeMember("Connect", BindingFlags.Public | BindingFlags.InvokeMethod, null, comCntrV83, new object[] { connectionString1C }); object docManager = objectType.InvokeMember("NewObject", BindingFlags.Public | BindingFlags.InvokeMethod, null, comConn, new object[] { "ДокументМенеджер.ПоступлениеГрузов" }); object newDoc = objectType.InvokeMember("СоздатьДокумент", BindingFlags.Public | BindingFlags.InvokeMethod, null, docManager, new object[] { }); newDoc.GetType().InvokeMember("Дата", BindingFlags.PutDispProperty | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly, null, newDoc, new object[] { DateTime.Now }); object bailors = objectType.InvokeMember("NewObject", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, comConn, new object[] { "СправочникМенеджер.Поклажедатели" }); object bailorRef = objectType.InvokeMember("НайтиПоНаименованию", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, bailors, new object[] { "ОАО РЖД" }); newDoc.GetType().InvokeMember("Поклажедатель", BindingFlags.PutDispProperty | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly, null, newDoc, new object[] { bailorRef }); newDoc.GetType().InvokeMember("Записать", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, newDoc, new object[] { }); Marshal.ReleaseComObject(bailors); Marshal.ReleaseComObject(bailorRef); Marshal.ReleaseComObject(docManager); Marshal.ReleaseComObject(newDoc); Marshal.ReleaseComObject(comConn); Marshal.ReleaseComObject(comCntrV83); } |
|||
15
Garykom
гуру
08.03.20
✎
13:18
|
GC.Collect();
|
|||
16
rowvg
naïve
08.03.20
✎
13:18
|
14+ Я бы оставил этот способ работы, но к стыду своему никак не могу понять как в P/Invoke добавить строку в табличную часть документа. Подскажите, пжл.
|
|||
17
rowvg
naïve
08.03.20
✎
13:20
|
(15) Зачем мне раньше рантайма сборку мусора вызывать? Какой этом смысл? Как сборка мусора влияет на количество ссылок на полученный интерфейс?
|
|||
18
Garykom
гуру
08.03.20
✎
13:24
|
(17) https://www.sql.ru/forum/906372/dlya-chego-nuzhen-marshal-releasecomobject
https://docs.microsoft.com/ru-ru/dotnet/api/system.runtime.interopservices.marshal.releasecomobject?view=netframework-4.8 https://docs.microsoft.com/ru-ru/dotnet/api/system.runtime.interopservices.marshal.finalreleasecomobject?view=netframework-4.8#System_Runtime_InteropServices_Marshal_FinalReleaseComObject_System_Object_ |
|||
19
Garykom
гуру
08.03.20
✎
13:25
|
Короче от того что ты очистил счетчик ссылок или даже принудительно установил в 0 нихрена не поменялось в управляемом коде.
Один хрен дожидаться пока CLR сама сборщик запустит или принудительно (15) |
|||
20
rowvg
naïve
08.03.20
✎
13:25
|
(9) << HTTP сервис в 1С поднять если уже база опубликована на веб-сервере это блин пара минут
А написать тело сервиса? Не 5 минут совсем. |
|||
21
Garykom
гуру
08.03.20
✎
13:27
|
(20) Смотря для кого. Для меня 10 минут (когда ничего не тормозит и не надо ждать по 5 минут запуска отладки)
|
|||
22
Garykom
гуру
08.03.20
✎
13:28
|
(21)+ Тут дольше думать как результат и какой возвращать. И что на входе.
Понятно на вход подается допустим код на ЯП 1С, который внутри через Выполнить() или скорее Вычислить() А что этому коду как параметры/данные подсунуть и какой результат нужно вернуть это думать. |
|||
23
Garykom
гуру
08.03.20
✎
13:30
|
Если у тебя надо создавать в 1С некие документы то есть куча решение. Например через RabbitMQ и прочие брокеры и там когда в 1С все готово то достаточно нужные сообщения формировать а она сама в фоновых все загрузит/выгрузит
|
|||
24
rowvg
naïve
08.03.20
✎
13:31
|
(19) Из чего это утверждение следует? Это даже смешно. inproc com сервер вообще откуда знает сколько у меня мусора в рантайме?!!! Да ему по барабану на это, у COM сервера счетчик обнулился, он покидает память. Он о .net вообще ничего не знает.
|
|||
25
Garykom
гуру
08.03.20
✎
13:33
|
(23)+ Да блин банальную OData автоматическую заюзать, она одной галочкой при публикации включается. Но разбираться как с ней работать надо да.
|
|||
26
Garykom
гуру
08.03.20
✎
13:33
|
(24) Хаха.
|
|||
27
Garykom
гуру
08.03.20
✎
13:34
|
(26)+ разница между неуправляемым с P/Invoke и управляемым
|
|||
28
Garykom
гуру
08.03.20
✎
13:35
|
Короче изучи http://catalog.mista.ru/public/792952/ - это штука которая решает (точнее переносит на другой уровень) проблемы
|
|||
29
rowvg
naïve
08.03.20
✎
13:35
|
(26) А конкретнее? Объясни какая связь между количеством ссылок на полученный интерфейс, которое кокласс сам подсчитывает, и количеством мусора в рантайме?
|
|||
30
rowvg
naïve
08.03.20
✎
13:39
|
(28) Спасибо, это не наш уровень абстракции. Мы работаем через COM и сокеты. Самое то, никаких web серверов не надо, никакго лишнего программного слоя.
|
|||
31
Garykom
гуру
08.03.20
✎
13:40
|
(29) Мануалы читай. Короче если ты не освободил неуправляемые то при выходе у тебя будет краш скорее всего.
Но то что ты явно их освободил нихрена не значит и реально освободятся они сами GC |
|||
32
Garykom
гуру
08.03.20
✎
13:41
|
(30) Речь не про уровень абстракции а что нехрен на лошадях и телегах логистику строить современную даже для ларька.
COM устарел. |
|||
33
Garykom
гуру
08.03.20
✎
13:45
|
GC.Collect() и GC.WaitForPendingFinalizers() а перед этим обнули ссылки на COM объекты и все.
Marshal.ReleaseComObject() или Marshal.FinalReleaseComObject () банально не нужны. |
|||
34
rowvg
naïve
08.03.20
✎
13:46
|
(31) Какие неуправляемые? Приложение на C# получает интерфейс через RCW, RCW обнуляет количество ссылок в компоненте, то есть RCW физически делает вызов метода Release(). Компонента сама уменьшает количество ссылок на полученные интерфейсы, и если они станут равны нулю, то сама выгрузит себя из памяти. Нет никакой связи между мусором в рантайме, и количеством ссылок в кокласе.
|
|||
35
rowvg
naïve
08.03.20
✎
13:48
|
(33) Объясните простую вещь, как GC.Collect() приведет к вызову метода Release()? Если сможете, то я соглашусь с вами.
|
|||
36
rowvg
naïve
08.03.20
✎
13:51
|
(32) Если COM устарел, то как же 1С записывает данные в SQL Server? OLE DB ведь на COMe построен, хе - хе
|
|||
37
Garykom
гуру
08.03.20
✎
14:02
|
||||
38
rowvg
naïve
08.03.20
✎
14:04
|
(37) Простите, Вы издеваетесь? Или у вас праздник в самом разгаре? )))
|
|||
39
hhhh
08.03.20
✎
14:07
|
(38) он наверно намекает что там нет никакого Com
|
|||
40
rowvg
naïve
08.03.20
✎
14:13
|
(39) Где он его ищет его точно нет )))
|
|||
41
Garykom
гуру
08.03.20
✎
14:16
|
(40) ODBC как и https://v8.1c.ru/platforma/vneshnie-istochniki-dannyh/ не имеют никакого отношения в COM/OLE/ActiveX хотя и могут работать посредством COM прокладки.
Где еще в 1С ты нашел связь с SQL Server (наверно подразумевается MSSQL ибо так то 1С давно на линуксе и с другими sql server не от MS и там COM и не пахнет) ? |
|||
42
rowvg
naïve
08.03.20
✎
15:36
|
(41) Удивительные вещи вы мне рассказываете. Среди моих полсотни клиентов ни одного не нашлось кто работал бы не на связке Windows + SQL Server. Наверное, мы живем в разных вселенных )))
|
|||
43
rowvg
naïve
08.03.20
✎
15:42
|
Вопрос остается открытым. Подскажите, пжл, как создать строку в табличной части работая с компонентой через вызовы P/Invoke?
|
|||
44
acht
08.03.20
✎
15:51
|
(42) > Среди моих полсотни клиентов
Вау, какой крутой бизнесмен. В праздник клянчит на форуме решение своих проблем. Ах да, это ж совсем другое... |
|||
45
acht
08.03.20
✎
15:52
|
И кстати, почему не "Документ.ПоступлениеПоклажи"?
|
|||
46
Garykom
гуру
08.03.20
✎
16:03
|
(42) А вы возьметесь за клиента с 1С на linux и postgresql ? Или "ой я линукс не знаю купите/поставьте винду"
|
|||
47
Cthulhu
08.03.20
✎
16:03
|
oData может справиться с этой задачей гораздо безгиморнее и прозрачнее, кстати....
|
|||
48
Garykom
гуру
08.03.20
✎
16:08
|
(47) Бывают некоторые моменты когда надо кодом на 1С что то внутри делать и тут OData неудобна и дольше, проще все же http сервис.
Хотя технически OData тот же http-сервис. |
|||
49
Cthulhu
08.03.20
✎
16:38
|
(48): oData - full rest по сути, может юзать весь доступный экпорт-функционал (со стандартными ограничениями) же...
и - вот как раз для заглавной задачи топика - годится на все сто, причем в разы прозрачнее и легче, и все "с этой стороны". не? |
|||
50
rowvg
naïve
08.03.20
✎
16:47
|
(44) Я не клянчу, а прошу. Если никто не поможет, то у меня три варианта других есть как решить мою задачу. И что такого что в праздник? Я же не по телефону звоню. Может кто - то и в праздник поможет. Я не пойму просто сути ваших претензий.
(46) А зачем, мне от "нормальных" клиентов отбоя нет))) |
|||
51
rowvg
naïve
08.03.20
✎
17:09
|
(47) да, да, эти сказки про серебряные пули, слышали, знаем
|
|||
52
Cthulhu
08.03.20
✎
18:06
|
(51): смахивает на "хорошую мину при плохой игре" - при том, что похоже и не слышали, и не знаете, но вместо того, чтобы попытаться узнать - проще обгадить. попутно приписав оппоненту то. чего он не говорил (ни о какой "серебряной пуле" речь не шла, просто с некоторых пор в 1с реалтзован full-rest функционал "со всеми вытекающими" - включая возможности доступа к объектной модели, методам и данным "снаружи", но проще, конечно, "плавали - знаем, и вообще, ну кого может интересовать мнение об архитектуре, высказанное человектом без прописки" (с))
|
|||
53
Garykom
гуру
08.03.20
✎
18:17
|
RESTful принято говорить
|
|||
54
rowvg
naïve
08.03.20
✎
19:29
|
(52) И зачем это надо если есть COM? Подсоединился одной строчкой кода и работай, не нужен ни web сервер, не нужно сам сервис писать. Я в локальной сети и все клиенты у меня под виндой. Вы же мне предлагаете геморрой, который оправдан только в том случае, если у меня глобальная гетерогенная система, где COMа может и не быть.
И если потребуется обойтись без COM, то я напишу обычный SOAP сервис. Потребность в них тоже немалая, обычно их предлагают для интеграции производители сторонних программных продуктов. Самое ценное в soap сервисе - это wsdl, который, как мне представляется, является аналогом xsd для xml документов. Эти две технологии + сокеты позволяют мне решать любые задачи по интеграции программных продуктов. Тратить свое время на изучении чего - то другого крайне сомнительного качества - спасибо, не надо. |
|||
55
Garykom
гуру
08.03.20
✎
21:09
|
(54) http/rest/json в разы проще soap, твой wsdl это по сути rpc который я и предлагал реализовать на http сервисах
И еще раз для невнимательных никакого сервиса в простейшем случае с odata писать не надо, надо просто галочку поставить при публикации из конфигуратор и он готов. |
|||
56
Garykom
гуру
08.03.20
✎
21:10
|
А этот COM кстати тоже надо зарегистрировать и это происходит при установке 1С.
И если ты еще не столкнулся с глюками COM в 1С когда много разных версий платформ стоит одной 8.2 или 8.3 то можно только удивляться. |
|||
57
sitex
naïve
08.03.20
✎
21:32
|
Я вот читаю топик и удивляюсь, народ да что вы усераетесь и доказываете ему что httpсервисы лучше и быстрее поднять. Ну придёт он к этому через проб ошибок через несколько месяцев сам. Бессмысленно трата времени.
|
|||
58
rowvg
naïve
08.03.20
✎
22:14
|
(55) Я soap сервисов сотню уже написал, наверное, и никакой сложности в них не нашел. Совсем никакой.
<< И еще раз для невнимательных никакого сервиса в простейшем случае с odata писать не надо, надо просто галочку поставить при публикации из конфигуратор и он готов. Но web сервер - то нужен. А если его нет, то его надо установить, для этого нужен отдельный комп, который будет работать 24 часа в сутки, нужен человек, который будет за ним следить чтобы хотя бы знать как его перезапустить. А публикация иногда слетает. Зачем весь этот геморрой? COM компоненте ничего этого не надо. Она самодостаточна. (56) Запустить regsvr из командной строки это, конечно, очень большая утомительная работа )) << И если ты еще не столкнулся с глюками COM в 1С когда много разных версий платформ стоит одной 8.2 или 8.3 то можно только удивляться. Это не глюки, так и должно быть. И я с этим сталкивался, когда, например, ЗУП у нас работала на 8.2 и перевести ее на 8.3 было нельзя так как на 8.3 у нее не строился табель, а бухня была на 8.3. И что, мой сервер отчетов написан то на C#, он запускает нужные inproc сервера, забирает данные - и все ок. |
|||
59
rowvg
naïve
08.03.20
✎
22:25
|
(58) Всем спасибо за участие, проблему решил.
|
|||
60
Garykom
гуру
09.03.20
✎
07:20
|
(59) "мой сервер отчетов написан то на C#" - 1С как бэкенд и на html/css/js пишется фронтенд для браузера и никаких извратов с C#/.Net/ASP.NET
|
|||
61
acht
09.03.20
✎
09:57
|
(60) Егор, сервер отчетов 1С, написанный на C# человеком, испытывающим трудности с добавлением строки в табличную часть 1С, несомненно круче и стабильней. Признайся уже в этом себе и смирись.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |