Имя: Пароль:
1C
1C 7.7
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)
СпрНоменклатура.ИспользоватьРодителя(СпрРодитель.ТекущийЭлемент());