Имя: Пароль:
1C
 
Не релизится 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
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С, несомненно круче и стабильней. Признайся уже в этом себе и смирись.