Вход | Регистрация
 

Не релизится COM объект

Не релизится COM объект
Я
   rowvg
 
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 равно нулю, но сервер не выгружает себя. Помогите, пжл, советом что не так?
   Garykom
 
1 - 08.03.20 - 12:39
(0) com is deprecated
   Garykom
 
2 - 08.03.20 - 12:41
comConn.Close();
comConnector = null;
   rowvg
 
3 - 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);
   rowvg
 
4 - 08.03.20 - 12:47
(2) Зачем? В RCW и так количество ссылок равно нулю? Не вижу смысла.

comConn.Close(); - это что такое?

Тем не менее я видел в интернете рекомендации присваивать переменным null, я попробовал, никак не помогло.
   Garykom
 
5 - 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 тоже
   Garykom
 
6 - 08.03.20 - 12:52
И лучше все же отказаться от COM и перейти на http сервисы.
Можно сделать в 1С сервис который будет принимать код на 1С, выполнять его и возвращать результат
   rowvg
 
7 - 08.03.20 - 12:59
(6) От COM никто никогда не откажется. Глупо менять эту технологию на сервисы в пределах LAN. Вместо пары строк для начала обмена мне нужно будет описать XDTO, сгенерировать WSDL, придумать имя пространству имен, написать тело сервиса, поднять web сервер, опубликовать сервис.
   ДенисЧ
 
8 - 08.03.20 - 13:01
(7) А кто тебе предлагал web-сервис?
Да и вообще - в свете всеобщей маргинализации рынка ОС - все скоро придут к линуху. А там ком живёт как-то не очень хорошо...
   Garykom
 
9 - 08.03.20 - 13:06
(7) HTTP сервис в 1С поднять если уже база опубликована на веб-сервере это блин пара минут.
Код который умеет на вход принимать код 1С, выполнять и результат отсылать назад еще минут 10.

А потом хоть заюзайся не трогая 1С из разных софтин
   rowvg
 
10 - 08.03.20 - 13:11
(9) А если нельзя в конфигураторе изменения вносить? А если 50 совершенно одинаковых баз? А если нет времени web сервером заниматься, да и не хочется на это время тратить?
   Garykom
 
11 - 08.03.20 - 13:12
(10) Сделай в расширении. ... А ипаться с глючным COM есть время?
   Garykom
 
12 - 08.03.20 - 13:14
(10) Кстати да хоть 500 и больше баз - ибо все автоматизируется. Можно и расширение добавить и опубликовать кодом/скриптами
   Garykom
 
13 - 08.03.20 - 13:15
(12)+ Есть даже готовая фича в обновляторе https://helpme1c.ru/upravlyaem-rasshireniyami-srazu-v-gruppe-baz-pri-pomoshhi-obnovlyatora-1s-2
Если кодом/скриптами самому влом
   rowvg
 
14 - 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);
                    }
   Garykom
 
15 - 08.03.20 - 13:18
GC.Collect();
   rowvg
 
16 - 08.03.20 - 13:18
14+ Я бы оставил этот способ работы, но к стыду своему никак не могу понять как в P/Invoke добавить строку в табличную часть документа. Подскажите, пжл.
   rowvg
 
17 - 08.03.20 - 13:20
(15) Зачем мне раньше рантайма сборку мусора вызывать? Какой  этом смысл? Как сборка мусора влияет на количество ссылок на полученный интерфейс?
   Garykom
 
18 - 08.03.20 - 13:24
   Garykom
 
19 - 08.03.20 - 13:25
Короче от того что ты очистил счетчик ссылок или даже принудительно установил в 0 нихрена не поменялось в управляемом коде.
Один хрен дожидаться пока CLR сама сборщик запустит или принудительно (15)
   rowvg
 
20 - 08.03.20 - 13:25
(9) << HTTP сервис в 1С поднять если уже база опубликована на веб-сервере это блин пара минут

А написать тело сервиса? Не 5 минут совсем.
   Garykom
 
21 - 08.03.20 - 13:27
(20) Смотря для кого. Для меня 10 минут (когда ничего не тормозит и не надо ждать по 5 минут запуска отладки)
   Garykom
 
22 - 08.03.20 - 13:28
(21)+ Тут дольше думать как результат и какой возвращать. И что на входе.

Понятно на вход подается допустим код на ЯП 1С, который внутри через Выполнить() или скорее Вычислить()
А что этому коду как параметры/данные подсунуть и какой результат нужно вернуть это думать.
   Garykom
 
23 - 08.03.20 - 13:30
Если у тебя надо создавать в 1С некие документы то есть куча решение. Например через RabbitMQ и прочие брокеры и там когда в 1С все готово то достаточно нужные сообщения формировать а она сама в фоновых все загрузит/выгрузит
   rowvg
 
24 - 08.03.20 - 13:31
(19) Из чего это утверждение следует? Это даже смешно. inproc com сервер вообще откуда знает сколько у меня мусора в рантайме?!!! Да ему по барабану на это, у COM сервера счетчик обнулился, он покидает память. Он о .net вообще ничего не знает.
   Garykom
 
25 - 08.03.20 - 13:33
(23)+ Да блин банальную OData автоматическую заюзать, она одной галочкой при публикации включается. Но разбираться как с ней работать надо да.
   Garykom
 
26 - 08.03.20 - 13:33
(24) Хаха.
   Garykom
 
27 - 08.03.20 - 13:34
(26)+ разница между неуправляемым с P/Invoke и управляемым
   Garykom
 
28 - 08.03.20 - 13:35
Короче изучи http://catalog.mista.ru/public/792952/ - это штука которая решает (точнее переносит на другой уровень) проблемы
   rowvg
 
29 - 08.03.20 - 13:35
(26) А конкретнее? Объясни какая связь между количеством ссылок на полученный интерфейс, которое кокласс сам подсчитывает, и количеством мусора в рантайме?
   rowvg
 
30 - 08.03.20 - 13:39
(28) Спасибо, это не наш уровень абстракции. Мы работаем через COM и сокеты. Самое то, никаких web серверов не надо, никакго лишнего программного слоя.
 
 Рекламное место пустует
   Garykom
 
31 - 08.03.20 - 13:40
(29) Мануалы читай. Короче если ты не освободил неуправляемые то при выходе у тебя будет краш скорее всего.
Но то что ты явно их освободил нихрена не значит и реально освободятся они сами GC
   Garykom
 
32 - 08.03.20 - 13:41
(30) Речь не про уровень абстракции а что нехрен на лошадях и телегах логистику строить современную даже для ларька.

COM устарел.
   Garykom
 
33 - 08.03.20 - 13:45
GC.Collect() и GC.WaitForPendingFinalizers() а перед этим обнули ссылки на COM объекты и все.

Marshal.ReleaseComObject() или Marshal.FinalReleaseComObject () банально не нужны.
   rowvg
 
34 - 08.03.20 - 13:46
(31) Какие неуправляемые? Приложение на C# получает интерфейс через RCW, RCW обнуляет количество ссылок в компоненте, то есть RCW физически делает вызов метода Release(). Компонента сама уменьшает количество ссылок на полученные интерфейсы, и если они станут равны нулю, то сама выгрузит себя из памяти. Нет никакой связи между мусором в рантайме, и количеством ссылок в кокласе.
   rowvg
 
35 - 08.03.20 - 13:48
(33) Объясните простую вещь, как GC.Collect() приведет к вызову метода Release()? Если сможете, то я соглашусь с вами.
   rowvg
 
36 - 08.03.20 - 13:51
(32) Если COM устарел, то как же 1С записывает данные в SQL Server? OLE DB ведь на COMe построен, хе - хе
   Garykom
 
37 - 08.03.20 - 14:02
   rowvg
 
38 - 08.03.20 - 14:04
(37) Простите, Вы издеваетесь? Или у вас праздник в самом разгаре? )))
   hhhh
 
39 - 08.03.20 - 14:07
(38) он наверно намекает что там нет никакого Com
   rowvg
 
40 - 08.03.20 - 14:13
(39) Где он его ищет его точно нет )))
   Garykom
 
41 - 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 и не пахнет) ?
   rowvg
 
42 - 08.03.20 - 15:36
(41) Удивительные вещи вы мне рассказываете. Среди моих полсотни клиентов ни одного не нашлось кто работал бы не на связке Windows + SQL Server. Наверное, мы живем в разных вселенных )))
   rowvg
 
43 - 08.03.20 - 15:42
Вопрос остается открытым. Подскажите, пжл, как создать строку в табличной части работая с компонентой через вызовы P/Invoke?
   acht
 
44 - 08.03.20 - 15:51
(42) > Среди моих полсотни клиентов
Вау, какой крутой бизнесмен. В праздник клянчит на форуме решение своих проблем.
Ах да, это ж совсем другое...
   acht
 
45 - 08.03.20 - 15:52
И кстати, почему не "Документ.ПоступлениеПоклажи"?
   Garykom
 
46 - 08.03.20 - 16:03
(42) А вы возьметесь за клиента с 1С на linux и postgresql ? Или "ой я линукс не знаю купите/поставьте винду"
   Cthulhu
 
47 - 08.03.20 - 16:03
oData может справиться с этой задачей гораздо безгиморнее и прозрачнее, кстати....
   Garykom
 
48 - 08.03.20 - 16:08
(47) Бывают некоторые моменты когда надо кодом на 1С что то внутри делать и тут OData неудобна и дольше, проще все же http сервис.
Хотя технически OData тот же http-сервис.
   Cthulhu
 
49 - 08.03.20 - 16:38
(48): oData - full rest по сути, может юзать весь доступный экпорт-функционал (со стандартными ограничениями) же...
и - вот как раз для заглавной задачи топика - годится на все сто, причем в разы прозрачнее и легче, и все "с этой стороны".
не?
   rowvg
 
50 - 08.03.20 - 16:47
(44) Я не клянчу, а прошу. Если никто не поможет, то у меня три варианта других есть как решить мою задачу. И что такого что в праздник? Я же не по телефону звоню. Может кто - то и в праздник поможет. Я не пойму просто сути ваших претензий.

(46) А зачем, мне от "нормальных" клиентов отбоя нет)))
   rowvg
 
51 - 08.03.20 - 17:09
(47) да, да, эти сказки про серебряные пули, слышали, знаем
   Cthulhu
 
52 - 08.03.20 - 18:06
(51): смахивает на "хорошую мину при плохой игре" - при том, что похоже и не слышали, и не знаете, но вместо того, чтобы попытаться узнать - проще обгадить. попутно приписав оппоненту то. чего он не говорил (ни о какой "серебряной пуле" речь не шла, просто с некоторых пор в 1с реалтзован full-rest функционал "со всеми вытекающими" - включая возможности доступа к объектной модели, методам и данным "снаружи", но проще, конечно, "плавали - знаем, и вообще, ну кого может интересовать мнение об архитектуре, высказанное человектом без прописки" (с))
   Garykom
 
53 - 08.03.20 - 18:17
RESTful принято говорить
   rowvg
 
54 - 08.03.20 - 19:29
(52) И зачем это надо если есть COM? Подсоединился одной строчкой кода и работай, не нужен ни web сервер, не нужно сам сервис писать. Я в локальной сети и все клиенты у меня под виндой. Вы же мне предлагаете геморрой, который оправдан только в том случае, если у меня глобальная гетерогенная система, где COMа может и не быть.

И если потребуется обойтись без COM, то я напишу обычный SOAP сервис. Потребность в них тоже немалая, обычно их предлагают для интеграции производители сторонних программных продуктов. Самое ценное в soap сервисе - это wsdl, который, как мне представляется, является аналогом xsd для xml документов.

Эти две технологии + сокеты позволяют мне решать любые задачи по интеграции программных продуктов. Тратить свое время на изучении чего - то другого крайне сомнительного качества - спасибо, не надо.
   Garykom
 
55 - 08.03.20 - 21:09
(54) http/rest/json в разы проще soap, твой wsdl это по сути rpc который я и предлагал реализовать на http сервисах

И еще раз для невнимательных никакого сервиса в простейшем случае с odata писать не надо, надо просто галочку поставить при публикации из конфигуратор и он готов.
   Garykom
 
56 - 08.03.20 - 21:10
А этот COM кстати тоже надо зарегистрировать и это происходит при установке 1С.
И если ты еще не столкнулся с глюками COM в 1С когда много разных версий платформ стоит одной 8.2 или 8.3 то можно только удивляться.
   sitex
 
57 - 08.03.20 - 21:32
Я вот читаю топик и удивляюсь, народ да что вы усераетесь и доказываете ему что httpсервисы лучше и быстрее поднять. Ну придёт он к этому через проб ошибок через несколько месяцев сам. Бессмысленно трата времени.
   rowvg
 
58 - 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 сервера, забирает данные - и все ок.
   rowvg
 
59 - 08.03.20 - 22:25
(58) Всем спасибо за участие, проблему решил.
   Garykom
 
60 - 09.03.20 - 07:20
(59) "мой сервер отчетов написан то на C#" - 1С как бэкенд и на html/css/js пишется фронтенд для браузера и никаких извратов с C#/.Net/ASP.NET
 
 Рекламное место пустует
   acht
 
61 - 09.03.20 - 09:57
(60) Егор, сервер отчетов 1С, написанный на C# человеком, испытывающим трудности с добавлением строки в табличную часть 1С, несомненно круче и стабильней. Признайся уже в этом себе и смирись.


Список тем форума
Рекламное место пустует  Рекламное место пустует
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс, 1996 г.
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.