|
1C V83 Com Connector - Копирование Com Object или асинхронный цикл для перебора данных | ☑ | ||
---|---|---|---|---|
0
AntonKemov
06.06.24
✎
00:18
|
Доброго времени суток!
При переборе данных с запроса, реализовал с помощь Channel в .NET раздельные операции чтения и записи, но вот не задача, Com_Object который возвращается, ссылочный тип и когда я вызываю метод .Next(), то соответственно менятеся он везде, и получается такая ситуация, у меня в справочнике 4 тысячи объектов, я их прочитал, но они все одинаковые во время обработки. Есть вопрос, как мне можно скопировать объект, который мне возвращается или какое нибудь другое решение, для реализации раздельной операции чтения/записи? Вот мой код на C# ниже: public static async Task ForEachAsync(this OneWithObject dataSampling, Action<OneWithObject> action) { var channel = Channel.CreateUnbounded<OneWithObject>(); var readerTask = RunReaderAsync().ConfigureAwait(false); var data = dataSampling.Instance; while (data.Next()) { await channel.Writer.WriteAsync(new OneWithObject(data)); } channel.Writer.Complete(); await readerTask; return; async Task RunReaderAsync(CancellationToken cancellationToken = default) { while (await channel.Reader.WaitToReadAsync(cancellationToken)) { while (channel.Reader.TryRead(out var dataObject)) { action.Invoke(dataObject); } } } } |
|||
1
AntonKemov
06.06.24
✎
00:32
|
Попровал реализовать через цикл for Количество и Получить методы, почему-то при Получить по индексу выдает null объект.
|
|||
2
AntonKemov
06.06.24
✎
00:32
|
var dataSampling = dataSamplingObject.Instance;
var count = dataSampling.Count(); for (var i = 0; i < count; i++) { var data = dataSampling.Получить(i); await channel.Writer.WriteAsync(new OneWithObject(data)); } |
|||
3
Garykom
гуру
06.06.24
✎
00:42
|
(0) ТЗ = Запрос.Выполнить().Выгрузить()
И вот ТЗ дели на куски (отдельные ТЗ) и работай с ними |
|||
4
Волшебник
06.06.24
✎
00:42
|
Вы должны дожить до завтра
|
|||
5
AntonKemov
06.06.24
✎
01:03
|
(3) Получилось, но есть ньюанс, например иначе теперь работа осуществляется с табличной частью, но это все поправимо и почему-то некоторые свойства стали не доступны :/
|
|||
6
AntonKemov
06.06.24
✎
01:05
|
Например у меня есть вот такой справочник:
<xs:complexType name="CatalogObject.МестаХраненияДел"> <xs:sequence> <xs:element name="Ref" type="tns:CatalogRef.МестаХраненияДел"/> <xs:element name="DeletionMark" type="xs:boolean"/> <xs:element name="Code" type="xs:string"/> <xs:element name="Description" type="xs:string"/> <xs:element name="PredefinedDataName" type="xs:string" minOccurs="0"/> <xs:element name="ЗапрещеноРазмещатьНовыеДела" type="xs:boolean"/> <xs:element name="Комментарий" type="xs:string"/> <xs:element name="Организация" type="tns:CatalogRef.Организации"/> <xs:element name="Ответственный" type="tns:CatalogRef.Пользователи"/> <xs:element name="Подразделение" type="tns:CatalogRef.СтруктураПредприятия"/> <xs:element name="ТерриторияПомещение" type="tns:CatalogRef.ТерриторииИПомещения"/> <xs:element name="Сокращение" type="xs:string"/> </xs:sequence> </xs:complexType> И тут есть английские и русские наименования свойств, английские перестали доставаться и при попытке взять его выдает Exception. |
|||
7
lEvGl
гуру
06.06.24
✎
08:18
|
мало что понятно, путаница в терминах, в переменных непонятно что
это dataSampling.Instance что приводите код с самого начала, чтобы были понятны типы объектов |
|||
8
AntonKemov
06.06.24
✎
09:05
|
(7) dataSampling - это название переменной, которая обернута просто в класс, который следит за неуправляемыми ресурсами ком объекта, а Instance - это сам ком объект.
|
|||
9
AntonKemov
06.06.24
✎
09:06
|
(7) это результат Query запроса, Выполнить и Выгрузить
|
|||
10
AntonKemov
06.06.24
✎
09:08
|
Спасибо всем, я уже смог решить свой вопрос с помощью ответа (3), но проблема с получением свойств с английским наименованием - осталась.
|
|||
11
lEvGl
гуру
06.06.24
✎
10:04
|
Выполнить().Выгрузить() возвращает ТаблицуЗначений, у нее нет Следующий()
(10) все английские - это предопределенные реквизиты справочника, русские - добавленные руками. Что то там было... 1. Попробуйте написать на русском 2. Попробуйте Справочник = Ссылка.ПолучитьОбъект(); потом Справочник.Наименование/Description или Code, что нужно 3. И правильный вариант - понять, чем может отличаться получение предопределенных реквизитов от добавленных зы. давно было и этих нюансов работы через СОМ нигде не описано насколько знаю ззы. сделайте сервис на стороне 1С, жить станет легче |
|||
12
AntonKemov
06.06.24
✎
21:15
|
(11) Я бы с удовольствием сделал, но я не 1С разработчик я нахожусь по другую сторону барикад и работаю с тем, что мне предоставили.
|
|||
13
lEvGl
гуру
06.06.24
✎
21:37
|
(13) ну по факту вам ничего не предоставили, просто доступ к базе логин пароль. сервис делается за 10 минут. а что вам там вобще нужно
|
|||
14
Garykom
гуру
06.06.24
✎
21:38
|
(12) Наймите программиста 1С
Пока вижу как джун на C# пытается с 1С работать, причем криво Джун потому что знаний по БД почти нет, попытки применять ненужные модные методы, которые у тебя один фиг в блокировки упрутся |
|||
15
lEvGl
гуру
06.06.24
✎
21:45
|
+ развивая тему
у вас ком, значит лицензии 1Сные есть, значит один эс крутится, значит и проги есть, может что они посоветуют или помощь окажут, подскажут на месте, когда все поднято, проще |
|||
16
Garykom
гуру
06.06.24
✎
21:43
|
да банально опубликовать OData в 1С на веб-сервере и все
|
|||
17
lEvGl
гуру
06.06.24
✎
21:52
|
на крайняк можно и на скл сходить) актуально особенно из шарпа, т к ком это тормоз, что свет не видел. клиент - ком - апликатион сервер - скл, потом обратно. 4000 элементов справочника не криминал, но что то в этом есть
|
|||
18
AntonKemov
06.06.24
✎
22:58
|
(14) Интересные у вас познания на счет блокировок в асинхронной разработке на .NET и градации званий в сфере разработки, основываясь на приведенном мной коде, я не буду вас разочаровывать в ваших познаниях, думаю вы сами к этому придете.
(13) (15) Разработчик на 1С - есть, но там уже бизнес проблемы почему он не может сервис поднять. (16) Я изначально был за сервис, неважно какой Rest, OData, Soap, gRPC и т.п. , но со стороны 1С сказали : "Есть проблемы и мы не можем". В любом случае, спасибо за помощь и совет по работе с этой прекрасной системой 1С и Com Connector. |
|||
19
AntonKemov
06.06.24
✎
23:03
|
(17) На счет тормозов - согласен, пока не знаю как быть, т.к. я оптимизировал по максимуму код, добавил где можно было параллельности, но все равно не добился необходимого результата по скорости формирования объектов.
Хз по поводу доступа к базе сразу через SQL, особенно если придется создавать объекты, есть шанс положить все из-за не знания структуры базы + под копотом Com Connector выполняется кучу бизнес логики, которую я тоже не знаю. |
|||
20
AntonKemov
06.06.24
✎
23:05
|
(17) А и еще закешировал, все что можно и нельзя было, в итоге получил результат примерно 1-4 объекта в секунду.
Но это с учетом того, что это все работает через рефлексию .NET, а она немного медленная. |
|||
21
lEvGl
гуру
07.06.24
✎
06:57
|
Возьмите шарп 2-х тысячных годов и сделайте замер производительности. Они будут где то рядом с коннектором (утрирование). 1-4 объекта в секунду.. так и рождаются мифы об 1с.
У нас есть мудачье(обслуживающие оборудование), это не эпитет для оскоробления - смысл, которое ходит на всю контору рассказывает, что 1С тормозит компуктеры. А там из тормозящего - атол драйвер на перехват клавиатуры, не сложно догадаться, что компы хлам, что даже ваш шарп/++ на ввод с клавы тормозит. Но проще что? Правильно, сказать, что кто то там виноват. При этом даже винду на компе переставить боятся, вдруг что то не заработает. Мудачье. Не принимайте на свой счет. Вы не сможете оптимизировать доступ к базе по закрытой технологии. + он поднимается овер долго. Первый многопоток уже закончит, пока второй поднимется. "это ком, детка" ;P бизабид зы. нельзя заставить велосипед "Кама" ехать отдвухсот км/ч, потому что у него колеса диаметром сантиметров 35, хоть десяток крутящих педали посади |
|||
22
lEvGl
гуру
07.06.24
✎
00:40
|
(20) все зря, скорости не будет. юзайте чего побыстрее. тем более шарп, ради чего вся эта ерунда тогда
ну а блокировки ком наложит как за здрастье *(14) знает, о чем говорит. Чтобы решить еще и это, озадачьтесь распределением оных, через коннектор и настройки базы, Здесь закопано бгггг)) зызы. я бы сказал джун из за используемой архитектуры |
|||
23
Garykom
гуру
07.06.24
✎
09:18
|
(22) блокировки не только com/ole но и субд
|
|||
24
Garykom
гуру
07.06.24
✎
09:28
|
угу архитектура еще та
выгрузку из 1С в json написать и любым образом запускать на C# читать json все какой транспорт будет для передачи json неважно а не вот эти вот внутри асинх циклов комобъект.вызовметода (и внутри него еще обращения к субд с блокировками) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |