Имя: Пароль:
1C
1C 7.7
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
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
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 ?