Вход | Регистрация
    1  2  3  4  5   
1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: API IE из 1с 7.7

v7: API IE из 1с 7.7
Я
   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)

почему так ?
раньше на других страницах вроде бы этот код работал.
   Serginio1
 
201 - 29.09.14 - 00:56
Давай завтра. Посмотри примеры там многое есть
   Serginio1
 
202 - 29.09.14 - 00:57
Например 
newid = врап.ПолучитьТип("System.Guid").NewGuid().ToString();
   DES
 
203 - 29.09.14 - 01:05
большое спасибо тебе.
   Serginio1
 
204 - 29.09.14 - 01:15
Для получения List
нужно немного повозиться
ТипЛист=Врап.ПолучитьТип("System.Collections.Generic.List`1");
ТипInvoiceIndentificator =Врап.ПолучитьТип("InvoiceIndentificator ");
ТипизированныйЛист=ТипЛист.MakeGenericType(ТипКанала);
(ТипInvoiceIndentificator);
SeriaAndNumbers=Врап.СоздатьОбъект(ТипизированныйЛист);
   DES
 
205 - 29.09.14 - 11:10
все, победил на локальном компе. загрузил config и пошло.
   Serginio1
 
206 - 29.09.14 - 11:11
привязка.Security.Message.ClientCredentialType =  врап.ПолучитьТип("BasicHttpMessageCredentialType").TransportWithMessageCredential;
   Serginio1
 
207 - 29.09.14 - 11:12
(205) Поздравляю. Не так уж и сложно дажн незная C#
   Serginio1
 
208 - 29.09.14 - 12:26
привязка.Security.Mode = врап.ПолучитьТип( System.ServiceModel.SecurityMode).TransportWithMessageCredential;

привязка.Security.Message.ClientCredentialType =  врап.ПолучитьТип( "System.ServiceModel.BasicHttpMessageCredentialType").UserName    
;
   DES
 
209 - 29.09.14 - 12:35
привязка - откуда взялось ?
   DES
 
210 - 29.09.14 - 12:38
ТипЛист=Врап.ПолучитьТип("System.Collections.Generic.List`1");
ТипInvoiceIndentificator =Врап.ПолучитьТип("InvoiceIndentificator ");
Это прошло
а
ниже не понял что за ТипКанала
ТипизированныйЛист=ТипЛист.MakeGenericType(ТипКанала);
   Serginio1
 
211 - 29.09.14 - 13:26
(210) Это я скопировал неудачно.
ТипизированныйЛист=ТипЛист.MakeGenericType(ТипInvoiceIndentificator);
   DES
 
212 - 29.09.14 - 13:44
но до этого

ТипInvoiceIndentificator = Врап.ПолучитьТип("InvoiceIndentificator");
{S:\LX\EXTFORMS\NET_.ERT(23)}: NetObjetToIDispatch45:  неверный тип InvoiceIndentificator
   Serginio1
 
213 - 29.09.14 - 13:52
Опять же смотри пространство имен ServiceEfactura.ServiceReference1
ТипInvoiceIndentificator = Врап.ПолучитьТип("ServiceEfactura.ServiceReference1.InvoiceIndentificator");

Просто в шарпе, что бы не писать пространство имен используют юсинги. Не забывай
   DES
 
214 - 29.09.14 - 17:21
ТипизированныйЛист=ТипЛист.MakeGenericType(ТипInvoiceIndentificator);
{S:\LX\EXTFORMS\NET_.ERT(24)}: Поле агрегатного объекта не обнаружено (MakeGenericType)


ТипизированныйЛист=ТипЛист.ПолучитьТип(ТипInvoiceIndentificator);
{S:\LX\EXTFORMS\NET_.ERT(24)}: Поле агрегатного объекта не обнаружено (ПолучитьТип)


makegenerictype - где узнать методы ?
   Serginio1
 
215 - 29.09.14 - 17:31
Что бы получить методы Type его нужно изменить
ТипЛистОбъект=Врап.ТипКакОбъект(ТипЛист);
        ТипизированныйЛист=ТипЛистОбъект.MakeGenericType(ТипInvoiceIndentificator);
   DES
 
216 - 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" ?
   Serginio1
 
217 - 29.09.14 - 17:51
(216) У меня работает.
System.Collections.Generic.List`1 это дженерик тип с одним типом
то бишь System.Collections.Generic.List<T>
   Serginio1
 
218 - 29.09.14 - 17:52
Вот это работает
ТипизированныйЛист=ТипЛистОбъект.MakeGenericType(ТипInvoiceIndentificator);

А вот это не нужно
ТипизированныйЛист=ТипЛист.MakeGenericType(ТипInvoiceIndentificator);
   Serginio1
 
219 - 29.09.14 - 17:55
(217) Ты можешь всегда посмотреть в отладчике
ТипЛистОбъект.AssemblyQualifiedName
   DES
 
220 - 29.09.14 - 18:19
т.е. ТипизированныйЛист - это массив элементов с типом инвойсИдентификатор ?
   Serginio1
 
221 - 29.09.14 - 18:34
Значит тип в большинстве нужен для вызова конструктора объекта и для вызова статических методов и свойств.
Но у типа есть и свои методы и свой тип.
ТипизированныйЛист  это System.Collections.Generic.List<ServiceEfactura.ServiceReference1.InvoiceIndentificator>

 В который ты можешь добавлять через метод Add 
объекты типа ServiceEfactura.ServiceReference1.InvoiceIndentificator

Массив это System.Array
   Serginio1
 
222 - 29.09.14 - 18:36
ТипизированныйЛист   это тип,
а вот 
SeriaAndNumbers=Врап.СоздатьОбъект(ТипизированныйЛист);
это уже типизированный список
   Serginio1
 
223 - 29.09.14 - 18:41
Кстати в строковом виде тип такой
System.Collections.Generic.List`1[[ServiceEfactura.ServiceReference1.InvoiceIndentificator, ТестВэбСервисов, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]
   Serginio1
 
224 - 29.09.14 - 18:42
Тьфу
System.Collections.Generic.List`1[[ServiceEfactura.ServiceReference1.InvoiceIndentificator]]
   DES
 
225 - 29.09.14 - 19:13
(224) а оно нафмга ?
   DES
 
226 - 29.09.14 - 19:18
а как SeriaAndNumbers.add  заюзать ?
   DES
 
227 - 29.09.14 - 20:42
а как будет ForEach для SeriaAndNumbers выглядеть ?
   DES
 
228 - 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);
    КонецЦикла;
   Serginio1
 
229 - 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# есть перегрузка методов, то нужно передавать переменные с нужным типом
   Serginio1
 
230 - 30.09.14 - 10:47
-1 в числовом выражении это и есть истина.
То есть not 0 = -1 для инта
 
 
   DES
 
231 - 30.09.14 - 11:09
так правильно будет ?
SeriaAndNumber = Врап.СоздатьОбъект(ТипInvoiceIndentificator)
   Serginio1
 
232 - 30.09.14 - 11:21
(231) Да.
Просто если ты вызываешь со строковым аргументом, то по строковому представлению ищется тип а затем вызывается конструктор.

Если ты уже получил тип, то можешь использовать его повторно и внутри поиска типа не будет
   DES
 
233 - 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
   DES
 
234 - 30.09.14 - 11:33
И потом вопрос, выходит что этой библиотеке уже известен адрес источника данных?
   Serginio1
 
235 - 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"));

.......
   DES
 
236 - 30.09.14 - 11:56
Все, все завелось, большое спасибо.
   DES
 
237 - 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;
   DES
 
238 - 01.10.14 - 01:09
че то там я напутал
   DES
 
239 - 01.10.14 - 01:14
как это будет по 1с?
var response = _client.GetInvoicesForSigning(request);
   DES
 
240 - 01.10.14 - 01:24
GetInvoicesForSigning  -  Поле агрегатного объекта не обнаружено 
_client - вроде же описан был.
   DES
 
241 - 01.10.14 - 01:37
наверно так
response = сервер.GetAcceptedInvoices(request);
   Serginio1
 
242 - 01.10.14 - 10:35
типСервера = Сборка.GetType("ServiceEfactura.ServiceReference1.ServiceClient");
 сервер = врап.СоздатьОбъект(типСервера);
   Serginio1
 
243 - 01.10.14 - 10:38
Лучше сразу назови _client чтобы не путаться
   DES
 
244 - 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  файл включен  ?
   DES
 
245 - 01.10.14 - 10:56
и еще как получить текст ошибки при запросе ?
(ответ выводится на экран в окне с которого текст не копируется.)
   Serginio1
 
246 - 01.10.14 - 11:42
(244) Да
Вернее просто использовать

типСервера = Сборка.GetType("ServiceEfactura.ServiceReference1.ServiceClient"); 
сервер = врап.СоздатьОбъект(типСервера);

Вообще соединение кэширется и можно каждый раз создавать и закрывать например
 Функция ПолучитьКлиента()
   возврат врап.СоздатьОбъект(типСервера);

 КонецФункции

и _client= ПолучитьКлиента();
.......

_client.Close();


(245) Нет. Вообще создается исключение с описанием ошибки, но 1С почему то не выводит
   DES
 
247 - 01.10.14 - 12:46
откуда взялось это "ServiceEfactura.ServiceReference" ?
   DES
 
248 - 01.10.14 - 12:49
понял namespace
   DES
 
249 - 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");
КонецПроцедуры
//----------------------------------------------------------------------
   DES
 
250 - 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");
КонецПроцедуры
//----------------------------------------------------------------------
   DES
 
251 - 01.10.14 - 14:27
а еще в твоих примерах про System.Web.Services
что с ними можно делать ?
Интересует понажимать кнопки на веб-страницах на ajax
   Serginio1
 
252 - 01.10.14 - 14:44
Есть еще один вариант, 
Перем endpointAddress;
TChannel=Сборка.GetType(namespace + "IService");
    ConfigFile=ИмяФайлаСборки+".config";
    endpointConfigurationName=""BasicHttpBinding_IService";
  //  endpointAddress=Неопределено;

    Клиент=врап.СоздатьКлиентаWCFConfigFile(ConfigFile,TChannel,endpointConfigurationName,endpointAddress);


 Но нужно в конфиг файле прописывать ClientCredentials
   Serginio1
 
253 - 01.10.14 - 15:05
(251)
Там просто примеры подключения к конкретному сервису.

Если хочешьпоиграться с IE то 

Как подключиться к уже существующему OLE-объекту?
   Serginio1
 
254 - 01.10.14 - 15:42
252+ Исправлю СоздатьКлиентаWCFConfigFile, чтобы передавать UserName и Password
   Serginio1
 
255 - 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);
   DES
 
256 - 01.10.14 - 17:28
ничего не понял
   Serginio1
 
257 - 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());


        }
   DES
 
258 - 01.10.14 - 17:35
ну про поддержку понял, а зачем ?
   Serginio1
 
259 - 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);
   DES
 
260 - 01.10.14 - 17:39
какую dll нужно заменить  теперь ?
 
 
   Serginio1
 
261 - 01.10.14 - 17:41
NetObjetToIDispatch45.dll
   DES
 
262 - 01.10.14 - 17:43
а оно где должно лежать ?
   Serginio1
 
263 - 01.10.14 - 17:45
Там где и старая. Ту которую ты регистрировал через
РегистрацияКомСервера.exe

Но ты её переименй на всякий случай
   DES
 
264 - 01.10.14 - 17:52
имеет значение  где лежит или найдет по %PATH%  ?
   Serginio1
 
265 - 01.10.14 - 17:53
Не имеет, но нужно её зарегистрировать
   DES
 
266 - 01.10.14 - 17:54
по новой регать ?
всмысле я не помню какую зарегал, с какого каталога
   Serginio1
 
267 - 01.10.14 - 17:59
Ну ты можешь найти через RegEdit по ключевому слову NetObjectToIDispatch45
   Serginio1
 
268 - 01.10.14 - 18:00
HKEY_CLASSES_ROOT\CLSID\{DFDADA57-B22C-4276-928A-8B91C9891FF1}\InprocServer32
   DES
 
269 - 01.10.14 - 18:01
я  не пойму как мой код переделать
   Serginio1
 
270 - 01.10.14 - 18:05
(269) Выполнить-RegEdit-Правка-Найти-NetObjectToIDispatch45
Она тебе покажет раздел (268)
в параметр CodeBase путь зарегистрированной тобой DLL
   DES
 
271 - 01.10.14 - 18:20
да не про реестр
я про 1с
   Serginio1
 
272 - 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_;
   DES
 
273 - 01.10.14 - 19:07
возврат врап.СоздатьКлиентаWCFConfigFile(ConfigFile,TChannel,endpointConfigurationName,,_UserName_,_Password_);
{S:\LX\EXTFORMS\NETEFACTURA.ERT(12)}: System.Configuration: Параметр строки 'fileMap.ExeConfigFilename' не может быть пустым или иметь значени
   DES
 
274 - 01.10.14 - 19:08
я правда кинул DLL в system32 и подправил в реестре.
   DES
 
275 - 01.10.14 - 19:13
не. то мой косяк.
а вот это
    _client = ПолучитьКлиента();
    login = _client.ClientCredentials.UserName;
    login.UserName = _UserName_;
    login.Password = _Password_;  
разве это теперь может вызывать ошибку ?
   DES
 
276 - 01.10.14 - 19:17
и вот это дает ошибку
_client.Close();    
{S:\LX\EXTFORMS\NETEFACTURA.ERT(31)}: Поле агрегатного объекта не обнаружено (Close)
   DES
 
277 - 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();    
КонецПроцедуры
   DES
 
278 - 01.10.14 - 19:29
login = _client.ClientCredentials.UserName;
{S:\LX\EXTFORMS\NETEFACTURA.ERT(17)}: Поле агрегатного объекта не обнаружено (ClientCredenti
   DES
 
279 - 01.10.14 - 19:34
и еще в случае неудачи
Врап = СоздатьОбъект("NetObjectToIDispatch45");
как диагностировать ?
   Serginio1
 
280 - 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

 КонецФункции
   Serginio1
 
281 - 02.10.14 - 10:18
(279) Так же как в 270. Если не нашла NetObjectToIDispatch45 то он не зарегестрирован.
При этом библиотека может быть заркгистрирована ка 32 так и 64 разрядной.
   DES
 
282 - 02.10.14 - 12:51
(280) я понимаю что это уже излишне, но почему вылетает с ошибкой?
   Serginio1
 
283 - 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
   DES
 
284 - 02.10.14 - 13:46
_client - так это же моя структура , в ней есть эти поля (пароль и логин).
как я приконекчусь к базе если я не заполнил поля моей структуры ?
   Serginio1
 
285 - 02.10.14 - 13:49
Кстати почитай для интереса
http://msdn.microsoft.com/ru-ru/library/ms178685(v=vs.100).aspx
   Serginio1
 
286 - 02.10.14 - 13:52
(284) Еще раз посмотри 257. Там создается транспорт и устанавливается Credentials.
Данные передаются транспортом.
Так или иначе ты используешь методы IService, так как ServiceClient реализует этот интерфейс
   Serginio1
 
287 - 02.10.14 - 13:58
Почитай для интереса
http://rsdn.ru/article/dotnet/WCF_MultithreadClient.xml
   DES
 
288 - 02.10.14 - 14:01
дело в том что я не могу проверить коннект, эти еще не открыли доступ.
   Serginio1
 
289 - 02.10.14 - 14:08
Ясно.
Кстати в Net можно получить интерфейс из объекта. Для этого
в NetObjectToIDispatch45 есть метод

ПолучитьИнтерфейс(object obj, string InterfaseName)


Например Код на C#

 ((IClientChannel) proxy).Open();

В 1С будет таким
Врап.ПолучитьИнтерфейс(proxy, "IClientChannel").Open()
   Serginio1
 
290 - 02.10.14 - 14:15
Но вот в Отличеие от ClientBase  вариант СоздатьКлиентаWCFConfigFile нужно самому кэшировать, так как его создание дорогое удовольствие. Но зато упрощает работу с Config файлами. Так основные настройки лежат в Machine.config

Какие то основные настройки ты можешь держать в 1cv7s.exe.config
Врап.ЗаменитьConfigFile(ИмяФайлаDLL+".config");
модифицирует 1cv7s.exe.config. Это шорошо когда ты работаешь с одной сборкой, но когда их много это может привести к ошибкам.
   DES
 
291 - 02.10.14 - 14:28
а еще вопрос по ходу,
они в мануале пишут что можно в передаваемом XML передавать и цифровую подпись документа.
не знаешь случаем как его сгенерировать ?
   DES
 
292 - 02.10.14 - 14:28
в смысле - саму подпись
   Serginio1
 
293 - 02.10.14 - 15:00
Сейчас времени нет. Посмотрю. Но там наверняка есть примеры
   Serginio1
 
294 - 02.10.14 - 15:57
293+ Я недавно с другой конторой по EDI интегрировал, то они мне предоставили все описания классов для сериализации десериализации объектов в XML.
   DES
 
295 - 02.10.14 - 16:06
"сериализации десериализации" не нужно.
нужно подписать XML
   Serginio1
 
296 - 02.10.14 - 17:05
   DES
 
297 - 02.10.14 - 18:42
спс
   DES
 
298 - 02.10.14 - 19:35
Опс, а как этот метод вытащить в 1с?
   Serginio1
 
299 - 03.10.14 - 10:23
(298) Ну ты можешь добавить класс в свою сборку с именеим
SignVerifyEnvelope

И скопировать в создавшийся файл весь код из 296

Только задай ему свой namespace
   DES
 
300 - 03.10.14 - 10:52
а можно и в твою ?
  1  2  3  4  5   

Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.