Имя: Пароль:
1C
1С v8
1С 8 Внешние компоненты
,
0 radiks
 
11.02.13
19:59
Есть DLL, она загружается в 1С методом "Загрузить внешнюю компоненту".
Вопрос: как из DLL обратиться к объектам 1С (например, выполнить запрос и вернуть результат, перебрать элементы справочника ...)?
1 ДенисЧ
 
11.02.13
20:04
документацию прочитать - не предлагать?
2 radiks
 
11.02.13
20:06
Я разобрался с COM, но не создавать же COM-подключение из Длл-ки... Как использовать существующее?
4 Rie
 
11.02.13
20:08
(2) "документацию прочитать - не предлагать?"  (c) ДенисЧ
5 radiks
 
11.02.13
20:09
Лучше пример :)
6 radiks
 
11.02.13
20:09
object query = oType.InvokeMember("NewObject", BindingFlags.Public | BindingFlags.InvokeMethod, null, connection, new object[] { "Query" });
               oType.InvokeMember("Текст", BindingFlags.Public | BindingFlags.SetProperty, null, query, new object[] { "ВЫБРАТЬ РеализацияТоваровУслуг.Дата, РеализацияТоваровУслуг.Номер, РеализацияТоваровУслуг.СуммаДокумента ИЗ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг ГДЕ РеализацияТоваровУслуг.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&Дата1, ДЕНЬ) И КОНЕЦПЕРИОДА(&Дата2, ДЕНЬ)" });
               oType.InvokeMember("УстановитьПараметр", BindingFlags.Public | BindingFlags.InvokeMethod, null, query, new object[] { "Дата1", new DateTime(2013, 1, 1, 0, 0, 0) });
               oType.InvokeMember("УстановитьПараметр", BindingFlags.Public | BindingFlags.InvokeMethod, null, query, new object[] { "Дата2", new DateTime(2013, 3, 31, 0, 0, 0) });
               object queryResult = oType.InvokeMember("Выполнить", BindingFlags.Public | BindingFlags.InvokeMethod, null, query, new object[] { });
               object queryResultSelection = oType.InvokeMember("Выбрать", BindingFlags.Public | BindingFlags.InvokeMethod, null, queryResult, new object[] { });
               StringBuilder sb = new StringBuilder();
               while ((bool)oType.InvokeMember("Следующий", BindingFlags.Public | BindingFlags.InvokeMethod, null, queryResultSelection, new object[] { }))
               {
                   object field_date = oType.InvokeMember("Дата", BindingFlags.Public | BindingFlags.GetProperty, null, queryResultSelection, new object[] { });
                   object field_num = oType.InvokeMember("Номер", BindingFlags.Public | BindingFlags.GetProperty, null, queryResultSelection, new object[] { });
                   object field_sum = oType.InvokeMember("СуммаДокумента", BindingFlags.Public | BindingFlags.GetProperty, null, queryResultSelection, new object[] { });
                   sb.Length = 0;
                   sb.Append("Дата:");
                   sb.Append(field_date);
                   sb.Append(",\t№ ");
                   sb.Append(field_num);
                   sb.Append("\t - ");
                   sb.Append(field_sum);
                   
//                    V7Data.StatusLine.SetStatusLine(sb.ToString());
//                    System.Threading.Thread.Sleep(1000); //Делаем паузу 1 сек
//                    V7Data.StatusLine.ResetStatusLine();



               }
7 radiks
 
11.02.13
20:10
вместо connection что подставить?
8 Rie
 
11.02.13
20:13
(5) Когда метод Init реализуешь - у него ж там параметр имеется. Угадай, зачем?
9 HeroShima
 
11.02.13
20:48
Кстати, что нужно сделать, чтобы использовать русскоязычную лексику? Ругается на not implemented
10 HeroShima
 
11.02.13
20:56
(9) вижу) вопрос снят
11 HeroShima
 
11.02.13
21:16
(6) ужас какой
12 radiks
 
11.02.13
21:20
спасибо, дошло... :)
вопрос закрыт
13 HeroShima
 
11.02.13
21:36
Как начнет зависать, приходи)
14 HeroShima
 
12.02.13
11:39
15 HeroShima
 
12.02.13
13:09
with UseAppDispatchProxy(self.Enterprise) as ad:
   with UseNewObjectsProxy(self.Enterprise, u'Справочник.МойСправочник', u'ТаблицаЗначений') as (ref, tv):
       ref.ВыбратьЭлементы(1)
       ref.ПолучитьЭлемент()
       a = ref.property.Код
       b = ref.property.Наименование

как вам этот poc?
16 radiks
 
12.02.13
13:23
(15) Спасибо :)
Сам сейчас только читаю про dynamic.
Не пойму теперь, как его применить в DLL
17 orefkov
 
12.02.13
13:28
(6)
Сразу видно настоящего прога, а не примитивного одинэсника.
Монументально все так, энтерпрайзненько!
18 HeroShima
 
12.02.13
13:28
(16) честно говоря, не совсем понимаю что значит dynamic в текущем контексте разговора)
19 radiks
 
12.02.13
16:28
(18) Значит то, как избавиться от полохо читаемого кода с Invoke...
21 Rie
 
12.02.13
18:53
(19) dynamic - оно, конечно... Но это несколько из другой оперы.
"Другой юноша нес свое: "Я нашел, как применить здесь нестирающиеся шины из полиструктурного волокна с вырожденными аминными связями и неполными кислородными группами. Но я не знаю пока, как использовать регенерирующий реактор на субтепловых нейтронах. Миша, Мишок! Как быть с реактором?" Присмотревшись к устройству, я без труда узнал велосипед"
22 radiks
 
12.02.13
19:07
(21) Много слов...
Спасибо, конечно, за подсказку в (8), может подскажешь тогда как получить существующее подключение 1С из dll с использование dynamic?
23 Rie
 
12.02.13
19:12
(22) Сначала хотелось бы понять, зачем тут dynamic :-)
Он ведь всего лишь переносит контроль типов со времени компиляции на время исполнения, не более того.
Не лучше ли сделать обёртку над 1С-овскими данными? Читаемость будет, а извращаться с dynamic не придётся.
24 radiks
 
12.02.13
19:27
Да хотя бы за тем, что можно работать с разными типами в одной переменной, тип будет определяться во время выполнения и код становится более читабельным. Совсем не изврат...
25 radiks
 
12.02.13
19:31
Можно, конечно и по старинке писать, но, если есть net.4 почему не использовать новые возможности???
26 Rie
 
12.02.13
19:43
(24) Чтобы использовать новые возможности - нужно для начала знать, что это за возможности.
Погляди, например, на http://habrahabr.ru/post/144330/
27 Rie
 
12.02.13
19:47
+(26) Кроме всего прочего, с точки зрения C#, нет никаких типов СправочникОбъект.Номенклатура или ПеречислениеСсылка.ВРотМнеНоги. 1С отдаёт для всех своих объектов один-единственный интерфейс.
28 HeroShima
 
12.02.13
19:51
Для типов может и object хватить, а полиморфизма dynamic вряд ли добавит.
29 Rie
 
12.02.13
19:58
Кроме всего прочего - никто никому не гарантировал в данном случае, что какие-то _методы_ у 1С-объектов вообще существуют :-)
30 radiks
 
12.02.13
20:16
(26) Глядел уже. Мне не понятно как с использованием dynamic получить текущее соединение 1с. С подключением к COM - понятно, а из dll - нет...
31 HeroShima
 
12.02.13
20:16
Если в C# это удастся обыграть так же красиво как в Питоне, будет очень интересно взглянуть.
32 Rie
 
13.02.13
05:08
Что касается красоты кода - никак не пойму, чем (безо всяких dymanic)

Контрагент["Наименование"] = "Вася Пупкин";
Сообщить(Контрагент["ИНН"]);
v8["Справочники"]["Контрагенты"].Call("НайтиПоКоду","123456789");

сильно хуже

Контрагент.Наименование = "Вася Пупкин";
Сообщить(Контрагент.ИНН);
v8.Справочники.Контрагенты.НайтиПоКоду("123456789");
33 Rie
 
13.02.13
05:11
(30) Но если очень хочется динамических объектов - то создай свой класс - наследник DynamicObject, а в его конструктор - передай то самое соединение , которое получил от 1С при вызове. Вернее, передавай тот IDispatch, который даёт доступ к соответствующему 1Совскому объекту. И будет счастье.
34 HeroShima
 
18.02.13
13:25
Рабочий код - аналог кода из учебника по внешним компонентам КЗ:
http://pastebin.com/YSpbu2My
Закон Брукера: Даже маленькая практика стоит большой теории.