|
v7: API IE из 1с 7.7 | ☑ | ||
---|---|---|---|---|
0
DES
21.09.14
✎
17:52
|
имеется страница sefsdfsdf.aspx
в ней код: <INPUT id=Agreement1_AccesServiceBtn type=submit value="Сервис" name=Agreement1$AccesServiceBtn metrikaId_0.5311905="29"> делаю: objIE = createObject("InternetExplorer.Application"); жду загрузки страницы и т.д. ( на других страницах работало) выполняю: objDoc.getElementById("Agreement1_AccesServiceBtn").Submit(); 1C отвечает objDoc.getElementById("EFactura_Agreement1_AccesServiceBtn").Submit(); {Документ.Накладная.Форма.Модуль(2981)}: Поле агрегатного объекта не обнаружено (Submit) почему так ? раньше на других страницах вроде бы этот код работал. |
|||
1
Рэйв
21.09.14
✎
17:56
|
попробуй сначала переменной присвоить.
|
|||
2
Wobland
21.09.14
✎
17:57
|
а что такое objDoc.getElementById("EFactura_Agreement1_AccesServiceBtn")?
|
|||
3
Рэйв
21.09.14
✎
17:58
|
(2)Ну разве не понятно? - getElementById.
Тут же все предельно ясно:-) |
|||
4
DES
21.09.14
✎
17:59
|
(2) нажимаю на кнопку по Id
|
|||
5
Wobland
21.09.14
✎
18:00
|
(3) неа, не понятно ;)
(4) ответ на вопрос "что?" - нажимаю? |
|||
6
DES
21.09.14
✎
18:01
|
(1) Кнопка.Submit();
тоже самое, ошибку дает ту же. |
|||
7
Wobland
21.09.14
✎
18:02
|
(6) ну не умеет кнопка субмит, что поделать
|
|||
8
DES
21.09.14
✎
18:02
|
(5) да, ответ на вопрос "что?"
Действие. |
|||
9
Wobland
21.09.14
✎
18:03
|
(8) я ожидал элемент
|
|||
10
Wobland
21.09.14
✎
18:03
|
(9) ну или неопределену ;)
|
|||
11
DES
21.09.14
✎
18:04
|
(8) в атрибутах кнопка.type = отвечает submit
|
|||
12
Wobland
21.09.14
✎
18:04
|
показывай код для EFactura_Agreement1_AccesServiceBtn
|
|||
13
Рэйв
21.09.14
✎
18:06
|
(6)Чег ты такой непонятливывй?
МойКрутойБуфер=objDoc.getElementById("EFactura_Agreement1_AccesServiceBtn"); МойКрутойБуфер.Submit(); попробуй, я это имел в виду |
|||
14
Рэйв
21.09.14
✎
18:07
|
а там смотри на чем валится. На получении или на .Submit()
|
|||
15
Wobland
21.09.14
✎
18:07
|
(13) ну он и сделал так, только с Кнопка, как я понял
|
|||
16
DES
21.09.14
✎
18:08
|
(13) если тв не понял, то я сделал так
Кнопка=objDoc.getElementById("EFactura_Agreement1_AccesServiceBtn"); Кнопка.Submit(); |
|||
17
Рэйв
21.09.14
✎
18:08
|
(15)Подождем результатов от подопытного.
|
|||
18
Рэйв
21.09.14
✎
18:08
|
(16)И на какой строке свалилось?
|
|||
19
DES
21.09.14
✎
18:09
|
(14) все получает и показывает атрибуты. наме,ид,тип
|
|||
20
DES
21.09.14
✎
18:09
|
(18) ну конечно на той где submit()
|
|||
21
Рэйв
21.09.14
✎
18:10
|
(19)если все методы кроме Submit() работают, создается очучение что у тебя что-то устарело в системе.
|
|||
22
DES
21.09.14
✎
18:10
|
(12) а вот не знаю как
|
|||
23
Wobland
21.09.14
✎
18:10
|
(22) с Agreement1_AccesServiceBtn справился, а тут не знаешь?
|
|||
24
DES
21.09.14
✎
18:18
|
(23) по каким словам искать ?
|
|||
25
Рэйв
21.09.14
✎
18:19
|
(24)Я бы сказал по каким, но раз ты меня игнорируешь, то я лучше понаблюдаю:-)
|
|||
26
DES
21.09.14
✎
18:20
|
вот такую фигню нарыл:
<SCRIPT type=text/javascript> //<![CDATA[ function WebForm_OnSubmit() { null;if (typeof(ValidatorOnSubmit) == "function" && ValidatorOnSubmit() == false) return false; return true; } //]]> </SCRIPT> |
|||
27
DES
21.09.14
✎
18:22
|
(25) не обижайся
|
|||
28
DES
21.09.14
✎
18:36
|
что все ?
|
|||
29
DES
21.09.14
✎
18:36
|
У них сделана защита от робота ?
|
|||
30
DES
21.09.14
✎
21:01
|
submit = function(){s({target:this});return this[Ua]()}
|
|||
31
DES
22.09.14
✎
21:39
|
ну есть еще мысли ?
|
|||
32
akaBrr
22.09.14
✎
22:35
|
Значит путем экспериментов выяснилось, что управлять нормально DOM напрямую из 1С нельзя, из MSScriptControl.ScriptControl получше но полноценно тоже нельзя, из javascript внутри HTML-документа (или приаттаченого) - управляется практически полноценно. Об этом свидетельствовали веб-страницы с активным содержимым, которые загружались и работали без проблем.
http://www.1cpp.ru/forum/YaBB.pl?num=1316457428 |
|||
33
Torquader
23.09.14
✎
10:09
|
(32) Управлять можно всем, особенно, если на низком уровне и через SendMessage.
Просто, когда вы работаете из другого процесса, то нужно понимать, что сам "осёл" в это время может что-то выполнять, и нужно дожидаться завершения выполнения, а в случае работы Ajax ловить моменты обработки получения данных, так как исполнение из двух источников приводит к тому, что данные накладываются. Также нужно понимать, что передача значений и объектов между границами процесса идёт криво, что для javascript заканчивается отсутствием правильной сборки мусора и окончанием памяти. |
|||
34
Torquader
23.09.14
✎
10:11
|
Потом, не стоит забывать, что из 1С работа с IE вообще идёт параллельно - у меня, например, в IE запускается бесконечный цикл, который ждёт изменение переменной, которая меняется командой из 1С, и всё работает.
Если так делать из MsScriptControl, то там мешает синхронизация - сценарий MsScript может вклиниваться в работу IE только тогда, когда IE не выполняет никакого кода. |
|||
35
DES
24.09.14
✎
22:13
|
давал задержку циклом 1000000 перед нажатием кнопки, но ошибку дает 1С все равно.
|
|||
36
DES
24.09.14
✎
23:33
|
подскажите, как после этого нажать кнопочку ?
Браузер=СоздатьОбъект("АктивИкс"); Браузер.УстановитьАтрибут(Форма,"HTML"); Браузер.СоздатьЭУ("Shell.Explorer.2"); Браузер.ОбработкаСобытий = 1; Браузер.Объект.Navigate("http://sfsfsfs.spx"); (знаю её id) |
|||
37
Vladal
25.09.14
✎
00:13
|
Браузер.Объект.Click
|
|||
38
DES
25.09.14
✎
00:14
|
почему дает ошибку на последней строке ?
Браузер=СоздатьОбъект("АктивИкс"); Браузер.УстановитьАтрибут(Форма,"HTML"); Браузер.СоздатьЭУ("Shell.Explorer.2"); Браузер.ОбработкаСобытий = 1; Браузер.Объект.Navigate2(ИмяХТМЛ); ДокХТМЛ=Браузер.Объект.Document; |
|||
39
Vladal
25.09.14
✎
00:14
|
А в отладчике что пишет Браузер.Объект.Document?
|
|||
40
Vladal
25.09.14
✎
00:15
|
Ну да.. это 7.7... Пишет OLE-объект
|
|||
41
Vladal
25.09.14
✎
00:15
|
А есть у тебя книга "Системное программирование в 1С:Предприятие"?
|
|||
42
DES
25.09.14
✎
00:19
|
(40) пишет плохой тип переменной, книги нет
|
|||
43
Vladal
25.09.14
✎
00:20
|
Вот пример из книги.Глянь, что не так с .Document
objIE = СоздатьОбъект("InternetExplorer.Application"); objIE.Visible = 0; objIE.Silent = 0; objIE.Navigate(Адрес); Пока objIE.readyState<4 Цикл // Ждем пока она загрузится КонецЦикла; obj Doc = objIE.Document; AllTags = objDoc.all.tags("A"); // Получаем всю коллекцию ссылок Для Ном = 0 По AllTags.length-1 Цикл Сообщить(AllTags.item(Ном).href); КонецЦикла; objIE.Quit(); // Закрываем приложение objIE = ""; |
|||
44
Vladal
25.09.14
✎
00:21
|
*obj Doc = objIE.Document;
objDoc = objIE.Document; -- без пробела |
|||
45
DES
25.09.14
✎
00:24
|
через InternetExplorer.Application у меня кнопка не нажимается, я пытаюсь обходными путями.
|
|||
46
Vladal
25.09.14
✎
00:50
|
||||
47
Vladal
25.09.14
✎
01:09
|
Зная ID кнопки, можно вызвать её событие клика по ID.
Можно и перебрать, как я приводил пример из книжки выше. Вот еще пример: var e: helem; begin e:=Webbrowser1.getElementById('input-button', 'submit'); e.onclick:=CreateHTMLEvent(e,HtmlEventForm); end; http://www.cyberforum.ru/delphi-networks/thread782432.html http://www.cyberforum.ru/delphi-beginners/thread642345.html |
|||
48
Serginio1
27.09.14
✎
11:30
|
(0) Что то в тему не могу 1c 7.7 и ASP.NET ответить
загрузи этот фреймворк на клиенте http://www.microsoft.com/ru-ru/download/details.aspx?id=40779 |
|||
49
DES
27.09.14
✎
15:11
|
спс, взлетело
|
|||
50
Serginio1
28.09.14
✎
10:22
|
В эту ветку отвечу. Для начала хоть немного изучить C#.
Если нет VS то попросить кого нибудь скомпилировать, да и вообще помочь в коде. У меня VS на работе |
|||
51
DES
28.09.14
✎
10:26
|
Вас из дас VS?
|
|||
52
Serginio1
28.09.14
✎
10:31
|
(51) Visual Studio
|
|||
53
DES
28.09.14
✎
10:32
|
Эти ребята, из MD. предлагают самостоятельно компильнуть библиотеку для возможности доступа к ним по API посредством этого их мануала? Я правильно понял?
|
|||
54
Serginio1
28.09.14
✎
10:39
|
Я про ребят из MD. Если у тебя есть возможность то проси их. Если есть кто то кто программирует на C# проси их.
|
|||
55
DES
28.09.14
✎
10:46
|
Они не "спрашиваемые".
|
|||
56
DES
28.09.14
✎
10:47
|
По телефону говорят пишите письма, на письма не отвечают.
|
|||
57
Serginio1
28.09.14
✎
10:52
|
(58) Стоит самому изучить потратить время. Там все просто, но нужны знания
|
|||
58
DES
28.09.14
✎
11:18
|
Я 25 лет трачу на это время. Я понимаю что все просто. Просто всего много.
|
|||
59
Serginio1
28.09.14
✎
11:30
|
(58) Знание C# и .Net тебе в любом случае пригодится. Сейчас не знать C# просто уже неприлично. Ты больше тратишь время на помощь итд. Мне 50 и я все учусь и учусь.
|
|||
60
DES
28.09.14
✎
16:09
|
какой проект мне делать в VS ? библтотека классов?
|
|||
61
Serginio1
28.09.14
✎
16:14
|
Для теста сделай WinForms оттестируй, а затем уже создавай DLL. Если у тебя нет знакомых программирующих на C#, то скину в понедельник. А вообще смотри примеры
|
|||
62
DES
28.09.14
✎
16:35
|
а где в VS примеры?
|
|||
63
Serginio1
28.09.14
✎
17:03
|
В папках TestWebServices
ЗагрузкаCOMОбъектаБезРегистрации ОбменПоTCPIP ПроектИспользованияДелегатов |
|||
64
Serginio1
28.09.14
✎
17:05
|
NestNet45
|
|||
65
DES
28.09.14
✎
17:19
|
тот файл что вчера сгенерился похож по структуре с netmet45.
как из него сгенерить dll ? |
|||
66
Serginio1
28.09.14
✎
17:40
|
Сейчас студии нет под рукой
Файл->Новый проект->Библиотека классов (DLL) Проэкт тобавить существующий элемент выбираем описание. http://msdn.microsoft.com/ru-ru/library/vstudio/tydxdyw9(v=vs.100).aspx |
|||
67
DES
28.09.14
✎
17:48
|
netnet45 на каком языке ? С++ или c#
|
|||
68
Serginio1
28.09.14
✎
17:56
|
Расширение файла .cs говорит о том, что это C#
|
|||
69
DES
28.09.14
✎
18:14
|
я в vs2013.
загрузил проект ОбменПоTCPIP ни одного окна не открылось. как открыть окно кода? |
|||
70
Serginio1
28.09.14
✎
18:19
|
Справа выбери файл. Тяжело объяснять без VS. Посмотри в гугле программирование на C#
|
|||
71
DES
28.09.14
✎
18:23
|
есть время? через скайп экран покажу.
|
|||
72
Serginio1
28.09.14
✎
18:36
|
Давай завтра. Хоть немногопочитай
|
|||
73
DES
28.09.14
✎
18:44
|
да бесполезно хоть немного читать. мне компльнуть нада да и все
|
|||
74
Serginio1
28.09.14
✎
18:56
|
Вот и копни как создать DLL, как добавить ссылку на Вэб сервис
например http://msdn.microsoft.com/ru-ru/library/dd492132.aspx |
|||
75
DES
28.09.14
✎
19:06
|
(74) это я по интуиции сделал за 4 сек.
|
|||
76
DES
28.09.14
✎
19:23
|
Лан, спс.
|
|||
77
Serginio1
28.09.14
✎
19:33
|
||||
78
DES
28.09.14
✎
20:34
|
вот за это отдельное спс
|
|||
79
Serginio1
28.09.14
✎
20:44
|
Дальше будешь разбираться с конфигурационными файлами.
Для 1С они должны быть в папке запускаемого приложения с расширением Имяприложения.exe.Config либо модно использовать конигурационный файл для конкретной dll v8: v8: Использование сборок .NET в 1С 7.x и 8.x |
|||
80
DES
28.09.14
✎
20:57
|
что те пойму, как будет выглядеть
врап = СоздатьОбъект("EFacturaApiRef"); какую строку задавать ? |
|||
81
DES
28.09.14
✎
20:59
|
как понять "папке запускаемого приложения" ?
какого приложения? |
|||
82
DES
28.09.14
✎
21:11
|
о понял, но у меня в C:\Program Files\1Cv77\BIN
есть огроменный 1cv7.exe.config |
|||
83
Serginio1
28.09.14
✎
21:17
|
А ты смотри какой тип и пространство имен
AX.EFactura.Model.ApiModel.ServiceClient Но если ты загружаешь без конфиг файла то нужно указать биндинг и ServiceClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) |
|||
84
DES
28.09.14
✎
21:21
|
(83) ничего не понял.
ты спросил или ответил ? |
|||
85
Serginio1
28.09.14
✎
21:22
|
Типа такого
типСервера=Сборка.GetType("AX.EFactura.Model.ApiModel.ServiceClient"); remoteAddress =врап.СоздатьОбъект("System.ServiceModel.EndpointAddress", врап.СоздатьОбъект("System.Uri","https://api-test.fisc.md/Service.svc); привязка = врап.СоздатьОбъект("System.ServiceModel.BasicHttpBinding"); сервер=врап.СоздатьОбъект(типСервера,привязка,remoteAddress); |
|||
86
Serginio1
28.09.14
✎
21:24
|
Ответил. Расмешил. Говорю немного почитай про предметную область
|
|||
87
DES
28.09.14
✎
21:28
|
смотри, в мануале пишут такое
Code sample for calling method: private EFacturaApiRef.ServiceClient _client; _client = new EFacturaApiRef.ServiceClient(); _client.ClientCredentials.UserName.UserName = "supplier"; _client.ClientCredentials.UserName.Password = "supplier"; это как то соотносится с тем о чем я говорю ? |
|||
88
DES
28.09.14
✎
21:44
|
типСервера=Сборка.GetType("AX.EFactura.Model.ApiModel.ServiceClient");
тут не понимаю что за "сборка" |
|||
89
Serginio1
28.09.14
✎
21:50
|
Ты смотри в каком у тебя пространстве имен находится ServiceClient
То, что сформировал svcutil.exe https://api-test.fisc.md/Service.svc?wsdl то ServiceClient находится в пространстве имен namespace AX.EFactura.Model.ApiModel Сборка это Сборка=врап.загрузитьСборку(ИмяФайла); где имяфайла это dll в которой есть тип ServiceClient |
|||
90
DES
28.09.14
✎
21:52
|
Сборка=врап.загрузитьСборку(ИмяФайла);
я врап не могу создать |
|||
91
DES
28.09.14
✎
21:54
|
я действую по аналогии
врап = СоздатьОбъект("NetObjectToIDispatch45"); врап.УстЭтоСемерка(); (вчера почту гоняли ) |
|||
92
DES
28.09.14
✎
22:01
|
объясни механизм вызова функции из 1с.
получается что сборка добавляет функцию к системе, а 1с обращается к системе и посредством системы получает результат ? тогда что ты имеешь ввиду когда говоришь о какой то загрузке сборки ? |
|||
93
DES
28.09.14
✎
22:12
|
сделал
врап = СоздатьОбъект("NetObjectToIDispatch45"); врап.УстЭтоСемерка(); ИмяФайла = "C:\DLLNetObjetToIDispatch45\ServiceEfactura.dll"; Сборка = врап.загрузитьСборку(ИмяФайла); типСервера = Сборка.GetType("AX.EFactura.Model.ApiModel.ServiceClient"); типСервера - пусто |
|||
94
Serginio1
28.09.14
✎
22:12
|
Ты бы статью почитал. Нельзя так наскоком.
Когда мы работали с почтой. То тип System.Net.Mail.SmtpClient находится в сборке System.dll находящейся в Global Assembly Cache (GAC) и её система находит. О твоей сборке система ничего не знает. Поэтому её нужно загрузить. Либо во врайпере есть метод ПолучитьТип(string type, string путь) |
|||
95
DES
28.09.14
✎
22:13
|
я же ее в систему зарегал
|
|||
96
Serginio1
28.09.14
✎
22:14
|
А какое пространство имен у тебя?
Смотри namespace |
|||
97
DES
28.09.14
✎
22:14
|
я не знаю где смотреть
|
|||
98
Serginio1
28.09.14
✎
22:17
|
Ты зарегал NetObjetToIDispatch45.dll
Это просто оболочка реализующая IReflеct и можно достучаться к объектам Net через IDispatch Почитай v8: v8: Использование сборок .NET в 1С 7.x и 8.x |
|||
99
Serginio1
28.09.14
✎
22:17
|
(97) Ты создал DLL?
|
|||
100
DES
28.09.14
✎
22:17
|
да читал я, там китайская грамота
|
|||
101
DES
28.09.14
✎
22:18
|
создал dll
с помощь регистратора сделал командную строку, зарегал |
|||
102
DES
28.09.14
✎
22:20
|
C:\Users\SH>C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe "C:\DLLNetO
bjetToIDispatch45\ServiceEfactura.dll" /codebase Microsoft .NET Framework Assembly Registration Utility 4.0.30319.18408 для Microsoft .NET Framework 4.0.30319.18408 (C) Корпорация Майкрософт (Microsoft Corporation). Все права защищены. RegAsm : warning RA0000 : Регистрация неподписанной сборки с использованием пара метра /codebase может вызвать конфликт данной сборки с другими приложениями, кот орые могут быть установлены на том же компьютере. Параметр /codebase предназначе н только для подписанных сборок. Присвойте сборке строгое имя и повторите регист рацию. RegAsm : warning RA0000 : Не зарегистрировано ни одного типа C:\Users\SH> |
|||
103
Serginio1
28.09.14
✎
22:21
|
Там не сложнее чем в 1с. Зайди в файл
Service.cs или какой файл отвечает за сервис. Посмотри какой у него namespace А какую Dll создал? И зачем её регистрировал? |
|||
104
DES
28.09.14
✎
22:21
|
ну по аналогии же
|
|||
105
Serginio1
28.09.14
✎
22:22
|
ServiceEfactura.dll не нужно регистрировать
Её нужно загрузить Сборка = врап.загрузитьСборку(ИмяФайла); и получить из неё тип типСервера = Сборка.GetType("AX.EFactura.Model.ApiModel.ServiceClient"); |
|||
106
DES
28.09.14
✎
22:23
|
нужно просто грузить как 1cpp ?
|
|||
107
DES
28.09.14
✎
22:24
|
ну вот, типсервера пусто если в отладчике смотреть
|
|||
108
Serginio1
28.09.14
✎
22:24
|
Аналогия не та. Читай 98. Через NetObjetToIDispatch45 ты имеешь доступ к классам Net через IDispatch. Вот в чем её (наша) прелесть
|
|||
109
Serginio1
28.09.14
✎
22:26
|
(107) Вообще должно выкинуть исключение.
Еще раз посмотри какое пространство имен |
|||
110
DES
28.09.14
✎
22:26
|
да понял.
только вот DLL похоже получилась левая |
|||
111
DES
28.09.14
✎
22:27
|
namespace AX.EFactura.Model.ApiModel
|
|||
112
Serginio1
28.09.14
✎
22:29
|
Для того что бы получилось есть два пути
Создать библиотеку класса и добавить в проект Service.cs либо сделать телодвижения черезь добавление Web ссылки |
|||
113
Serginio1
28.09.14
✎
22:30
|
(111) Там есть тип ServiceClient?
|
|||
114
DES
28.09.14
✎
22:30
|
сделал
врап = СоздатьОбъект("NetObjectToIDispatch45"); врап.УстЭтоСемерка(); ИмяФайла = "C:\DLLNetObjetToIDispatch45\ServiceEfactura.dll"; Сборка = врап.загрузитьСборку(ИмяФайла); типСервера = Сборка.GetType("AX.EFactura.Model.ApiModel.ServiceClient"); привязка = врап.СоздатьОбъект("System.ServiceModel.BasicHttpBinding"); врап1 = СоздатьОбъект("AX.EFactura.Model.ApiModel"); дает ошибку привязка = врап.СоздатьОбъект("System.ServiceModel.BasicHttpBinding"); {S:\LX\EXTFORMS\NET_.ERT(8)}: NetObjetToIDispatch45: неверный тип System.ServiceModel.BasicHttpBinding |
|||
115
DES
28.09.14
✎
22:32
|
public partial class ServiceClient : System.ServiceModel.ClientBase<IService>, IService
{ public ServiceClient() { } |
|||
116
Serginio1
28.09.14
✎
23:08
|
Так как сборка не загружена нужно через AssemblyQualifiedName
привязка = врап.СоздатьОбъект(System.ServiceModel.BasicHttpBinding,System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"); |
|||
117
Serginio1
28.09.14
✎
23:08
|
Врап1 тебе не нужен
|
|||
118
DES
28.09.14
✎
23:16
|
врап = СоздатьОбъект("NetObjectToIDispatch45");
врап.УстЭтоСемерка(); ИмяФайла = "C:\DLLNetObjetToIDispatch45\ServiceEfactura.dll"; Сборка = врап.загрузитьСборку(ИмяФайла); типСервера = Сборка.GetType("AX.EFactura.Model.ApiModel.ServiceClient"); привязка = врап.СоздатьОбъект("System.ServiceModel.BasicHttpBinding,System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"); выполнилась без ошибок |
|||
119
Serginio1
28.09.14
✎
23:19
|
Но тебе помоему все равно нужно конфиг файл использовать. Слишком много настроек
|
|||
120
DES
28.09.14
✎
23:21
|
remoteAddress - еще не получается
|
|||
121
пипец
28.09.14
✎
23:26
|
эксплорер и 1с 77 не дружат , разные точки входа ... фингней страдаешь , проще через внешку
|
|||
122
DES
28.09.14
✎
23:29
|
врап = СоздатьОбъект("NetObjectToIDispatch45");
врап.УстЭтоСемерка(); ИмяФайла = "C:\DLLNetObjetToIDispatch45\ServiceEfactura.dll"; Сборка = врап.загрузитьСборку(ИмяФайла); типСервера = Сборка.GetType("AX.EFactura.Model.ApiModel.ServiceClient"); привязка = врап.СоздатьОбъект("System.ServiceModel.BasicHttpBinding,System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"); z = "https://api-test.fisc.md/Service.svc target=""_blank"" rel=""nofollow"" class=""extralink"">https://api-test.fisc.md/Service.svc"; remoteAddress = врап.СоздатьОбъект("System.ServiceModel.EndpointAddress",врап.СоздатьОбъект("System.Uri",z)); сервер = врап.СоздатьОбъект(типСервера,привязка,remoteAddress); сервер = врап.СоздатьОбъект(типСервера,привязка,remoteAddress); {S:\LX\EXTFORMS\NET_.ERT(12)}: NetObjetToIDispatch45: Ссылка на объект не указывает на экземпляр объекта. |
|||
123
DES
28.09.14
✎
23:29
|
(121) поясни.
|
|||
124
Serginio1
28.09.14
✎
23:29
|
Если после привязки код проходит
привязка = врап.СоздатьОбъект("System.ServiceModel.BasicHttpBinding,System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"); remoteAddress =врап.СоздатьОбъект("System.ServiceModel.EndpointAddress", врап.СоздатьОбъект("System.Uri","https://api-test.fisc.md/Service.svc")); |
|||
125
DES
28.09.14
✎
23:35
|
сделал см. выше.
|
|||
126
Serginio1
28.09.14
✎
23:38
|
Завтра посмотрю. Вот такое работает в тестовом примере
типСервера=Сборка.GetType("NestNet45.ServiceReference1.MorpherSoapClient"); типСервера=врап.ПолучитьТип("NestNet45.ServiceReference1.MorpherSoapClient"); remoteAddress =врап.СоздатьОбъект("System.ServiceModel.EndpointAddress", врап.СоздатьОбъект("System.Uri","http://www.morpher.ru/WebServices/Morpher.asmx")); привязка = врап.СоздатьОбъект("System.ServiceModel.BasicHttpBinding"); сервер=врап.СоздатьОбъект(типСервера,привязка,remoteAddress); |
|||
127
пипец
28.09.14
✎
23:39
|
(123) приложения разные ... тоись ваапче , в курсе что есть 1С 6.0 клиент серверная и под мак ? так вот , это все оттуда, рааазные это весчи , эоть и Сергей пытается МС с 1С подружить
|
|||
128
DES
28.09.14
✎
23:39
|
см. как в отладчике отображаются перед строкой
сервер = врап.СоздатьОбъект(типСервера,привязка,remoteAddress) Сборка = OLE._AutoWrap типСервера = привязка = OLE._AutoWrap remoteAddress = OLE._AutoWrap |
|||
129
Serginio1
28.09.14
✎
23:40
|
Значит типСервера не загружает
|
|||
130
пипец
28.09.14
✎
23:41
|
оле , б вообще выкинуть , МС плюнули на нее и АДО расширили
|
|||
131
DES
28.09.14
✎
23:41
|
(127) да я в курсе что абсолютно все программы разные, ну если они не копии.
|
|||
132
Serginio1
28.09.14
✎
23:42
|
И нигде больше не ругается?
|
|||
133
пипец
28.09.14
✎
23:42
|
||||
134
Serginio1
28.09.14
✎
23:43
|
Завтра на работе проверю
|
|||
135
пипец
28.09.14
✎
23:44
|
http://pro1c.org.ua/index.php?showtopic=2111
ЗЫ хоть и укр, но люди адекватные |
|||
136
Serginio1
28.09.14
✎
23:45
|
еще попробуй
типСервера = врап.получитьТип("AX.EFactura.Model.ApiModel.ServiceClient"); |
|||
137
пипец
28.09.14
✎
23:45
|
три точки 1С 77 не терпит ..
|
|||
138
DES
28.09.14
✎
23:47
|
типСервера = Сборка.GetType("AX.EFactura.Model.ApiModel.ServiceClient");
тут строка правильная? |
|||
139
Serginio1
28.09.14
✎
23:48
|
(138) откуда я знаю. У меня твоей сборки нет
|
|||
140
DES
28.09.14
✎
23:49
|
это namespace должно быть ?
зачем serviceClient ? |
|||
141
пипец
28.09.14
✎
23:52
|
вы чо , скрипты вшсы и вбсы хотите чтобы на 1с работали и вот ? мда
|
|||
142
Serginio1
28.09.14
✎
23:52
|
ServiceClient это тип находящийся в пространстве имен
AX.EFactura.Model.ApiModel то есть полное описание типа будет AX.EFactura.Model.ApiModel.ServiceClient |
|||
143
пипец
28.09.14
✎
23:53
|
и среда исполнения никого не волнует, только текст ... ужс
|
|||
144
Serginio1
28.09.14
✎
23:53
|
(141) Нет доступ к классам .Net
|
|||
145
DES
28.09.14
✎
23:54
|
(136) типСервера = врап.получитьТип("AX.EFactura.Model.ApiModel.ServiceClient");
{S:\LX\EXTFORMS\NET_.ERT(8)}: NetObjetToIDispatch45: неверный тип AX.EFactura.Model.ApiModel.ServiceClient |
|||
146
Serginio1
28.09.14
✎
23:54
|
(143) пипец ты сколько выпил?
Смотри v8: v8: Использование сборок .NET в 1С 7.x и 8.x |
|||
147
пипец
28.09.14
✎
23:54
|
(144) кудой ? )))
|
|||
148
Serginio1
28.09.14
✎
23:56
|
Значит в сборке его нет. Посмотри внимательно проект и какие файлы подключены
|
|||
149
пипец
28.09.14
✎
23:56
|
(146) пока еще не пил , но оттуда низзя , тока через прокладку ... а ссылки я могу тож насувать ... не будет оно нормально работать ..
|
|||
150
пипец
28.09.14
✎
23:58
|
лучше чистыми скриптами , а с 1с инициировать
ЗЫ ИМХО |
|||
151
DES
29.09.14
✎
00:00
|
||||
152
Serginio1
29.09.14
✎
00:00
|
(150) Твои скрипты это прошлый век. И по мощности они уступают .Net почитай для интереса v8: v8: Использование сборок .NET в 1С 7.x и 8.x
я уже около 4 лет их использую |
|||
153
пипец
29.09.14
✎
00:02
|
(152) тоесь оснастка винды уже прошлый век ? или мы таки путаем понятия ? ))
|
|||
154
DES
29.09.14
✎
00:02
|
как скриптами заюзать стороннее API ?
|
|||
155
пипец
29.09.14
✎
00:04
|
хмм , ты случаем не взлом пытаешься сделать ?
ЗЫ АПИ сторонним не бывает , или оно уже неиразу не апи |
|||
156
Serginio1
29.09.14
✎
00:04
|
Вот и посмотри какое у ServiceClient пространство имен.
Оно может быть типа ИмяПроекта.ServiceReference1 |
|||
157
DES
29.09.14
✎
00:05
|
фот DLL тут
http://dropmefiles.com/gQ4i8 |
|||
158
Serginio1
29.09.14
✎
00:05
|
(155) Мы сейчас вот это обсуждаем 1c 7.7 и ASP.NET
почему то к ней доступа нет |
|||
159
DES
29.09.14
✎
00:06
|
(156) тут видно простра имен ?
http://prntscr.com/4r8it5 |
|||
160
Serginio1
29.09.14
✎
00:07
|
То есть ServiseEFactura.ServiceReference1
|
|||
161
пипец
29.09.14
✎
00:07
|
(158) вот те ссыль дали , смотри уж тогда по библиотеке
|
|||
162
пипец
29.09.14
✎
00:08
|
(158) проект закрыт давно ...
|
|||
163
Serginio1
29.09.14
✎
00:09
|
(162) Вчера еще обсуждали
|
|||
164
DES
29.09.14
✎
00:12
|
сделал
типСервера = Сборка.GetType("ServiceEfactura.ServiceReference1"); все равно Сборка = OLE._AutoWrap типСервера = привязка = OLE._AutoWrap remoteAddress = OLE._AutoWrap |
|||
165
пипец
29.09.14
✎
00:13
|
(0) офис который майкрософт , переустанавливал , или доустанавливал ?
|
|||
166
Serginio1
29.09.14
✎
00:14
|
А где ServiceClient ты же тип получаешь а не пространство имен
типСервера = Сборка.GetType("ServiceEfactura.ServiceReference1.ServiceClient "); |
|||
167
DES
29.09.14
✎
00:14
|
(165) возможно
|
|||
168
пипец
29.09.14
✎
00:14
|
про безопасность посмотри , объект НЕ создается
|
|||
169
пипец
29.09.14
✎
00:15
|
хотя я б оле выкинул нафик , тормознутая числострокадата
|
|||
170
DES
29.09.14
✎
00:17
|
(166)
сервер = врап.СоздатьОбъект(типСервера,привязка,remoteAddress); {S:\LX\EXTFORMS\NET_.ERT(13)}: mscorlib: Адресат вызова создал исключение. |
|||
171
пипец
29.09.14
✎
00:18
|
(170) тя послали ;))) нет такого , написали ж ;)))
|
|||
172
DES
29.09.14
✎
00:19
|
(171) да есть уже
|
|||
173
пипец
29.09.14
✎
00:19
|
через попытку исключение смотри... увидишь
|
|||
174
DES
29.09.14
✎
00:20
|
Сборка = OLE._AutoWrap
типСервера = OLE._AutoWrap привязка = OLE._AutoWrap remoteAddress = OLE._AutoWrap |
|||
175
пипец
29.09.14
✎
00:20
|
и сдругого компа , на другом сервере , пробуй
ЗЫ вин хоум что ле ? |
|||
176
пипец
29.09.14
✎
00:21
|
(174) чойта ? чот все одинаковое
|
|||
177
DES
29.09.14
✎
00:21
|
не хоум
врап = СоздатьОбъект("NetObjectToIDispatch45"); врап.УстЭтоСемерка(); ИмяФайла = "C:\DLLNetObjetToIDispatch45\ServiceEfactura.dll"; Сборка = врап.загрузитьСборку(ИмяФайла); типСервера = Сборка.GetType("ServiceEfactura.ServiceReference1.ServiceClient"); привязка = врап.СоздатьОбъект("System.ServiceModel.BasicHttpBinding,System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"); z = "https://api-test.fisc.md/Service.svc target=""_blank"" rel=""nofollow"" class=""extralink"">https://api-test.fisc.md/Service.svc"; remoteAddress = врап.СоздатьОбъект("System.ServiceModel.EndpointAddress",врап.СоздатьОбъект("System.Uri",z)); сервер = врап.СоздатьОбъект(типСервера,привязка,remoteAddress); |
|||
178
пипец
29.09.14
✎
00:22
|
хехе , спроси админа , де безопасность ;))
|
|||
179
пипец
29.09.14
✎
00:24
|
попробуй на локалхост
|
|||
180
DES
29.09.14
✎
00:24
|
опачки на w2008r2 взлетело
|
|||
181
DES
29.09.14
✎
00:25
|
(178) безопасность в чифровой подписи
|
|||
182
пипец
29.09.14
✎
00:25
|
безопасность и библиотеки офиса
|
|||
183
пипец
29.09.14
✎
00:25
|
кури в эту сторону
|
|||
184
DES
29.09.14
✎
00:26
|
Да мне пофиг на их безопасность , мне надо закинуть им данные из 1с.
|
|||
185
пипец
29.09.14
✎
00:27
|
ну теперь думаю, разберешся
|
|||
186
Serginio1
29.09.14
✎
00:27
|
Вообще для начала лучше проверить внутри нет создав ВинФормс. А уже потом перводить на 1С.
Там может быть проблемы с endpoint address="https://api-test.fisc.md/Service.svc" Security mode="TransportWithMessageCredential" лучше через использование Config файла API IE из 1с 7.7 |
|||
187
DES
29.09.14
✎
00:29
|
как теперь в 1с будет выглядеть это
private EFacturaApiRef.ServiceClient _client; _client = new EFacturaApiRef.ServiceClient(); _client.ClientCredentials.UserName.UserName = "supplier"; _client.ClientCredentials.UserName.Password = "supplier"; |
|||
188
Serginio1
29.09.14
✎
00:29
|
Тебе то может и пофиг, только вот настроить соединение ты должен
|
|||
189
Serginio1
29.09.14
✎
00:29
|
Так и будет
|
|||
190
DES
29.09.14
✎
00:30
|
(186) меня больше парит что на моем компе не пашет, наверно нужно выковыривать сборку из реестра
|
|||
191
Serginio1
29.09.14
✎
00:30
|
Тольк лучше
UserName=_client.ClientCredentials.UserName; UserName.UserName = "supplier"; UserName.Password = "supplier"; |
|||
192
DES
29.09.14
✎
00:31
|
(186) _client = это что будет ?
|
|||
193
DES
29.09.14
✎
00:31
|
это только для зарегаться на сайте
а потом там другие функции есть для обмена |
|||
194
пипец
29.09.14
✎
00:32
|
(190) не парь моск , бывает всякеое ... как говаривал мой знакомый - конь в вакууме та же винда , только с буквами ;))
|
|||
195
Serginio1
29.09.14
✎
00:33
|
||||
196
DES
29.09.14
✎
00:36
|
(195) _client = это что будет ?
|
|||
197
DES
29.09.14
✎
00:37
|
сервер ?
|
|||
198
DES
29.09.14
✎
00:41
|
UserName1 = сервер.ClientCredentials.UserName;
UserName1.UserName = "supplier"; UserName1.Password = "supplier"; я правильно понял? |
|||
199
DES
29.09.14
✎
00:49
|
а как будет выглядеть код для такого
private EFacturaApiRef.ServiceClient _client; _client = new EFacturaApiRef.ServiceClient(); _client.ClientCredentials.UserName.UserName = "supplier"; _client.ClientCredentials.UserName.Password = "supplier"; string newid = Guid.NewGuid().ToString(); var request = new InvoicesRequest { SeriaAndNumbers = new List<InvoiceIndentificator> { new InvoiceIndentificator { Number = "000004664", Seria = "EA7A"}, new InvoiceIndentificator { Number = "000004664", Seria = "EAA" } }.ToArray(), RequestId = newid }; var response = _client.GetInvoicesBySeriaNumber(request); foreach (var info in response.Results) { Console.WriteLine(info.Seria + " " + info.Number + " " + info.Xml + " Error Message: " + info.Message); } |
|||
200
Serginio1
29.09.14
✎
00:55
|
У тебя TransportWithMessageCredential
попробуй привязка.Security.Mode = врап.ПолучитьТип( System.ServiceModel.SecurityMode).TransportWithMessageCredential; привязка.Security.Message.ClientCredentialType = врап.ПолучитьТип( System.ServiceModel.MessageCredentialType).Certificate; |
|||
201
Serginio1
29.09.14
✎
00:56
|
Давай завтра. Посмотри примеры там многое есть
|
|||
202
Serginio1
29.09.14
✎
00:57
|
Например
newid = врап.ПолучитьТип("System.Guid").NewGuid().ToString(); |
|||
203
DES
29.09.14
✎
01:05
|
большое спасибо тебе.
|
|||
204
Serginio1
29.09.14
✎
01:15
|
Для получения List
нужно немного повозиться ТипЛист=Врап.ПолучитьТип("System.Collections.Generic.List`1"); ТипInvoiceIndentificator =Врап.ПолучитьТип("InvoiceIndentificator "); ТипизированныйЛист=ТипЛист.MakeGenericType(ТипКанала); (ТипInvoiceIndentificator); SeriaAndNumbers=Врап.СоздатьОбъект(ТипизированныйЛист); |
|||
205
DES
29.09.14
✎
11:10
|
все, победил на локальном компе. загрузил config и пошло.
|
|||
206
Serginio1
29.09.14
✎
11:11
|
привязка.Security.Message.ClientCredentialType = врап.ПолучитьТип("BasicHttpMessageCredentialType").TransportWithMessageCredential;
|
|||
207
Serginio1
29.09.14
✎
11:12
|
(205) Поздравляю. Не так уж и сложно дажн незная C#
|
|||
208
Serginio1
29.09.14
✎
12:26
|
привязка.Security.Mode = врап.ПолучитьТип( System.ServiceModel.SecurityMode).TransportWithMessageCredential;
привязка.Security.Message.ClientCredentialType = врап.ПолучитьТип( "System.ServiceModel.BasicHttpMessageCredentialType").UserName ; |
|||
209
DES
29.09.14
✎
12:35
|
привязка - откуда взялось ?
|
|||
210
DES
29.09.14
✎
12:38
|
ТипЛист=Врап.ПолучитьТип("System.Collections.Generic.List`1");
ТипInvoiceIndentificator =Врап.ПолучитьТип("InvoiceIndentificator "); Это прошло а ниже не понял что за ТипКанала ТипизированныйЛист=ТипЛист.MakeGenericType(ТипКанала); |
|||
211
Serginio1
29.09.14
✎
13:26
|
(210) Это я скопировал неудачно.
ТипизированныйЛист=ТипЛист.MakeGenericType(ТипInvoiceIndentificator); |
|||
212
DES
29.09.14
✎
13:44
|
но до этого
ТипInvoiceIndentificator = Врап.ПолучитьТип("InvoiceIndentificator"); {S:\LX\EXTFORMS\NET_.ERT(23)}: NetObjetToIDispatch45: неверный тип InvoiceIndentificator |
|||
213
Serginio1
29.09.14
✎
13:52
|
Опять же смотри пространство имен ServiceEfactura.ServiceReference1
ТипInvoiceIndentificator = Врап.ПолучитьТип("ServiceEfactura.ServiceReference1.InvoiceIndentificator"); Просто в шарпе, что бы не писать пространство имен используют юсинги. Не забывай |
|||
214
DES
29.09.14
✎
17:21
|
ТипизированныйЛист=ТипЛист.MakeGenericType(ТипInvoiceIndentificator);
{S:\LX\EXTFORMS\NET_.ERT(24)}: Поле агрегатного объекта не обнаружено (MakeGenericType) ТипизированныйЛист=ТипЛист.ПолучитьТип(ТипInvoiceIndentificator); {S:\LX\EXTFORMS\NET_.ERT(24)}: Поле агрегатного объекта не обнаружено (ПолучитьТип) makegenerictype - где узнать методы ? |
|||
215
Serginio1
29.09.14
✎
17:31
|
Что бы получить методы Type его нужно изменить
ТипЛистОбъект=Врап.ТипКакОбъект(ТипЛист); ТипизированныйЛист=ТипЛистОбъект.MakeGenericType(ТипInvoiceIndentificator); |
|||
216
DES
29.09.14
✎
17:48
|
не проходит.
ТипЛист = Врап.ПолучитьТип("System.Collections.Generic.List`1"); ТипInvoiceIndentificator = Врап.ПолучитьТип("ServiceEfactura.ServiceReference.InvoiceIndentificator"); ТипизированныйЛист=ТипЛист.MakeGenericType(ТипInvoiceIndentificator); ТипЛистОбъект=Врап.ТипКакОбъект(ТипЛист); ТипизированныйЛист=ТипЛистОбъект.MakeGenericType(ТипInvoiceIndentificator); дает ТипизированныйЛист=ТипЛист.MakeGenericType(ТипInvoiceIndentificator); {S:\LX\EXTFORMS\NET_.ERT(24)}: Поле агрегатного объекта не обнаружено (MakeGenericType) и вообще смущает это ТипЛист = Врап.ПолучитьТип("System.Collections.Generic.List`1"); что за символ перед "1" ? |
|||
217
Serginio1
29.09.14
✎
17:51
|
(216) У меня работает.
System.Collections.Generic.List`1 это дженерик тип с одним типом то бишь System.Collections.Generic.List<T> |
|||
218
Serginio1
29.09.14
✎
17:52
|
Вот это работает
ТипизированныйЛист=ТипЛистОбъект.MakeGenericType(ТипInvoiceIndentificator); А вот это не нужно ТипизированныйЛист=ТипЛист.MakeGenericType(ТипInvoiceIndentificator); |
|||
219
Serginio1
29.09.14
✎
17:55
|
(217) Ты можешь всегда посмотреть в отладчике
ТипЛистОбъект.AssemblyQualifiedName |
|||
220
DES
29.09.14
✎
18:19
|
т.е. ТипизированныйЛист - это массив элементов с типом инвойсИдентификатор ?
|
|||
221
Serginio1
29.09.14
✎
18:34
|
Значит тип в большинстве нужен для вызова конструктора объекта и для вызова статических методов и свойств.
Но у типа есть и свои методы и свой тип. ТипизированныйЛист это System.Collections.Generic.List<ServiceEfactura.ServiceReference1.InvoiceIndentificator> В который ты можешь добавлять через метод Add объекты типа ServiceEfactura.ServiceReference1.InvoiceIndentificator Массив это System.Array |
|||
222
Serginio1
29.09.14
✎
18:36
|
ТипизированныйЛист это тип,
а вот SeriaAndNumbers=Врап.СоздатьОбъект(ТипизированныйЛист); это уже типизированный список |
|||
223
Serginio1
29.09.14
✎
18:41
|
Кстати в строковом виде тип такой
System.Collections.Generic.List`1[[ServiceEfactura.ServiceReference1.InvoiceIndentificator, ТестВэбСервисов, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] |
|||
224
Serginio1
29.09.14
✎
18:42
|
Тьфу
System.Collections.Generic.List`1[[ServiceEfactura.ServiceReference1.InvoiceIndentificator]] |
|||
225
DES
29.09.14
✎
19:13
|
(224) а оно нафмга ?
|
|||
226
DES
29.09.14
✎
19:18
|
а как SeriaAndNumbers.add заюзать ?
|
|||
227
DES
29.09.14
✎
20:42
|
а как будет ForEach для SeriaAndNumbers выглядеть ?
|
|||
228
DES
30.09.14
✎
01:26
|
что то не входит в цикл почему то
SeriaAndNumber.Number = "000000003"; SeriaAndNumber.Seria = "EA7A"; SeriaAndNumbers.Add(SeriaAndNumber); истина = Врап.ChangeType("System.Boolean","true"); ложь = Врап.ChangeType("System.Boolean","false"); iter = SeriaAndNumbers.GetEnumerator(); // (тут сразу iter.MoveNext()=-1) Пока iter.MoveNext()=истина Цикл Сообщить(iter.Current.Number); КонецЦикла; |
|||
229
Serginio1
30.09.14
✎
10:46
|
Там можно два варианта
РазмерСписка=SeriaAndNumbers.Count; Для сч=0 по РазмерСписка-1 Цикл счИнт=Врап.ChangeType("System.Int32",сч); Значение=SeriaAndNumbers.get_Item(счИнт); Сообщить(Значение.Number); КонецЦикла; iter = SeriaAndNumbers.GetEnumerator(); // (тут сразу iter.MoveNext()=-1) Пока iter.MoveNext()<>0 Цикл Сообщить(iter.Current.Number); КонецЦикла; Смысл приведения Истина и ложь заключается в том, что таких типов в 1С нет, и она в параметры по ком отправляет тип double. А из-за того, что в C# есть перегрузка методов, то нужно передавать переменные с нужным типом |
|||
230
Serginio1
30.09.14
✎
10:47
|
-1 в числовом выражении это и есть истина.
То есть not 0 = -1 для инта |
|||
231
DES
30.09.14
✎
11:09
|
так правильно будет ?
SeriaAndNumber = Врап.СоздатьОбъект(ТипInvoiceIndentificator) |
|||
232
Serginio1
30.09.14
✎
11:21
|
(231) Да.
Просто если ты вызываешь со строковым аргументом, то по строковому представлению ищется тип а затем вызывается конструктор. Если ты уже получил тип, то можешь использовать его повторно и внутри поиска типа не будет |
|||
233
DES
30.09.14
✎
11:27
|
СДЕЛАЛ:
SeriaAndNumber.Number = "000000001"; SeriaAndNumber.Seria = "EA7A"; SeriaAndNumbers.Add(SeriaAndNumber); SeriaAndNumber.Number = "000000002"; SeriaAndNumber.Seria = "EA7A"; SeriaAndNumbers.Add(SeriaAndNumber); SeriaAndNumber.Number = "000000003"; SeriaAndNumber.Seria = "EAA"; SeriaAndNumbers.Add(SeriaAndNumber); SeriaAndNumber.Number = "000000000"; SeriaAndNumber.Seria = "EA7A"; SeriaAndNumbers.Add(SeriaAndNumber); РазмерСписка = SeriaAndNumbers.Count; Для сч=0 по РазмерСписка-1 Цикл счИнт = Врап.ChangeType("System.Int32",сч); Значение = SeriaAndNumbers.get_Item(счИнт); Сообщить(Значение.Number); КонецЦикла; Выводит: 000000000 000000000 000000000 000000000 000000000 |
|||
234
DES
30.09.14
✎
11:33
|
И потом вопрос, выходит что этой библиотеке уже известен адрес источника данных?
|
|||
235
Serginio1
30.09.14
✎
11:44
|
(234) Да он забит в конфиг файле.
А ошибка в том, что ты добавляешь один и тот же объект. SeriaAndNumber = Врап.СоздатьОбъект(ТипInvoiceIndentificator) SeriaAndNumber.Number = "000000001"; SeriaAndNumber.Seria = "EA7A"; SeriaAndNumbers.Add(SeriaAndNumber); SeriaAndNumber = Врап.СоздатьОбъект(ТипInvoiceIndentificator) SeriaAndNumber.Number = "000000002"; SeriaAndNumber.Seria = "EA7A"; SeriaAndNumbers.Add(SeriaAndNumber); SeriaAndNumber = Врап.СоздатьОбъект(ТипInvoiceIndentificator) SeriaAndNumber.Number = "000000003"; SeriaAndNumber.Seria = "EAA"; SeriaAndNumbers.Add(SeriaAndNumber); SeriaAndNumber = Врап.СоздатьОбъект(ТипInvoiceIndentificator) SeriaAndNumber.Number = "000000000"; SeriaAndNumber.Seria = "EA7A"; SeriaAndNumbers.Add(SeriaAndNumber); iter = SeriaAndNumbers.GetEnumerator(); // (тут сразу iter.MoveNext()=-1) Пока iter.MoveNext()<>0 Цикл Сообщить(iter.Current.Number); КонецЦикла; Ну и соответсвенно проще создать функцию для запролнения Функция ПолучитьИнвой(ТипInvoiceIndentificator,Number,Seria) SeriaAndNumber = Врап.СоздатьОбъект(ТипInvoiceIndentificator) SeriaAndNumber.Number = "000000000"; SeriaAndNumber.Seria = "EA7A"; возврат SeriaAndNumber КонецФункции SeriaAndNumbers.Add(ПолучитьИнвой(ТипInvoiceIndentificator,"000000001","EA7A")); ....... |
|||
236
DES
30.09.14
✎
11:56
|
Все, все завелось, большое спасибо.
|
|||
237
DES
01.10.14
✎
01:04
|
это я поспешил...
а как правильно будет ? Для их кода: string newid = Guid.NewGuid().ToString(); var request = new SignRequest { RequestId = newid, ActorRole = 1, Order = 1 }; var response = _client.GetInvoicesForSigning(request); мой код: типActorBaseRequest = Сборка.GetType("ServiceEfactura.ServiceReference.ActorBaseRequest"); request = Врап.ТипКакОбъект(типActorBaseRequest); request.RequestId = newid; request.ActorRole = 1; или типActorBaseRequest = Врап.ПолучитьТип("ServiceEfactura.ServiceReference.ActorBaseRequest"); request = Врап.СоздатьОбъект(типActorBaseRequest); request.RequestId = newid; что-то не то не то не фурычит. request.ActorRole = 1; |
|||
238
DES
01.10.14
✎
01:09
|
че то там я напутал
|
|||
239
DES
01.10.14
✎
01:14
|
как это будет по 1с?
var response = _client.GetInvoicesForSigning(request); |
|||
240
DES
01.10.14
✎
01:24
|
GetInvoicesForSigning - Поле агрегатного объекта не обнаружено
_client - вроде же описан был. |
|||
241
DES
01.10.14
✎
01:37
|
наверно так
response = сервер.GetAcceptedInvoices(request); |
|||
242
Serginio1
01.10.14
✎
10:35
|
типСервера = Сборка.GetType("ServiceEfactura.ServiceReference1.ServiceClient");
сервер = врап.СоздатьОбъект(типСервера); |
|||
243
Serginio1
01.10.14
✎
10:38
|
Лучше сразу назови _client чтобы не путаться
|
|||
244
DES
01.10.14
✎
10:49
|
а вот это можно исключить ?
привязка = Врап.СоздатьОбъект("System.ServiceModel.BasicHttpBinding,System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"); СсылкаHTTPS = "https://api-test.fisc.md/Service.svc target=""_blank"" rel=""nofollow"" class=""extralink"">https://api-test.fisc.md/Service.svc"; remoteAddress = Врап.СоздатьОбъект("System.ServiceModel.EndpointAddress",Врап.СоздатьОбъект("System.Uri",СсылкаHTTPS)); сервер = Врап.СоздатьОбъект(типСервера,привязка,remoteAddress); потому что config файл включен ? |
|||
245
DES
01.10.14
✎
10:56
|
и еще как получить текст ошибки при запросе ?
(ответ выводится на экран в окне с которого текст не копируется.) |
|||
246
Serginio1
01.10.14
✎
11:42
|
(244) Да
Вернее просто использовать типСервера = Сборка.GetType("ServiceEfactura.ServiceReference1.ServiceClient"); сервер = врап.СоздатьОбъект(типСервера); Вообще соединение кэширется и можно каждый раз создавать и закрывать например Функция ПолучитьКлиента() возврат врап.СоздатьОбъект(типСервера); КонецФункции и _client= ПолучитьКлиента(); ....... _client.Close(); (245) Нет. Вообще создается исключение с описанием ошибки, но 1С почему то не выводит |
|||
247
DES
01.10.14
✎
12:46
|
откуда взялось это "ServiceEfactura.ServiceReference" ?
|
|||
248
DES
01.10.14
✎
12:49
|
понял namespace
|
|||
249
DES
01.10.14
✎
13:30
|
Зафиксирую результат.
Перем Врап, ИмяФайлаDLL, Сборка, типСервера, _client, response; Перем namespace, _UserName_, _Password_; //---------------------------------------------------------------------- Функция ПолучитьКлиента() Возврат врап.СоздатьОбъект(типСервера); КонецФункции //---------------------------------------------------------------------- Процедура ПолучитьДанные(request) // Возвращает в response _client= ПолучитьКлиента(); login = _client.ClientCredentials.UserName; login.UserName = _UserName_; login.Password = _Password_; Попытка response = _client.GetAcceptedInvoices(request); Исключение response = 0; Сообщить(".GetAcceptedInvoices() Ошибка получения информации.","!"); КонецПопытки; _client.Close(); КонецПроцедуры //---------------------------------------------------------------------- Процедура eFactura_GetAcceptedInvoices() Перем newid, типActorBaseRequest; newid = Врап.ПолучитьТип("System.Guid").NewGuid().ToString(); типActorBaseRequest = Врап.ПолучитьТип(namespace + "ActorBaseRequest"); request = Врап.СоздатьОбъект(типActorBaseRequest); request.RequestId = newid; ПолучитьДанные(request) КонецПроцедуры //---------------------------------------------------------------------- Процедура Сформировать() _UserName_ = "UserName"; _Password_ = "Password"; eFactura_GetAcceptedInvoices(); Если ПустоеЗначение(response)=1 Тогда Сообщить("Нет результата."); Иначе Сообщить("Есть результат."); КонецЕсли; КонецПроцедуры //---------------------------------------------------------------------- Процедура ПриОткрытии() Перем ИмяФайлаDLL; ИмяФайлаDLL = КаталогИБ()+"ServiceEfactura.dll"; namespace = "ServiceEfactura.ServiceReference."; Врап = СоздатьОбъект("NetObjectToIDispatch45"); Врап.УстЭтоСемерка(); Врап.ЗаменитьConfigFile(ИмяФайлаDLL+".config"); Сборка = Врап.загрузитьСборку(ИмяФайлаDLL); типСервера = Сборка.GetType(namespace + "ServiceClient"); КонецПроцедуры //---------------------------------------------------------------------- |
|||
250
DES
01.10.14
✎
13:43
|
Вернее Ver 1.2
Code Перем Врап, ИмяФайлаDLL, Сборка, типСервера, _client, response; Перем namespace, _UserName_, _Password_, request; //---------------------------------------------------------------------- Функция ПолучитьКлиента() Возврат врап.СоздатьОбъект(типСервера); КонецФункции //---------------------------------------------------------------------- Процедура ПолучитьДанные(_еЗапрос_) // Возвращает в response _client= ПолучитьКлиента(); login = _client.ClientCredentials.UserName; login.UserName = _UserName_; login.Password = _Password_; Попытка Если _еЗапрос_ = "GetAcceptedInvoices" Тогда response = _client.GetAcceptedInvoices(request); ИначеЕсли _еЗапрос_ = "GetAcceptedInvoices1" Тогда ИначеЕсли _еЗапрос_ = "GetAcceptedInvoices2" Тогда ИначеЕсли _еЗапрос_ = "GetAcceptedInvoices3" Тогда КонецЕсли; Исключение response = 0; Сообщить("."+_еЗапрос_+"() - ошибка получения информации.","!"); КонецПопытки; _client.Close(); КонецПроцедуры //---------------------------------------------------------------------- Процедура eFactura_GetAcceptedInvoices() Перем newid, типActorBaseRequest; newid = Врап.ПолучитьТип("System.Guid").NewGuid().ToString(); типActorBaseRequest = Врап.ПолучитьТип(namespace + "ActorBaseRequest"); request = Врап.СоздатьОбъект(типActorBaseRequest); request.RequestId = newid; ПолучитьДанные("GetAcceptedInvoices"); КонецПроцедуры //---------------------------------------------------------------------- Процедура Сформировать() _UserName_ = "UserName"; _Password_ = "Password"; eFactura_GetAcceptedInvoices(); Если ПустоеЗначение(response)=1 Тогда Сообщить("Нет результата."); Иначе Сообщить("Есть результат."); КонецЕсли; КонецПроцедуры //---------------------------------------------------------------------- Процедура ПослеСозданияФормы() ОчиститьОкноСообщений(); КонецПроцедуры //---------------------------------------------------------------------- Процедура ПриОткрытии() Перем ИмяФайлаDLL; ИмяФайлаDLL = КаталогИБ()+"ServiceEfactura.dll"; namespace = "ServiceEfactura.ServiceReference."; Врап = СоздатьОбъект("NetObjectToIDispatch45"); Врап.УстЭтоСемерка(); Врап.ЗаменитьConfigFile(ИмяФайлаDLL+".config"); Сборка = Врап.загрузитьСборку(ИмяФайлаDLL); типСервера = Сборка.GetType(namespace + "ServiceClient"); КонецПроцедуры //---------------------------------------------------------------------- |
|||
251
DES
01.10.14
✎
14:27
|
а еще в твоих примерах про System.Web.Services
что с ними можно делать ? Интересует понажимать кнопки на веб-страницах на ajax |
|||
252
Serginio1
01.10.14
✎
14:44
|
Есть еще один вариант,
Перем endpointAddress; TChannel=Сборка.GetType(namespace + "IService"); ConfigFile=ИмяФайлаСборки+".config"; endpointConfigurationName=""BasicHttpBinding_IService"; // endpointAddress=Неопределено; Клиент=врап.СоздатьКлиентаWCFConfigFile(ConfigFile,TChannel,endpointConfigurationName,endpointAddress); Но нужно в конфиг файле прописывать ClientCredentials |
|||
253
Serginio1
01.10.14
✎
15:05
|
(251)
Там просто примеры подключения к конкретному сервису. Если хочешьпоиграться с IE то Как подключиться к уже существующему OLE-объекту? |
|||
254
Serginio1
01.10.14
✎
15:42
|
252+ Исправлю СоздатьКлиентаWCFConfigFile, чтобы передавать UserName и Password
|
|||
255
Serginio1
01.10.14
✎
16:47
|
http://files.rsdn.ru/19608/FilesForNetObjectToIDispatch.zip
Сейчас исправил, что бы можно было использовать конфигурационный файл Можешь протестировать вызов TChannel=Сборка.GetType(namespace + "IService"); ConfigFile=ИмяФайлаСборки+".config"; endpointConfigurationName=""BasicHttpBinding_IService"; // endpointAddress=Неопределено; Клиент=врап.СоздатьКлиентаWCFConfigFile(ConfigFile,TChannel,endpointConfigurationName,,UserName,Password); |
|||
256
DES
01.10.14
✎
17:28
|
ничего не понял
|
|||
257
Serginio1
01.10.14
✎
17:30
|
255+
То есть добавил поддержку Credentials public object СоздатьКлиентаWCFConfigFile(string ИмяФайла, object TChannel, string endpointConfigurationName, object endpointAddress=null,string UserName=null, string Password=null) { ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap(); fileMap.ExeConfigFilename = ИмяФайла; Configuration newConfiguration = ConfigurationManager.OpenMappedExeConfiguration( fileMap, ConfigurationUserLevel.None); Type ТипКанала = ТипДляСоздатьОбъект(TChannel); Type type = typeof(ConfigurationChannelFactory<>); Type constructed = type.MakeGenericType(ТипКанала); dynamic factory1 = System.Activator.CreateInstance(constructed, endpointConfigurationName, newConfiguration, AutoWrap.ПолучитьРеальныйОбъект(endpointAddress) ); if (!String.IsNullOrWhiteSpace(UserName)) { factory1.Credentials.UserName.UserName = UserName; factory1.Credentials.UserName.Password = Password; } // new ConfigurationChannelFactory<ICalculatorChannel>( // "endpoint1", // newConfiguration, // new EndpointAddress("http://localhost:8000/servicemodelsamples/service")); return AutoWrap.ОбернутьОбъект(factory1.CreateChannel()); } |
|||
258
DES
01.10.14
✎
17:35
|
ну про поддержку понял, а зачем ?
|
|||
259
Serginio1
01.10.14
✎
17:35
|
(256) Чтобы в одном приложении можно было использовать несколько длл со своими конфиг файлами.
Врап.ЗаменитьConfigFile(ИмяФайлаDLL+".config"); Заменяет конфиг файл приложения ИмяФайлаDLL = КаталогИБ()+"ServiceEfactura.dll"; namespace = "ServiceEfactura.ServiceReference."; Врап = СоздатьОбъект("NetObjectToIDispatch45"); Врап.УстЭтоСемерка(); Сборка = Врап.загрузитьСборку(ИмяФайлаDLL); типСервера = Сборка.GetType(namespace + "ServiceClient"); TChannel=Сборка.GetType(namespace + "IService"); ConfigFile=ИмяФайлаСборки+".config"; endpointConfigurationName=""BasicHttpBinding_IService"; // endpointAddress=Неопределено; _client=врап.СоздатьКлиентаWCFConfigFile(ConfigFile,TChannel,endpointConfigurationName,,_UserName_,_Password_); response = _client.GetAcceptedInvoices(request); |
|||
260
DES
01.10.14
✎
17:39
|
какую dll нужно заменить теперь ?
|
|||
261
Serginio1
01.10.14
✎
17:41
|
NetObjetToIDispatch45.dll
|
|||
262
DES
01.10.14
✎
17:43
|
а оно где должно лежать ?
|
|||
263
Serginio1
01.10.14
✎
17:45
|
Там где и старая. Ту которую ты регистрировал через
РегистрацияКомСервера.exe Но ты её переименй на всякий случай |
|||
264
DES
01.10.14
✎
17:52
|
имеет значение где лежит или найдет по %PATH% ?
|
|||
265
Serginio1
01.10.14
✎
17:53
|
Не имеет, но нужно её зарегистрировать
|
|||
266
DES
01.10.14
✎
17:54
|
по новой регать ?
всмысле я не помню какую зарегал, с какого каталога |
|||
267
Serginio1
01.10.14
✎
17:59
|
Ну ты можешь найти через RegEdit по ключевому слову NetObjectToIDispatch45
|
|||
268
Serginio1
01.10.14
✎
18:00
|
HKEY_CLASSES_ROOT\CLSID\{DFDADA57-B22C-4276-928A-8B91C9891FF1}\InprocServer32
|
|||
269
DES
01.10.14
✎
18:01
|
я не пойму как мой код переделать
|
|||
270
Serginio1
01.10.14
✎
18:05
|
(269) Выполнить-RegEdit-Правка-Найти-NetObjectToIDispatch45
Она тебе покажет раздел (268) в параметр CodeBase путь зарегистрированной тобой DLL |
|||
271
DES
01.10.14
✎
18:20
|
да не про реестр
я про 1с |
|||
272
Serginio1
01.10.14
✎
18:28
|
Вместо
Функция ПолучитьКлиента() возврат врап.СоздатьОбъект(типСервера); КонецФункции Функция ПолучитьКлиента() TChannel=Сборка.GetType(namespace + "IService"); ConfigFile=ИмяФайлаСборки+".config"; endpointConfigurationName=""BasicHttpBinding_IService"; // endpointAddress=Неопределено; _client=врап.СоздатьКлиентаWCFConfigFile(ConfigFile,TChannel,endpointConfigurationName,,_UserName_,_Password_); возврат _client КонецФункции При этом тебе не нужно устанавливать login = _client.ClientCredentials.UserName; login.UserName = _UserName_; login.Password = _Password_; |
|||
273
DES
01.10.14
✎
19:07
|
возврат врап.СоздатьКлиентаWCFConfigFile(ConfigFile,TChannel,endpointConfigurationName,,_UserName_,_Password_);
{S:\LX\EXTFORMS\NETEFACTURA.ERT(12)}: System.Configuration: Параметр строки 'fileMap.ExeConfigFilename' не может быть пустым или иметь значени |
|||
274
DES
01.10.14
✎
19:08
|
я правда кинул DLL в system32 и подправил в реестре.
|
|||
275
DES
01.10.14
✎
19:13
|
не. то мой косяк.
а вот это _client = ПолучитьКлиента(); login = _client.ClientCredentials.UserName; login.UserName = _UserName_; login.Password = _Password_; разве это теперь может вызывать ошибку ? |
|||
276
DES
01.10.14
✎
19:17
|
и вот это дает ошибку
_client.Close(); {S:\LX\EXTFORMS\NETEFACTURA.ERT(31)}: Поле агрегатного объекта не обнаружено (Close) |
|||
277
DES
01.10.14
✎
19:18
|
вот это
Процедура ПолучитьДанные(_еЗапрос_) // Возвращает в response _client = ПолучитьКлиента(); //login = _client.ClientCredentials.UserName; //login.UserName = _UserName_; //login.Password = _Password_; Попытка Если _еЗапрос_ = "GetAcceptedInvoices" Тогда response = _client.GetAcceptedInvoices(request); ИначеЕсли _еЗапрос_ = "GetAcceptedInvoices1" Тогда ИначеЕсли _еЗапрос_ = "GetAcceptedInvoices2" Тогда ИначеЕсли _еЗапрос_ = "GetAcceptedInvoices3" Тогда КонецЕсли; Исключение response = 0; Сообщить("."+_еЗапрос_+"() - ошибка получения информации.","!"); КонецПопытки; _client.Close(); КонецПроцедуры |
|||
278
DES
01.10.14
✎
19:29
|
login = _client.ClientCredentials.UserName;
{S:\LX\EXTFORMS\NETEFACTURA.ERT(17)}: Поле агрегатного объекта не обнаружено (ClientCredenti |
|||
279
DES
01.10.14
✎
19:34
|
и еще в случае неудачи
Врап = СоздатьОбъект("NetObjectToIDispatch45"); как диагностировать ? |
|||
280
Serginio1
02.10.14
✎
10:15
|
(278) Ты не полностью прочитал 272
Там уже не надо login = _client.ClientCredentials.UserName; login.UserName = _UserName_; login.Password = _Password_; Даже в твоем варианте Функция ПолучитьКлиента() _client=врап.СоздатьОбъект(типСервера); login = _client.ClientCredentials.UserName; login.UserName = _UserName_; login.Password = _Password_; возврат _client КонецФункции |
|||
281
Serginio1
02.10.14
✎
10:18
|
(279) Так же как в 270. Если не нашла NetObjectToIDispatch45 то он не зарегестрирован.
При этом библиотека может быть заркгистрирована ка 32 так и 64 разрядной. |
|||
282
DES
02.10.14
✎
12:51
|
(280) я понимаю что это уже излишне, но почему вылетает с ошибкой?
|
|||
283
Serginio1
02.10.14
✎
12:57
|
(282) Потому, что врап.СоздатьКлиентаWCFConfigFile(ConfigFile,TChannel,endpointConfigurationName,,_UserName_,_Password_);
создает не public partial class ServiceClient : System.ServiceModel.ClientBase<ТестВэбСервисов.ServiceReference1.IService>, ТестВэбСервисов.ServiceReference1.IService { а прокси над интерфейсом public interface IService { Ничего, о методах ClientBase он не знает. Поэтому ты и передаешь ,,_UserName_,_Password_) при создании где устанавливаются свойства у транспорта if (!String.IsNullOrWhiteSpace(UserName)) { factory1.Credentials.UserName.UserName = UserName; factory1.Credentials.UserName.Password = Password; } Смотри 257 |
|||
284
DES
02.10.14
✎
13:46
|
_client - так это же моя структура , в ней есть эти поля (пароль и логин).
как я приконекчусь к базе если я не заполнил поля моей структуры ? |
|||
285
Serginio1
02.10.14
✎
13:49
|
Кстати почитай для интереса
http://msdn.microsoft.com/ru-ru/library/ms178685(v=vs.100).aspx |
|||
286
Serginio1
02.10.14
✎
13:52
|
(284) Еще раз посмотри 257. Там создается транспорт и устанавливается Credentials.
Данные передаются транспортом. Так или иначе ты используешь методы IService, так как ServiceClient реализует этот интерфейс |
|||
287
Serginio1
02.10.14
✎
13:58
|
Почитай для интереса
http://rsdn.ru/article/dotnet/WCF_MultithreadClient.xml |
|||
288
DES
02.10.14
✎
14:01
|
дело в том что я не могу проверить коннект, эти еще не открыли доступ.
|
|||
289
Serginio1
02.10.14
✎
14:08
|
Ясно.
Кстати в Net можно получить интерфейс из объекта. Для этого в NetObjectToIDispatch45 есть метод ПолучитьИнтерфейс(object obj, string InterfaseName) Например Код на C# ((IClientChannel) proxy).Open(); В 1С будет таким Врап.ПолучитьИнтерфейс(proxy, "IClientChannel").Open() |
|||
290
Serginio1
02.10.14
✎
14:15
|
Но вот в Отличеие от ClientBase вариант СоздатьКлиентаWCFConfigFile нужно самому кэшировать, так как его создание дорогое удовольствие. Но зато упрощает работу с Config файлами. Так основные настройки лежат в Machine.config
Какие то основные настройки ты можешь держать в 1cv7s.exe.config Врап.ЗаменитьConfigFile(ИмяФайлаDLL+".config"); модифицирует 1cv7s.exe.config. Это шорошо когда ты работаешь с одной сборкой, но когда их много это может привести к ошибкам. |
|||
291
DES
02.10.14
✎
14:28
|
а еще вопрос по ходу,
они в мануале пишут что можно в передаваемом XML передавать и цифровую подпись документа. не знаешь случаем как его сгенерировать ? |
|||
292
DES
02.10.14
✎
14:28
|
в смысле - саму подпись
|
|||
293
Serginio1
02.10.14
✎
15:00
|
Сейчас времени нет. Посмотрю. Но там наверняка есть примеры
|
|||
294
Serginio1
02.10.14
✎
15:57
|
293+ Я недавно с другой конторой по EDI интегрировал, то они мне предоставили все описания классов для сериализации десериализации объектов в XML.
|
|||
295
DES
02.10.14
✎
16:06
|
"сериализации десериализации" не нужно.
нужно подписать XML |
|||
296
Serginio1
02.10.14
✎
17:05
|
||||
297
DES
02.10.14
✎
18:42
|
спс
|
|||
298
DES
02.10.14
✎
19:35
|
Опс, а как этот метод вытащить в 1с?
|
|||
299
Serginio1
03.10.14
✎
10:23
|
(298) Ну ты можешь добавить класс в свою сборку с именеим
SignVerifyEnvelope И скопировать в создавшийся файл весь код из 296 Только задай ему свой namespace |
|||
300
DES
03.10.14
✎
10:52
|
а можно и в твою ?
|
|||
301
Serginio1
03.10.14
✎
11:17
|
(300) Можешь. Но тогда тебе нужно оборачивать возвращаемые объекты через AutoWrap.ОбернутьОбъект(
и разворачивать поступающиие объекты через AutoWrap.ПолучитьРеальныйОбъект Кроме того, если например я добавлю изменения то тебе нужно будет следить за изменениями. Проще добавить в ту сборку где это используется. Или написать функцию в 1С. |
|||
302
DES
03.10.14
✎
11:52
|
поясни, есть класс
SignedXml - класс мне достаточно включить его в мою DLL и обращаться к нему аналогично как и к ServiceEfactura.ServiceReference ? |
|||
303
DES
03.10.14
✎
12:16
|
они говорят что это все содержится в сборке System.Security.dll
я такую нашел в C:\Windows\Microsoft.NET\Framework\v4.0.30319 так может ее заюзать также как и мою? |
|||
304
Serginio1
03.10.14
✎
12:27
|
(302) Да
|
|||
305
Serginio1
03.10.14
✎
12:29
|
(303) Еще раз смотрим ссылку которую я тебе дал
http://msdn.microsoft.com/ru-ru/library/system.security.cryptography.xml.signedxml(v=vs.110).aspx И смотрим используемые пространства имен using System; using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates; using System.Security.Cryptography.Xml; using System.Text; using System.Xml; |
|||
306
Serginio1
03.10.14
✎
12:32
|
При добавлении в проект нужно
Проект/ДобавитьСсылку/Сборки/Платформа отметить System.Security |
|||
307
DES
03.10.14
✎
13:02
|
я вот так что то делаю и что-то там получается (сам пока не понимаю)
ИмяФайлаDLL2 = КаталогИБ()+"System.Security.dll"; namespace2 = "System.Security.Cryptography.Xml."; Сборка2 = Врап.загрузитьСборку(ИмяФайлаDLL2); TChannel2 = Сборка2.GetType(namespace2 + "SignedXml"); SignedXml = Врап.СоздатьОбъект(TChannel2); //в отладчике вижу //SignedXml = OLE._AutoWrap //SignedXml.Signature = OLE._AutoWrap ИмяФайлаDLL3 = КаталогИБ()+"mscorlib.dll"; namespace3 = "System.Security.Cryptography."; Сборка3 = Врап.загрузитьСборку(ИмяФайлаDLL3); // RSACryptoServiceProvider Key = new RSACryptoServiceProvider(); // пример на c# TChannel3 = Сборка3.GetType(namespace3 + "RSACryptoServiceProvider"); RSACryptoServiceProvider = Врап.СоздатьОбъект(TChannel3); //в отладчике вижу //RSACryptoServiceProvider = OLE._AutoWrap |
|||
308
DES
03.10.14
✎
13:22
|
подскажи, как в мою dll засунуть метод
MyNamespace.OnlyOne(Par) { Функция OnlyOne(Вход) Возврат Вход КонецФункции } чтобы в 1С можно было вызвать и получить результат. |
|||
309
DES
03.10.14
✎
13:37
|
(306) и этого достаточно чтобы в моей сборке появились методы крипто ?
|
|||
310
Serginio1
03.10.14
✎
13:56
|
(307) Если хочешь загрузить сборку из GAC то есть два способа
Сборка=врап.ПолучитьТип("System.Reflection.Assembly").Load("System.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"); Или Сборка.ПолучитьТип(namespace3 + "RSACryptoServiceProvider+",System.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"); Но проще создать методы подписи в сборке WCF клиента и уже из 1С вызывать вспоминая пространства имен итд. |
|||
311
Serginio1
03.10.14
✎
13:58
|
(309) да смотри 299,306
|
|||
312
DES
03.10.14
✎
14:04
|
тадет ошибку на
_client = ПолучитьКлиента(); _client.Close(); {S:\LX\EXTFORMS\NETEFACTURA.ERT(32)}: Поле агрегатного объекта не обнаружено (Close) - это уже не актуально ? |
|||
313
Serginio1
03.10.14
✎
14:24
|
(312) Если ты про вариант создания клиента через
СоздатьКлиентаWCFConfigFile то лучше его держать в переменной, так как его создание в отличие от ServerClient дороги И у интерфейса IService такого метода нет. |
|||
314
Serginio1
03.10.14
✎
14:25
|
(312) То есть Сервис заработал?
|
|||
315
DES
03.10.14
✎
14:28
|
Сделал (306)
делаю для // RSACryptoServiceProvider Key = new RSACryptoServiceProvider(); namespace3 = "System.Security.Cryptography."; TypeRSACryptoServiceProvider = Сборка.GetType(namespace3 + "RSACryptoServiceProvider"); RSACryptoServiceProvider = Врап.СоздатьОбъект(TypeRSACryptoServiceProvider); не идет (сборка новая, подключение старое) |
|||
316
Serginio1
03.10.14
✎
14:32
|
(315) Ты читай, что я тебе пишу. Смотри 310. У LoadFrom куча ограничений.
|
|||
317
Serginio1
03.10.14
✎
14:33
|
(315) Опять же еще раз повторю, код подписи лучше сделать в сборке WCF клиента.
|
|||
318
DES
03.10.14
✎
14:34
|
(315) понимаешь, я читаю, но не понимаю.
мне нужен работающий пример, я по аналогии разберусь. |
|||
319
DES
03.10.14
✎
14:35
|
"сделать в сборке WCF клиента." - для меня не понятно.
понятно - сделать "в другой сборке | в другом файле и т.д." |
|||
320
Serginio1
03.10.14
✎
14:41
|
Еще раз. Зайди в Проект.
Проект/Добавить класс. Назови его SignVerifyEnvelope И скопируй код из http://msdn.microsoft.com/ru-ru/library/system.security.cryptography.xml.signedxml(v=vs.110).aspx Только добавь Класс в namespace ПодписьXML {} Тогда для того, что бы пописать тебе нужно Сборка.ПолучитьТип("ПодписьXML.SignVerifyEnvelope").SignXmlFile(FileName, SignedFileName, Key,ElementsToSign) |
|||
321
Serginio1
03.10.14
✎
14:46
|
Ну почитай ты предметную область. Нельзя же так.
Твой проект ServiceEfactura из которого у тебя и создается ServiceEfactura.dll Он содержит данные доступа к твему Вэб сервису http://msdn.microsoft.com/ru-ru/library/ms731079(v=vs.110).aspx |
|||
322
DES
03.10.14
✎
15:24
|
Только добавь Класс в
namespace ПодписьXML как это сделать ? |
|||
323
Serginio1
03.10.14
✎
15:27
|
(322) Ты класс добавил?
|
|||
324
DES
03.10.14
✎
15:29
|
да
|
|||
325
DES
03.10.14
✎
15:30
|
using System;
using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ServiceEfactura { class SignVerifyEnvelope { // Sign an XML file and save the signature in a new file. This method does not // save the public key within the XML file. This file cannot be verified unless // the verifying code has the key with which it was signed. public static void SignXmlFile(string FileName, string SignedFileName, RSA Key) { // Create a new XML document. XmlDocument doc = new XmlDocument(); // Load the passed XML file using its name. doc.Load(new XmlTextReader(FileName)); // Create a SignedXml object. SignedXml signedXml = new SignedXml(doc); // Add the key to the SignedXml document. signedXml.SigningKey = Key; // Create a reference to be signed. Reference reference = new Reference(); reference.Uri = ""; // Add an enveloped transformation to the reference. XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform(); reference.AddTransform(env); // Add the reference to the SignedXml object. signedXml.AddReference(reference); // Compute the signature. signedXml.ComputeSignature(); // Get the XML representation of the signature and save // it to an XmlElement object. XmlElement xmlDigitalSignature = signedXml.GetXml(); // Append the element to the XML document. doc.DocumentElement.AppendChild(doc.ImportNode(xmlDigitalSignature, true)); if (doc.FirstChild is XmlDeclaration) { doc.RemoveChild(doc.FirstChild); } // Save the signed XML document to a file specified // using the passed string. XmlTextWriter xmltw = new XmlTextWriter(SignedFileName, new UTF8Encoding(false)); doc.WriteTo(xmltw); xmltw.Close(); } // Verify the signature of an XML file against an asymetric // algorithm and return the result. public static Boolean VerifyXmlFile(String Name, RSA Key) { // Create a new XML document. XmlDocument xmlDocument = new XmlDocument(); // Load the passed XML file into the document. xmlDocument.Load(Name); // Create a new SignedXml object and pass it // the XML document class. SignedXml signedXml = new SignedXml(xmlDocument); // Find the "Signature" node and create a new // XmlNodeList object. XmlNodeList nodeList = xmlDocument.GetElementsByTagName("Signature"); // Load the signature node. signedXml.LoadXml((XmlElement)nodeList[0]); // Check the signature and return the result. return signedXml.CheckSignature(Key); } // Create example data to sign. public static void CreateSomeXml(string FileName) { // Create a new XmlDocument object. XmlDocument document = new XmlDocument(); // Create a new XmlNode object. XmlNode node = document.CreateNode(XmlNodeType.Element, "", "MyElement", "samples"); // Add some text to the node. node.InnerText = "Example text to be signed."; // Append the node to the document. document.AppendChild(node); // Save the XML document to the file name specified. XmlTextWriter xmltw = new XmlTextWriter(FileName, new UTF8Encoding(false)); document.WriteTo(xmltw); xmltw.Close(); } } } |
|||
326
DES
03.10.14
✎
15:30
|
это SignVerifyEnvelope.cs
|
|||
327
Serginio1
03.10.14
✎
15:33
|
Лучше замени
namespace ServiceEfactura на namespace ServiceEfactura ПодписьXML Что бы избавиться от коллизий. |
|||
328
DES
03.10.14
✎
15:36
|
оно само назначилось
и не понял на какое заменить ? |
|||
329
DES
03.10.14
✎
15:37
|
Ошибка 1 Не удалось найти имя типа или пространства имен "RSA" (пропущена директива using или ссылка на сборку?) S:\LX\С\ServiceEfacturaSign\ClassLibrary1\SignVerifyEnvelope.cs 14 80 ServiceEfactura
|
|||
330
Serginio1
03.10.14
✎
15:38
|
Напиши
namespace ПодписьXML |
|||
331
Serginio1
03.10.14
✎
15:38
|
Смотри 305
|
|||
332
DES
03.10.14
✎
15:38
|
public static void SignXmlFile(string FileName, string SignedFileName, RSA Key)
RSA - откуда брать ? |
|||
333
DES
03.10.14
✎
15:39
|
понял
|
|||
334
Serginio1
03.10.14
✎
15:40
|
(332)
RSACryptoServiceProvider Key = new RSACryptoServiceProvider(); Смотри код public static void Main(String[] args) { try { // Generate a signing key. RSACryptoServiceProvider Key = new RSACryptoServiceProvider(); // Create an XML file to sign. CreateSomeXml("Example.xml"); Console.WriteLine("New XML file created."); // Sign the XML that was just created and save it in a // new file. SignXmlFile("Example.xml", "signedExample.xml", Key); Console.WriteLine("XML file signed."); // Verify the signature of the signed XML. Console.WriteLine("Verifying signature..."); bool result = VerifyXmlFile("SignedExample.xml", Key); // Display the results of the signature verification to // the console. if(result) { Console.WriteLine("The XML signature is valid."); } else { Console.WriteLine("The XML signature is not valid."); } } catch(CryptographicException e) { Console.WriteLine(e.Message); } } |
|||
335
Serginio1
03.10.14
✎
15:41
|
Смотри 306
|
|||
336
DES
03.10.14
✎
15:52
|
да прошло без ошибок. как посмотреть куда готовую dll VS кидает ?
|
|||
337
DES
03.10.14
✎
15:54
|
какое действие окончательно делать ?
"Собрать решение" ? |
|||
338
Serginio1
03.10.14
✎
15:57
|
(336) А как до этого ты свою Dll искал?
Вообщ в зависимости от того какой у тебя режим Debug или Release то сохраняется в \ИмяПроекта\bin\Debug\ или \ИмяПроекта\bin\Release\ аналогично в obj |
|||
339
Serginio1
03.10.14
✎
16:00
|
||||
340
DES
03.10.14
✎
16:10
|
сделал
теперь делаю TypeRSACryptoServiceProvider = Сборка.ПолучитьТип("ПодписьXML.SignVerifyEnvelope"); RSACryptoServiceProvider = Врап.СоздатьОбъект(TypeRSACryptoServiceProvider); или что то не так ? |
|||
341
Serginio1
03.10.14
✎
16:15
|
TypeRSACryptoServiceProvider = Сборка.ПолучитьТип("System.Security.Cryptography.RSA");
|
|||
342
Serginio1
03.10.14
✎
16:20
|
SignVerifyEnvelope у тебя имеет методы
SignXmlFile VerifyXmlFile Можешь Добавить еще статический метод public static void ПодписатьФайл(string FileName, string SignedFileName) { // Generate a signing key. RSACryptoServiceProvider Key = new RSACryptoServiceProvider(); SignXmlFile(FileName, SignedFileName, Key); } |
|||
343
DES
03.10.14
✎
16:23
|
TypeRSACryptoServiceProvider = Сборка.ПолучитьТип("System.Security.Cryptography.RSA");
{S:\LX\EXTFORMS\NETEFACTURA.ERT(97)}: Поле агрегатного объекта не обнаружено (ПолучитьТип) |
|||
344
Serginio1
03.10.14
✎
16:23
|
То есть вывести в сборку основную часть кода, для минимизации кодирования в 1С.
Для отладки библиотеки можно воспользоваться двумя путями. В проекте Свойства проекта/Отладка/Запуск Внешней Программы выбрать 1С 1cv7.exe Или Отладка/Присоединиться к процессу |
|||
345
Serginio1
03.10.14
✎
16:24
|
врап.ПолучитьТип("System.Security.Cryptography.RSA");
|
|||
346
DES
03.10.14
✎
16:27
|
Зачем "Добавить еще статический метод" ?
что дает ? мне нужно еще из хранилища ключей ключ доставать и подстаавлять |
|||
347
Serginio1
03.10.14
✎
16:28
|
(346) 344
|
|||
348
DES
03.10.14
✎
16:33
|
TypeRSACryptoServiceProvider = Врап.ПолучитьТип("System.Security.Cryptography.RSA");
и как это TypeRSACryptoServiceProvider теперь использовать ? на чем СоздатьОбъект(TypeRSACryptoServiceProvider) делать ? |
|||
349
Serginio1
03.10.14
✎
16:37
|
(348) 332
А вообще смотри про сертификаты http://msdn.microsoft.com/ru-ru/library/system.security.cryptography.x509certificates.publickey(v=vs.110).aspx |
|||
350
DES
03.10.14
✎
16:39
|
(349) как до метода SignXmlFile() достучаться ?
|
|||
351
Serginio1
03.10.14
✎
16:44
|
(350) А подумать?
1. В каком классе описан SignXmlFile? 2. Если это статический метод, то нужно вызвать метод типа. 3. Если это объектный метод то нужно воспользоваться Врап.СоздатьОбъект |
|||
352
DES
03.10.14
✎
16:54
|
как 2 выполняется ?
если 3 дает ошибку |
|||
353
Serginio1
03.10.14
✎
17:01
|
(352) Смотрим
public static void SignXmlFile(string FileName, string SignedFileName, RSA Key) И видим ключевое слово static. Как нам вызвать статический метод? |
|||
354
DES
03.10.14
✎
17:07
|
Да откуда я знаю ?
|
|||
355
DES
03.10.14
✎
17:07
|
они для меня на одно лицо
|
|||
356
Serginio1
03.10.14
✎
17:10
|
(355) Поэтому лучше на выходных взять книжку по основам C#
Кстати решение было в 35 постов ранее |
|||
357
Serginio1
03.10.14
✎
17:12
|
Вернее
Сборка.GetType("ПодписьXML.SignVerifyEnvelope").SignXmlFile(FileName, SignedFileName, Key,ElementsToSign) |
|||
358
DES
03.10.14
✎
17:18
|
откуда 4 параметр ?
|
|||
359
DES
03.10.14
✎
17:23
|
(357) так я это видел, я хотел, для системы, разбить на две части
ф = Сборка.GetType("ПодписьXML.SignVerifyEnvelope"); й = ф.SignXmlFile(FileName, SignedFileName, Key,ElementsToSign); так как то привычней |
|||
360
DES
03.10.14
✎
17:28
|
a = Сборка.GetType("ПодписьXML.SignVerifyEnvelope").SignXmlFile(FileName, SignedFileName, Key,ElementsToSign);
{S:\LX\EXTFORMS\NETEFACTURA.ERT(104)}: Неизвестная ошибка Ошибка в методе SignXmlFile Не найден метод "ПодписьXML.SignVerifyEnvelope".mscorlib |
|||
361
Serginio1
03.10.14
✎
17:28
|
(358) Там в в последнем примере был
public static void SignXmlFile(string FileName, string SignedFileName, RSA Key, string[] ElementsToSign) { // Check the arguments. if (FileName == null) throw new ArgumentNullException("FileName"); if (SignedFileName == null) throw new ArgumentNullException("SignedFileName"); if (Key == null) throw new ArgumentNullException("Key"); if (ElementsToSign == null) throw new ArgumentNullException("ElementsToSign"); // Create a new XML document. XmlDocument doc = new XmlDocument(); // Format the document to ignore white spaces. doc.PreserveWhitespace = false; // Load the passed XML file using it's name. doc.Load(new XmlTextReader(FileName)); // Create a SignedXml object. SignedXml signedXml = new SignedXml(doc); // Add the key to the SignedXml document. signedXml.SigningKey = Key; // Loop through each passed element to sign // and create a reference. foreach (string s in ElementsToSign) { // Create a reference to be signed. Reference reference = new Reference(); reference.Uri = s; // Add an enveloped transformation to the reference. XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform(); reference.AddTransform(env); // Add the reference to the SignedXml object. signedXml.AddReference(reference); } // Add an RSAKeyValue KeyInfo (optional; helps recipient find key to validate). KeyInfo keyInfo = new KeyInfo(); keyInfo.AddClause(new RSAKeyValue((RSA)Key)); signedXml.KeyInfo = keyInfo; // Compute the signature. signedXml.ComputeSignature(); // Get the XML representation of the signature and save // it to an XmlElement object. XmlElement xmlDigitalSignature = signedXml.GetXml(); // Append the element to the XML document. doc.DocumentElement.AppendChild(doc.ImportNode(xmlDigitalSignature, true)); if (doc.FirstChild is XmlDeclaration) { doc.RemoveChild(doc.FirstChild); } // Save the signed XML document to a file specified // using the passed string. XmlTextWriter xmltw = new XmlTextWriter(SignedFileName, new UTF8Encoding(false)); doc.WriteTo(xmltw); xmltw.Close(); } |
|||
362
Serginio1
03.10.14
✎
17:29
|
(360) Правильно потому, что у тебя нет этого метода
a = Сборка.GetType("ПодписьXML.SignVerifyEnvelope").SignXmlFile(FileName, SignedFileName,Key) |
|||
363
Serginio1
03.10.14
✎
17:31
|
Вернее правильнее будет
ф.SignXmlFile(FileName, SignedFileName, Key) |
|||
364
DES
03.10.14
✎
17:41
|
Блин, я уже перепробовал все варианты - ни один не подходит
как правильно то? |
|||
365
Serginio1
03.10.14
✎
17:47
|
Во первых ты сборку с SignXmlFile скомпилировал и скопировал в нужную директорию?
|
|||
366
Serginio1
03.10.14
✎
17:48
|
Еще раз проверь пространство имен у SignVerifyEnvelope
|
|||
367
Serginio1
03.10.14
✎
17:49
|
Давай до понедельника. Почитай книгу по C# и многое сразу всанет на свои места. Нельзя так браться с кандачка
|
|||
368
DES
03.10.14
✎
17:51
|
using System;
using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates; using System.Security.Cryptography.Xml; using System.Xml; namespace ПодписьXML { class SignVerifyEnvelope { // Sign an XML file and save the signature in a new file. This method does not // save the public key within the XML file. This file cannot be verified unless // the verifying code has the key with which it was signed. public static void SignXmlFile(string FileName, string SignedFileName, RSA Key) |
|||
369
Serginio1
03.10.14
✎
17:56
|
Вообще есть http://www.red-gate.com/products/dotnet-development/reflector/
программка Reflector.exe с помощью которой можно просмотреть классы и методы сборки Значит имя класса ПодписьXML.SignXmlFile Два варианта вызова a = Сборка.GetType("ПодписьXML.SignXmlFile").SignXmlFile(FileName, SignedFileName,Key) a = Врап.ПолучитьТип("ПодписьXML.SignXmlFile").SignXmlFile(FileName, SignedFileName,Key) |
|||
370
Serginio1
03.10.14
✎
17:59
|
Тьфу имя класса
и вызов ПодписьXML.SignVerifyEnvelope a = Сборка.GetType("ПодписьXML.SignVerifyEnvelope").SignXmlFile(FileName, SignedFileName,Key) a = Врап.ПолучитьТип("ПодписьXML.SignVerifyEnvelope").SignXmlFile(FileName, SignedFileName,Key) Все пока дозавтра. Читай предметную часть |
|||
371
DES
03.10.14
✎
18:06
|
ни а ни б не взлетело
a = Сборка.GetType("ПодписьXML.SignVerifyEnvelope").SignXmlFile(FileName, SignedFileName,Key); б = Врап.ПолучитьТип("ПодписьXML.SignVerifyEnvelope").SignXmlFile(FileName, SignedFileName,Key); |
|||
372
DES
03.10.14
✎
18:21
|
||||
373
DES
03.10.14
✎
18:30
|
a = Врап.ПолучитьТип("ПодписьXML.SignVerifyEnvelope").CreateSomeXml(FileName);
прошло. |
|||
374
Serginio1
03.10.14
✎
20:57
|
Значит в
б = Врап.ПолучитьТип("ПодписьXML.SignVerifyEnvelope").SignXmlFile(FileName, SignedFileName,Key); передаешь неправильные параметры. Покажи скрин ошибки |
|||
375
Serginio1
03.10.14
✎
21:00
|
Ну и SignXmlFile вообще то ничего не возвращает
просто вызов Врап.ПолучитьТип("ПодписьXML.SignVerifyEnvelope").SignXmlFile(FileName, SignedFileName,Key); смотри что в итоге у тебя в SignedFileName |
|||
376
DES
03.10.14
✎
21:22
|
да, спс. Все прокатило.
Сейчас гоняю как достать сертификат из личного хранилища. |
|||
377
Serginio1
03.10.14
✎
21:24
|
(376) Давай. Удачи.
|
|||
378
DES
03.10.14
✎
21:28
|
запускаю вот это
public static void DirCert() { X509Store store = new X509Store("MY",StoreLocation.CurrentUser); store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly); X509Certificate2Collection collection = (X509Certificate2Collection)store.Certificates; X509Certificate2Collection fcollection = (X509Certificate2Collection)collection.Find(X509FindType.FindByTimeValid,DateTime.Now,false); X509Certificate2Collection scollection = X509Certificate2UI.SelectFromCollection(fcollection, "Test Certificate Select","Select a certificate from the following list to get information on that certificate",X509SelectionFlag.MultiSelection); Console.WriteLine("Number of certificates: {0}{1}",scollection.Count,Environment.NewLine); foreach (X509Certificate2 x509 in scollection) { try { byte[] rawdata = x509.RawData; Console.WriteLine("Content Type: {0}{1}",X509Certificate2.GetCertContentType(rawdata),Environment.NewLine); Console.WriteLine("Friendly Name: {0}{1}",x509.FriendlyName,Environment.NewLine); Console.WriteLine("Certificate Verified?: {0}{1}",x509.Verify(),Environment.NewLine); Console.WriteLine("Simple Name: {0}{1}",x509.GetNameInfo(X509NameType.SimpleName,true),Environment.NewLine); Console.WriteLine("Signature Algorithm: {0}{1}",x509.SignatureAlgorithm.FriendlyName,Environment.NewLine); Console.WriteLine("Private Key: {0}{1}",x509.PrivateKey.ToXmlString(false),Environment.NewLine); Console.WriteLine("Public Key: {0}{1}",x509.PublicKey.Key.ToXmlString(false),Environment.NewLine); Console.WriteLine("Certificate Archived?: {0}{1}",x509.Archived,Environment.NewLine); Console.WriteLine("Length of Raw Data: {0}{1}",x509.RawData.Length,Environment.NewLine); X509Certificate2UI.DisplayCertificate(x509); x509.Reset(); } catch (CryptographicException) { Console.WriteLine("Information could not be written out for this certificate."); } } store.Close(); } пишет ошибка в 142 строке. Как включить нумерацию строк? |
|||
379
DES
03.10.14
✎
21:32
|
||||
380
DES
03.10.14
✎
21:34
|
менюшка с выводом списка существующих сертиф, выводится. можно выбрать. После выбора вылетает ошибка. На отладчике тоже не тормозит. может ошибка в этой строке с точкой ?
|
|||
381
Serginio1
03.10.14
✎
21:35
|
Так на какую консоль то ты выводишь? Почитай предметную часть. Потрать время. Зато затем ты это время выиграешь.
http://msdn.microsoft.com/ru-ru/library/system.console(v=vs.110).aspx Записывай в List<string> и выводи в 1С |
|||
382
DES
03.10.14
✎
21:37
|
ну по идее консоль это экранчик как у Ошибок.
|
|||
383
Serginio1
03.10.14
✎
21:38
|
А у тебя есть сертификаты?
http://msdn.microsoft.com/ru-ru/library/bfsktky3(v=vs.110).aspx |
|||
384
Serginio1
03.10.14
✎
21:39
|
||||
385
Serginio1
03.10.14
✎
21:45
|
||||
386
Serginio1
03.10.14
✎
21:55
|
http://msdn.microsoft.com/ru-ru/library/ms229744(v=vs.110).aspx
Шифрование XML-элемента с помощью сертификата X.509 Воспользуйтесь Makecert.exe (средство создания сертификатов) для создания тестового сертификата X.509 и разместите его в хранилище локального пользователя. Необходимо создать ключ обмена и сделать его экспортируемым. Выполните следующую команду: makecert -r -pe -n "CN=XML_ENC_TEST_CERT" -b 01/01/2005 -e 01/01/2010 -sky exchange -ss my Создайте объект X509Store и инициализируйте его, чтобы открыть хранилище текущего пользователя. C#VB X509Store store = new X509Store(StoreLocation.CurrentUser); Откройте хранилище в режиме "только для чтения". C#VB store.Open(OpenFlags.ReadOnly); Инициализируйте коллекцию X509Certificate2Collection, включив в нее все сертификаты, размещенные в хранилище. C#VB X509Certificate2Collection certCollection = store.Certificates; Выполните перебор сертификатов, размещенных в хранилище, чтобы найти сертификат с соответствующим именем. В этом примере сертификат имеет имя "CN=XML_ENC_TEST_CERT". C#VB X509Certificate2 cert = null; // Loop through each certificate and find the certificate // with the appropriate name. foreach (X509Certificate2 c in certCollection) { if (c.Subject == "CN=XML_ENC_TEST_CERT") { cert = c; break; } } После нахождения нужного сертификата закройте хранилище. C#VB store.Close(); Создайте объект XmlDocument путем загрузки XML-файла с диска. Объект XmlDocument содержит XML-элемент, подлежащий шифрованию. C#VB XmlDocument xmlDoc = new XmlDocument(); Найдите указанный элемент в объекте XmlDocument и создайте новый объект XmlElement, который будет представлять элемент, подлежащий шифрованию. В этом примере производится шифрование элемента "creditcard". C#VB XmlElement elementToEncrypt = Doc.GetElementsByTagName(ElementToEncrypt)[0] as XmlElement; Создайте новый экземпляр класса EncryptedXml и используйте его для шифрования указанного элемента с помощью сертификата X.509. Метод Encrypt возвращает зашифрованный элемент в виде объекта EncryptedData. C#VB EncryptedXml eXml = new EncryptedXml(); // Encrypt the element. EncryptedData edElement = eXml.Encrypt(elementToEncrypt, Cert); Замените элемент из исходного объекта XmlDocument элементом EncryptedData. C#VB EncryptedXml.ReplaceElement(elementToEncrypt, edElement, false); Сохраните объект XmlDocument. C#VB xmlDoc.Save("test.xml"); Пример В этом примере предполагается, что файл с именем "test.xml" существует в том же каталоге, что и скомпилированная программа. Также предполагается, что файл "test.xml" содержит элемент "creditcard". Можно поместить следующий XML-код в файл с именем test.xml и использовать его в данном примере. <root> <creditcard> <number>19834209</number> <expiry>02/02/2002</expiry> </creditcard> </root> C#VB using System; using System.Xml; using System.Security.Cryptography; using System.Security.Cryptography.Xml; using System.Security.Cryptography.X509Certificates; class Program { static void Main(string[] args) { try { // Create an XmlDocument object. XmlDocument xmlDoc = new XmlDocument(); // Load an XML file into the XmlDocument object. xmlDoc.PreserveWhitespace = true; xmlDoc.Load("test.xml"); // Open the X.509 "Current User" store in read only mode. X509Store store = new X509Store(StoreLocation.CurrentUser); store.Open(OpenFlags.ReadOnly); // Place all certificates in an X509Certificate2Collection object. X509Certificate2Collection certCollection = store.Certificates; X509Certificate2 cert = null; // Loop through each certificate and find the certificate // with the appropriate name. foreach (X509Certificate2 c in certCollection) { if (c.Subject == "CN=XML_ENC_TEST_CERT") { cert = c; break; } } if (cert == null) { throw new CryptographicException("The X.509 certificate could not be found."); } // Close the store. store.Close(); // Encrypt the "creditcard" element. Encrypt(xmlDoc, "creditcard", cert); // Save the XML document. xmlDoc.Save("test.xml"); // Display the encrypted XML to the console. Console.WriteLine("Encrypted XML:"); Console.WriteLine(); Console.WriteLine(xmlDoc.OuterXml); } catch (Exception e) { Console.WriteLine(e.Message); } } public static void Encrypt(XmlDocument Doc, string ElementToEncrypt, X509Certificate2 Cert) { // Check the arguments. if (Doc == null) throw new ArgumentNullException("Doc"); if (ElementToEncrypt == null) throw new ArgumentNullException("ElementToEncrypt"); if (Cert == null) throw new ArgumentNullException("Cert"); //////////////////////////////////////////////// // Find the specified element in the XmlDocument // object and create a new XmlElemnt object. //////////////////////////////////////////////// XmlElement elementToEncrypt = Doc.GetElementsByTagName(ElementToEncrypt)[0] as XmlElement; // Throw an XmlException if the element was not found. if (elementToEncrypt == null) { throw new XmlException("The specified element was not found"); } ////////////////////////////////////////////////// // Create a new instance of the EncryptedXml class // and use it to encrypt the XmlElement with the // X.509 Certificate. ////////////////////////////////////////////////// EncryptedXml eXml = new EncryptedXml(); // Encrypt the element. EncryptedData edElement = eXml.Encrypt(elementToEncrypt, Cert); //////////////////////////////////////////////////// // Replace the element from the original XmlDocument // object with the EncryptedData element. //////////////////////////////////////////////////// EncryptedXml.ReplaceElement(elementToEncrypt, edElement, false); } } Компиляция кода Для компиляции этого примера может потребоваться включить ссылку на System.Security.dll. Включите следующие пространства имен: System.Xml, System.Security.Cryptography и System.Security.Cryptography.Xml. Безопасность Сертификат X.509, использованный в данном примере, предназначен только для тестирования. Приложения должны использовать сертификаты X.509, созданные доверенным центром сертификации или сервером сертификации Microsoft Windows. |
|||
387
DES
03.10.14
✎
22:02
|
да - это я и тестирую
|
|||
388
Serginio1
03.10.14
✎
23:10
|
Так ты тестируй внутри VS
|
|||
389
Serginio1
03.10.14
✎
23:12
|
Или смотри 344
|
|||
390
Serginio1
03.10.14
✎
23:24
|
||||
391
DES
03.10.14
✎
23:27
|
так по 344 и делаю
|
|||
392
DES
04.10.14
✎
00:02
|
только не могу остановиться на точке останова под отладчиком
сделал сборку в режиме отладки, поставил точку, не тормозит... |
|||
393
Serginio1
04.10.14
✎
00:09
|
И какой способ подключения используешь?
А вообще создай приложение и отлаживай напрямую. |
|||
394
Serginio1
04.10.14
✎
00:34
|
||||
395
DES
04.10.14
✎
12:32
|
А вот почему 1С не находит ?
public static X509Certificate2 DirCert2(string LableKey, int NumKey) RCAkey = Врап.ПолучитьТип("ПодписьXML.SignVerifyEnvelope").DirCert2("TIGHINA",1); пишет не найден метод Reflector http://prntscr.com/4srsuf |
|||
396
DES
04.10.14
✎
22:57
|
без параметров находит а делаю параметры - не находит
|
|||
397
Serginio1
04.10.14
✎
22:57
|
Потому что из-за перегрузок методов нужно передавать нужные типы
В семерке нет типа инт. Поэтому нужно приводить RCAkey = Врап.ПолучитьТип("ПодписьXML.SignVerifyEnvelope").DirCert2("TIGHINA",Врап.ChangeType(Врап.ChangeType("System.Int32",1); |
|||
398
Serginio1
04.10.14
✎
22:59
|
Либо
Парам=врап.ToInt(Строка(1)); RCAkey = Врап.ПолучитьТип("ПодписьXML.SignVerifyEnvelope").DirCert2("TIGHINA",парам); Смотри примеры и читай то, что я пишу. |
|||
399
Serginio1
04.10.14
✎
23:01
|
Парам=Врап.ChangeType("System.Int32",1);
RCAkey = Врап.ПолучитьТип("ПодписьXML.SignVerifyEnvelope").DirCert2("TIGHINA",Парам); |
|||
400
Serginio1
04.10.14
✎
23:02
|
Опятьже децимал беззнаковые не поддерживаются семеркой поэтому такие типы возвращается ввиде строки
|
|||
401
DES
04.10.14
✎
23:07
|
ну могли бы написать про не соответсвие параметров, а не отсутствие модуля
|
|||
402
DES
05.10.14
✎
00:33
|
а как привести тип
public enum StoreLocation ? |
|||
403
Serginio1
05.10.14
✎
01:16
|
свойства enum аналогичны статическм свойствам
врап.ПолучитьТип(Пространствоимен+"StoreLocation").ИмяПеречисления |
|||
404
DES
05.10.14
✎
11:25
|
А как выглядит в 1с ?
byte[] rawdata = x509.RawData; |
|||
405
Faust1976
05.10.14
✎
12:10
|
Может пропустить пункт с работой с ИЕ как с СОМ и отправить данные POST запросом ... реально быстрее работает.
Касательно вашего вопроса у меня в подобной ситуации помогала замена конструкции objDoc.getElementById("EFactura_Agreement1_AccesServiceBtn").Submit(); на лКол = objDoc.getElementById("EFactura_Agreement1_AccesServiceBtn"); лКол.click(); И еще, с таким ID лдин элемент на странице или 2 ? |
|||
406
Serginio1
05.10.14
✎
12:50
|
(404)
http://msdn.microsoft.com/ru-ru/library/system.security.cryptography.x509certificates.storelocation(v=vs.110).aspx ПространствоИмен="System.Security.Cryptography.X509Certificates"; врап.ПолучитьТип(Пространствоимен+"StoreLocation").CurrentUser или StoreLocation=врап.ПолучитьТип(Пространствоимен+"StoreLocation"); значение=StoreLocation.LocalMachine; byte[] rawdata = x509.RawData; в 1С rawdata = x509.RawData; Почитай книгу по основам 1С, рефлексию. Станет намного проще и времени тратить станешь меньше. |
|||
407
DES
05.10.14
✎
15:33
|
(406) да я все понял. я не понял про byte[] rawdata = x509.RawData;
|
|||
408
Serginio1
05.10.14
✎
15:49
|
byte[] это тип.
Еще в шарпе может быть такая запись var rawdata = x509.RawData; так как тип выводится из свойчтва |
|||
409
DES
05.10.14
✎
16:31
|
(408) ну так я не понимаю как в нотации 1С это записать
|
|||
410
DES
05.10.14
✎
16:33
|
(406) Поле агрегатного объекта не обнаружено (Click)
а отладчике кнопка.Type() = "submit" |
|||
411
Serginio1
05.10.14
✎
16:43
|
Так и пиши
rawdata = x509.RawData; Если бы книжку почитал то и таких вопросов не было бы. |
|||
412
DES
05.10.14
✎
18:30
|
(411)
Блин, книжка по Mikrotik ревнует к книжкам по Сертификатам, по C#? по VS и по 1с 8.3 |
|||
413
DES
05.10.14
✎
18:36
|
а как можно элемент enum вывести в 1с в текстовом виде ?
например сообщить ("" + врап.ПолучитьТип(Пространствоимен+"StoreLocation").CurrentUser) |
|||
414
DES
05.10.14
✎
18:41
|
нашел TypeCurrentUser.ToString()
|
|||
415
Serginio1
05.10.14
✎
19:07
|
414 Вообще проще переменную типа лучше называть как называется тип. Тогда все вызовы статических методов и свойств будут как на C#
StoreLocation=врап.ПолучитьТип(Пространствоимен+"StoreLocation"); Сообщить(StoreLocation.CurrentUser.ToString()); При сравнении объектов нужно применять не = А объект1.Equals(Object2)<>0 |
|||
416
Serginio1
05.10.14
✎
19:08
|
||||
417
Serginio1
05.10.14
✎
19:15
|
Для сравнения на больше меньше IComparable CompareTo
http://msdn.microsoft.com/ru-ru/library/System.IComparable(v=vs.110).aspx Если что не забываем метод врап.ПолучитьИнтерфейс(object obj, string InterfaseName) |
|||
418
DES
06.10.14
✎
00:27
|
(417) это для чего например?
|
|||
419
Serginio1
06.10.14
✎
10:17
|
(418) Для сравнения объектов. В C# есть перегрузка не только методов но и операторов.
в 1С ты не сможешь сравнить эти объекты используя <>= В Net нет множественного наследования, но есть поддержка интерфейсов. Так объект может не иметь публичных методов интерфейса, но всегда можно привести объект к определенному интерфейсу и вызвать его методы и свойства |
|||
420
DES
06.10.14
✎
11:39
|
о, спс.
|
|||
421
DES
07.10.14
✎
16:21
|
(381) поясни плиз
Записывай в List<string> и выводи в 1С как выводить отладочные сообщения из DLL ? |
|||
422
Serginio1
07.10.14
✎
16:32
|
(421) Можешь в функции DLL заполнять список отладочной информации и возвращать его в виде результата функции
http://msdn.microsoft.com/ru-ru/library/vstudio/system.collections.specialized.stringcollection(v=vs.110).aspx http://msdn.microsoft.com/ru-ru/library/System.String.Format(v=vs.110).aspx#Format1_Example |
|||
423
Dolphinbet
07.10.14
✎
16:43
|
а такой объект "InternetExplorer.Application" можно создать на сервере?
|
|||
424
DES
07.10.14
✎
17:49
|
на сервере или на чем еще ?
|
|||
425
Serginio1
07.10.14
✎
18:04
|
(424) Он тему праильно не прочитал. в 1С 7.7 нет сервера.
(423) Если нстроить права DCOM должно работать. InternetExplorer.Application ничем не хуже Экселя |
|||
426
Serginio1
07.10.14
✎
18:39
|
||||
427
DES
07.10.14
✎
20:39
|
Блин, никак не соображу соотношение типов
RCA и X509Certificate2 как из одного получить другое ? а то в одних примерах просит одно в других другое. а мне нужно один пример с другим параметром |
|||
428
Serginio1
07.10.14
✎
23:11
|
Тебе нужен AsymmetricAlgorithm для поля SigningKey
http://msdn.microsoft.com/ru-ru/library/system.security.cryptography.xml.signedxml.signingkey(v=vs.110).aspx у X509Certificate2 есть 2 свойства public AsymmetricAlgorithm PrivateKey { get; set; } для подписи http://msdn.microsoft.com/ru-ru/library/system.security.cryptography.x509certificates.x509certificate2.privatekey(v=vs.110).aspx и X509Certificate2.PublicKey для верификации http://msdn.microsoft.com/ru-ru/library/system.security.cryptography.x509certificates.x509certificate2.publickey(v=vs.110).aspx |
|||
429
Serginio1
07.10.14
✎
23:16
|
||||
430
Serginio1
07.10.14
✎
23:20
|
||||
431
DES
07.10.14
✎
23:46
|
а RCA что такое?
|
|||
432
Serginio1
07.10.14
✎
23:57
|
http://www.cryptopro.ru/blog/2012/05/16/podpis-soobshchenii-soap-dlya-smev-s-ispolzovaniem-kriptopro-net
(431) http://msdn.microsoft.com/ru-ru/library/system.security.cryptography.rsa(v=vs.110).aspx public abstract class RSA : AsymmetricAlgorithm |
|||
433
DES
09.10.14
✎
16:29
|
Где то тут было вроде бы как подключиться к существующему экземпляру IE ?
|
|||
434
DES
09.10.14
✎
16:44
|
Так удалось им подключится или нет ?
|
|||
435
Serginio1
09.10.14
✎
17:00
|
||||
436
DES
09.10.14
✎
20:53
|
а как закрыть задачу IE через API ?
|
|||
437
Torquader
09.10.14
✎
22:48
|
Ie.Quit()
|
|||
438
DES
10.10.14
✎
00:58
|
(437) что подразумевают под "ослом"?
|
|||
439
Serginio1
10.10.14
✎
10:20
|
||||
440
DES
12.10.14
✎
00:10
|
вот же ж блин,
через AHK ie.document.getElementById("ctl00_body_EFactura_Agreement1_AccesServiceBtn").click() работает а через 1С ie.document.getElementById("ctl00_body_EFactura_Agreement1_AccesServiceBtn").click() пишет что кнопка не click |
|||
441
DES
12.10.14
✎
20:25
|
Может есть какие другие библиотеки для доступа к IE ?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |