|
Доступ 1с8 через com+ из c# | ☑ | ||
---|---|---|---|---|
0
artprog
18.10.11
✎
16:59
|
Добрый день.
Подскажите, как получить данные из 1с8. Например загрузить справочник. Вот код на с# для подключения к 1с. Что делать дальше? В чем ошибки? public partial class Form1 : Form { string user, pas, file; object com1s, result, doc; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { user = "БахшиевПИ (руководитель)"; pas = ""; file = textBox1.Text; Object result; Object doc; V82.COMConnector com1s = new V82.COMConnector(); com1s.PoolCapacity = 10; com1s.PoolTimeout = 60; com1s.MaxConnections = 2; com1s.Connect("File='" + file + "';Usr='" + user + "';pwd='" + pas + "';"); label2.Text = "Операция выполнена"; } } |
|||
1
ИШТ
18.10.11
✎
17:00
|
вижу. что пример кода, для подключения к файловой БД. У тебя файловая или сервер?
|
|||
2
artprog
18.10.11
✎
17:01
|
файловая. а чем код под сервер отличается?
|
|||
3
ИШТ
18.10.11
✎
17:02
|
строкой коннекта
|
|||
4
Kreont
18.10.11
✎
17:08
|
(0) А где все таки ошибки?
|
|||
5
izekia
18.10.11
✎
17:12
|
а зачем сразу через комплюс?
|
|||
6
artprog
18.10.11
✎
17:12
|
(4) На этом участке кода ошибок не выдается. К базе приложение вроде как подключается.
Объясните пожалуйста, как производить теперь операции в 1с? Как сформировать запрос на выборку данных? |
|||
7
artprog
18.10.11
✎
17:12
|
(5) планируется частое обращение к базе. Чтобы снизить нагрузку.
|
|||
8
Kreont
18.10.11
✎
17:15
|
||||
9
Serginio1
18.10.11
✎
17:16
|
Наверное нужно использовать
dynamic connection = com1s.Connect("File='" + file + "';Usr='" + user + "';pwd='" + pas + "';"); |
|||
10
izekia
18.10.11
✎
17:28
|
(7) ээээ
кстати, что за тип "V82.COMConnector" делали обертку? |
|||
11
artprog
18.10.11
✎
17:28
|
вот фрагмент кода на VB, который создает документ.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click user = "БахшиевПИ (руководитель)" pas = "" file = TextBox1.Text com1s = CreateObject("V82.COMConnector") com1s.PoolCapacity = 10 com1s.PoolTimeout = 60 com1s.MaxConnections = 2 result = com1s.Connect("File='" + file + "';Usr='" + user + "';pwd='" + pas + "';") doc = result.Документы.РеализацияТоваровУслуг.СоздатьДокумент() doc.Дата = "20110819000000" doc.Записать() End Sub На c# пишу: { user = "БахшиевПИ (руководитель)"; pas = ""; file = textBox1.Text; Object result; Object doc; V82.COMConnector com1s = new V82.COMConnector(); com1s.PoolCapacity = 10; com1s.PoolTimeout = 60; com1s.MaxConnections = 2; result = com1s.Connect("File='" + file + "';Usr='" + user + "';pwd='" + pas + "';"); doc = result.Документы.РеализацияТоваровУслуг.СоздатьДокумент(); doc.Дата = "20110819000000"; doc.Записать(); label2.Text = "Операция выполнена"; } При этом он отвечает, что: "object" не содержит определения для "Документы" и не был найден метод расширения "Документы", принимающий тип "object" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку) |
|||
12
artprog
18.10.11
✎
17:30
|
(11) в VS2010 нажал добавить источники данных, объекты, выбрал Interop.V82
|
|||
13
izekia
18.10.11
✎
17:33
|
(12) а, дальше смотри примеры как с комом работать
у вб логика немного другая, код на шарпе будет сильно отличаться ... и по поводу комплюса, если не ошибаюсь - для этого определенный интерфейс должен быть реализован, уверен что 1С это сделала? |
|||
14
izekia
18.10.11
✎
17:40
|
и еще, по поводу частого обращения ... во первых ты можешь не закрывать соединение, во вторых еще в 8.1 у коннектора был пул соединений, так что взаимодействие с внешними подключениями вполне неплохо налажено
|
|||
15
Garykom
гуру
18.10.11
✎
17:46
|
(0) Часто лучше не из C# конненктится к 1С, а наоборот на 1С написать обработку для подключения к C# или там sql базе которую прога на C# юзает
В этом случае не нужна к примеру лишняя лицензия 1С и т.д. |
|||
16
izekia
18.10.11
✎
17:49
|
(15) с чего это? в этом случае начинаются проблемы с актуальностью текущих данных
|
|||
17
Serginio1
18.10.11
✎
17:49
|
А result надеюсь у тебя dynamic ?
|
|||
18
izekia
18.10.11
✎
17:51
|
(17) соединение есть в библиотеке типов
|
|||
19
Garykom
гуру
18.10.11
✎
17:51
|
(16) это каких актуальных данных?
|
|||
20
Serginio1
18.10.11
✎
17:51
|
Замени Object result на dynamic result, либо мучайся через рефлексию. Ичитай сообщения, что тебе пишут
|
|||
21
izekia
18.10.11
✎
17:52
|
(20) о, погоди, я с динамиком не работал, теперь можно вместо длинного инвока просто написать вызов через динамик и он подберет то что нужно?
|
|||
22
Serginio1
18.10.11
✎
17:54
|
(21) Да.
(0) Посмотри и расскажи нам http://www.enterra.ru/enterra-net-sdk-1s.html |
|||
23
izekia
18.10.11
✎
17:58
|
(22) прикольно, спасибо, не добрался еще до 4го
|
|||
24
artprog
18.10.11
✎
18:02
|
(20) Спасибо огромное!
Получилось :) Но сейчас у меня появятся еще вопросы) |
|||
25
artprog
18.10.11
✎
18:08
|
1. Документ создается только после перезапуска 1с. Почему?
2. Могу ли я просматривать com соединения с 1с? Постоянно ли оно? |
|||
26
Serginio1
18.10.11
✎
18:21
|
(25) А как определил, сто "Создается только после перезапуска"?
У COMConnector а пул соединений, т.е. Сом соединния не сбрасываются а хранятся в пуле (Это для Вэб сервисов актуально). Но методов просмотра нет. Сам огранизуй |
|||
27
artprog
18.10.11
✎
18:26
|
(26) ошибся. Создается с задержкой пару секунд.
Содержимое этого пула можно просмотреть? При новом вызове программы - будет подобрано предыдущее соединение или создано новое? |
|||
28
izekia
18.10.11
✎
18:28
|
(27) там есть таймаут, оно сколько-то висит в нем и потом только оно уничтожается
|
|||
29
Serginio1
18.10.11
✎
18:31
|
com1s.PoolCapacity = 10;
com1s.PoolTimeout = 60; com1s.MaxConnections = 2; Вот ты задал все данные. Пул равен 10, которые отлетают через 60 секунд если их не использовать,максимально 2 работающих соедиения . |
|||
30
artprog
18.10.11
✎
18:33
|
Вот проблема, которую мне нужно решить:
В данный момент проблема работы через COM - это долгое создание объекта. Если мы при запуске програмы будем создавать соединение с заданным свойством PoolTimeout скажем 60 секунд и раз в минуту будем инициировать обращение к соединению, то соединение будет моментальным. Следовательно необходимо: 1. Создать соединение 2. Сериализовать его и сохранить в переменную или массив, возможно во что-то другое, в php это обычно сессии 3. При повторном обращении если имеется текущее соединение то подключаемся к нему 4. Если в течении 50 секунд (при PoolTimeout = 60) не было обращений к базе то инициировать его, к примеру простым запросом: result.УправлениеСоединениямиИБ.ИмяCOMСоединителя() |
|||
31
Serginio1
18.10.11
✎
18:46
|
Ты вот Этот объект Сохрани
V82.COMConnector com1s = new V82.COMConnector(); PoolTimeout можешь задать и больше. У меня Вэб сервисы на 8.2, смотрю срок службы у них достаточно большой (правда и запросов тоже достаточно). И ничего. Зато они не будут сбрасываться, да и MaxConnections желательно иметь по количеству ядер. |
|||
32
artprog
18.10.11
✎
22:12
|
(31)
Почему эта операция (по созданию документа) под win 7 выполняется за секунду, а в XP документ появляется примерно через 7 секунд? |
|||
33
Serginio1
19.10.11
✎
12:15
|
Увы Не специалист по фаловым вариантам восьмерок.
|
|||
34
Serginio1
19.10.11
✎
12:16
|
Там даже антивирус может иметь значение.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |