|
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 |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |