Имя: Пароль:
1C
1С v8
Доступ 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
Там даже антивирус может иметь значение.