|
v7: Не работает ВыбратьЭлементы через OLE. | ☑ | ||
---|---|---|---|---|
0
wraithik
12.07.11
✎
21:05
|
Вот код на шарпе:
[WebMethod] public НоменклатураКратко[] ПолучитьИнформациюОТоварах(string КодРодителя) { List<НоменклатураКратко> list = new List<НоменклатураКратко>(); ConnectTo1C(); dynamic СпрНоменклатура = Global.v7.CreateObject("Справочник.Номенклатура"); if (КодРодителя != "") { dynamic СпрРодитель = Global.v7.CreateObject("Справочник.Номенклатура"); СпрРодитель.НайтиПоКоду(КодРодителя); СпрНоменклатура.ИспользоватьРодителя(СпрРодитель); } СпрНоменклатура.ВыбратьЭлементы(); while (СпрНоменклатура.ПолучитьЭлемент() == 1) { НоменклатураКратко инфо = new НоменклатураКратко(); инфо.Код = СпрНоменклатура.Код; инфо.КодРодителя = СпрНоменклатура.Родитель.Код; инфо.Наименование = СпрНоменклатура.Наименование; инфо.ЭтоГруппа = СпрНоменклатура.ЭтоГруппа(); list.Add(инфо); } return list.ToArray(); } Вываливает на любом вызове метода СпрНоменклатура или СпрРодитель с ошибкой System.NotImplementedException: Метод или операция не реализована. Чего делать? |
|||
1
wraithik
12.07.11
✎
21:06
|
Global.v7 точно с 1Ской, т.к. другой сервис дергающий функцию из глобального модуля пашет на ура.
|
|||
2
wraithik
12.07.11
✎
21:09
|
вот пример с мисты:
Б) Доступ к справочникам и документам базы OLE (через функцию "CreateObject"): СпрOLE = БазаОле.CreateObject("Справочник.Фирмы"); // "СоздатьОбъект" в OLE не работает! ДокOLE = БазаОле.CreateObject("Документ.РасходнаяНакладная"); После создания объекта справочника или документа к ним применимы все методы, касающиеся таких объектов в 1С: СпрОле.ВыбратьЭлементы(); Пока СпрОле.ПолучитьЭлемент()=1 Цикл Сообщить(Спр.Наименование); КонецЦикла; Вроде все так же делаю, а не пашет :( |
|||
3
andrewks
12.07.11
✎
21:10
|
СпрНоменклатура.ИспользоватьРодителя(СпрРодитель); выполняется нормально?
|
|||
4
wraithik
12.07.11
✎
21:14
|
нет
так тоже пробовал: СпрРодитель.FindByCode(КодРодителя); |
|||
5
wraithik
12.07.11
✎
21:14
|
не выполняется не один метод по справочникам.
|
|||
6
Темный Эльф
12.07.11
✎
21:25
|
А если, скажем, попробовать англоязычный вариант написания?
|
|||
7
andrewks
12.07.11
✎
21:26
|
объекты окромя справочников пробовал?
|
|||
8
wraithik
12.07.11
✎
21:31
|
(6)
ConnectTo1C(); dynamic spr = Global.v7.CreateObject("Справочник.Номенклатура"); if (КодРодителя != "") { dynamic sprparent = Global.v7.CreateObject("Справочник.Номенклатура"); sprparent.FindByCode(КодРодителя); spr.UseParent(sprparent); } Не пашет. На FindByCode отваливается. |
|||
9
GreyK
12.07.11
✎
21:32
|
(0) Так попробуй:
Global.v7.EvalExpr("СоздатьОбъект(""""Справочник.Номенклатура""""); |
|||
10
wraithik
12.07.11
✎
21:38
|
так работает
string test = Global.v7.EvalExpr("Константа.НомерРелиза"); так не работает string test = Global.v7.Константа.НомерРелиза; (9) у меня объекты создаются. проблемы дальше при вызове методов справочников. |
|||
11
wraithik
12.07.11
✎
21:39
|
так тоже не работает:
dynamic spr = Global.v7.EvalExpr("CreateObject(\"Справочник.Номенклатура\")"); spr.SelectItems(); Вылетает на второй строке. |
|||
12
GreyK
12.07.11
✎
21:43
|
(10) Строчка: "В ОЛЕ передаются только баззовые типы данных" тебе о чем-нибудь говорит, может где-нибудь видел такую?
|
|||
13
andrewks
12.07.11
✎
21:44
|
(12) а где он не-базовые передаёт? строки только вижу
|
|||
14
wraithik
12.07.11
✎
21:47
|
(13) я еще справочники гоняю.
Их нельзя что ли? Список значений или таблицу вынуть то можно хоть? |
|||
15
GreyK
12.07.11
✎
21:47
|
(13) "СоздатьОбъект"
|
|||
16
GreyK
12.07.11
✎
21:48
|
(14) Разрешаю :)
|
|||
17
wraithik
12.07.11
✎
21:49
|
(12)
А откуда сия строчка? через ОЛЕ можно гонять вообще что угодно. Через вэб - только то что умеет сериализоваться. |
|||
18
skunk
12.07.11
✎
21:50
|
||||
19
andrewks
12.07.11
✎
21:50
|
(15) чо за бред?
|
|||
20
GreyK
12.07.11
✎
21:51
|
+(16) Если сумеешь засунуть в 7.7 список или таблицу, то и вытащить сможешь*)
|
|||
21
andrewks
12.07.11
✎
21:55
|
в шарпе обязательно типизировать переменную?
|
|||
22
Cthulhu
12.07.11
✎
21:56
|
трабла походже "на этой стороне".
"не держит" дайнамик-переменная ссылку на оле-объект (или как-то криво держит). а попробуй в глобальнике оле в элемент массива-глоб.переменной помещать ссылку на созданный в оле-контексте же объект, и с ней прямо в оле-контексте шаманить... мож поможет?.. |
|||
23
wraithik
12.07.11
✎
21:57
|
(18)
objFirm = OLEServer.createobject("reference.Фирмы"); // откроем в нем выборку... objFirm.SelectItems(); // пока что то есть в ней... выбираем while objFirm.GetItem() > 0 do // и добавляем в наш список... код (полный) и наименование... // так как иначе не поймем... где есть какая фирма... vlFirm.AddValue(objFirm.FullCode(), objFirm.Description); enddo; Ну я так же делаю :( |
|||
24
wraithik
12.07.11
✎
21:58
|
(21)
обязательно dynamic - тип позднего связывания, короче читай вариант или не типизированный. |
|||
25
wraithik
12.07.11
✎
21:59
|
(22) не фига не понял :)
с глобального контекста все пашет. |
|||
26
GreyK
12.07.11
✎
21:59
|
(19) Ну давай рассказывай, про то как космич.., и тихонечко переходи к тому как саздать в 7ке объект. Может ты уже нарыл способ без передачи текста типа ".EvalExpr("CreateObject(" а я тут со стрыми правилами лезу.
|
|||
27
andrewks
12.07.11
✎
22:00
|
(23) у тебя динамик есть в определении типа
|
|||
28
skunk
12.07.11
✎
22:01
|
нет ... ты пробуешь перед выборкой заюзать родителя ...
|
|||
29
andrewks
12.07.11
✎
22:01
|
(24) а object нельзя указать?
|
|||
30
Cthulhu
12.07.11
✎
22:01
|
(24): о!
может в этом проблема. отложенное то связывание - оно нетипизированное до тех пор, пока... а как только - так и приводится, теряя что не надо бы терять... (25): в ОЛЕ-контексте глоб.переменная-массив. элементу этого массива присваивай СоздатьОбъект(..) и т.д.. |
|||
31
wraithik
12.07.11
✎
22:04
|
dynamic list1c = Global.v7.OLE_ВернутьСписокСправочника(КодРодителя);
int list1cSize = list1c.РазмерСписка(); тоже не пашет :( |
|||
32
wraithik
12.07.11
✎
22:12
|
(30)
там связывание вообще не работает, оно через IDispatch или отработает или ошибку кинет. |
|||
33
GreyK
12.07.11
✎
22:13
|
(31) Это что: "OLE_ВернутьСписокСправочника(КодРодителя);"?
Продам СП, недорого... |
|||
34
wraithik
12.07.11
✎
22:35
|
(33)
Хватит нести чушь! вот так заработало: Type v7Type = Type.GetTypeFromProgID("V77.Application", true); object v7 = Activator.CreateInstance(v7Type); string connectionString = "ля-ля-ля"; Object[] arg = new Object[3]; arg[0] = v7.GetType().InvokeMember(@"RMTrade", BindingFlags.Public | BindingFlags.InvokeMethod, null, v7, null); arg[1] = connectionString; Boolean OK = (Boolean)v7.GetType().InvokeMember(@"Initialize", BindingFlags.Public | BindingFlags.InvokeMethod, null, v7, arg); |
|||
35
wraithik
12.07.11
✎
22:37
|
ну и дальше в таком духе
писец как не удобно, но пашет юзал вот этот пример: http://antirius.org/develop1c/addin/1CfromCSharpOverCOM Автору большое спасибо. Да еще и инфостарт лежит :( |
|||
36
wraithik
13.07.11
✎
23:46
|
Вопрос:
можно как нить это (http://antirius.org/develop1c/addin/1CfromCSharpOverCOM) добавить в статью про OLE на Мисте? |
|||
37
andrewks
14.07.11
✎
08:14
|
(36) а смысл? чё там вкусного, чего нет на мисте?
|
|||
38
wraithik
14.07.11
✎
11:04
|
(37)
Там вкусное одно: как с C# лезть в 1С. Я до этого лазил через OLE но с 1С 7/8, и механизм был отлажен. А здесь пришлось веб-сервис для 7-ки писать, и выбрал C# для этого и наткнулся на проблемы. Короче, с Шарпа нельзя лезть через dynamic, а надо вручную дергать интерфейс COM-объекта 1Ски. Этого на Мисте я не нашел. Я думаю разница в коде видна не вооруженным глазом. Поэтому предлагаю расширить статью примером того, как надо лезть в 1С из Шарпа. |
|||
39
andrewks
14.07.11
✎
11:06
|
(38) я так понял, нет разницы в коде, нужно типизацию переменной делать правильно, как я и предложил в (29).
или не так? |
|||
40
wraithik
14.07.11
✎
22:05
|
(39) Не так.
Качни по ссылке и глянь CSник. Там механизм вызова методов другой. Все делает через InovokeMember, а не через позднее связывание. Если честно, то позднее связывание тоже должно пахать через InovokeMember, но в шарпе оно почему то так не взлетает :( |
|||
41
Torquader
16.07.11
✎
22:58
|
В 1С прекрасно лазится на VBScript или даже через объекты в PHP!
|
|||
42
1Сергей
18.07.11
✎
10:42
|
(0)
СпрНоменклатура.ИспользоватьРодителя(СпрРодитель.ТекущийЭлемент()); |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |