Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Помогите разобраться с одной сборкой .Net.

v7: Помогите разобраться с одной сборкой .Net.
Я
   Maximich
 
09.11.16 - 19:12
Добрый день. Помогите пожалуйста понять почему не хочет работать один из методов сборки .Net

Предыстория: Понадобилось из 7.7 организовать работу с базой mysql на сайте. Есть два варианта:
1) прямой доступ. тут проблем нет, через внешнюю компоненту все работает, но данный метод не подходит из соображений безопасности.
2) через web-сервис. На сайте стоит framework позволяющий работать по протоколу amf3. Нашел решение для .Net https://code.google.com/archive/p/fluorinefx/ которое позволяет настроить обмен данными по протоколу amf. Открыл конфигуратор и множество примеров Serginio1. Удалось загрузить эту сборку, создать объекты и даже проверить работоспособность некоторых методов. Но споткнулся на вызове основного метода.
 
 
   Maximich
 
1 - 09.11.16 - 19:13
Кусок кода из 1С:
net=СоздатьОбъект("NetObjectToIDispatch45");

    сборка = net.ЗагрузитьСборку("C:\Program Files (x86)\FluorineFx\Bin\net\3.5\FluorineFx.dll");
    _netConnection=net.СоздатьОбъект("FluorineFx.Net.NetConnection");
    
    ObjectEncoding = net.ПолучитьТип("FluorineFx.ObjectEncoding");
    _netConnection.ObjectEncoding = ObjectEncoding.AMF3;
    
    _netConnection.Connect("http://127.0.0.1/instrument/eOrder/Amfphp/index.php";);
    _netConnection.Close();
    Сообщить(_netConnection.Connected);
   Maximich
 
2 - 09.11.16 - 19:17
при вызове метода .Connect выскакивают 3 ошибки:

1) Ошибка в методе Connect Не найден метод "FluorineFx.Net.NetConnection.Connect". mscorlib

2) в System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParams)

   в NetObjectToIDispatch45.AutoWrap.InvokeMember(String name, BindingFlags invokeAttr, Binder binder, Object target, Object[] argsOrig, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParameters)

3) InvokeMethod, OptionalParamBinding

Сам метод существует, подозреваю что ругается на строку подключения, может 1С передает ее не в той кодировке ?
   Serginio1
 
3 - 09.11.16 - 19:47
Выложи FluorineFx.dll Завтра посмотрю.
Возможно нужны еще параметры или тип другой.
   Garykom
 
4 - 09.11.16 - 19:51
_netConnection.Connect("http://127.0.0.1/instrument/eOrder/Amfphp/index.php";;);
лишняя ";" в конце перед );
   Garykom
 
5 - 09.11.16 - 19:52
(4)+ или это форум парит?
   Garykom
 
6 - 09.11.16 - 19:56
кста
This library has been deprecated in favour of https://github.com/astralfoxy/rtmp-sharp.
   Garykom
 
7 - 09.11.16 - 19:58
(3) собрать отсюда https://github.com/imiuka/fluorinefx-core
   Maximich
 
8 - 09.11.16 - 19:59
(4) Это форум. в коде их нет
   Maximich
 
9 - 09.11.16 - 20:01
(3) https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/fluorinefx/setup.exe
тут и сама dll и исходники/примеры на c# и chm-файлы. Заранее благодарен
   Maximich
 
10 - 09.11.16 - 20:08
(6) я так понимаю там только исходники ? документации нет, примеров нет, короче для меня еще большая задница )
 
 Рекламное место пустует
   Garykom
 
11 - 09.11.16 - 20:24
сборка = net.ЗагрузитьСборку("C:\Program Files (x86)\FluorineFx\Bin\net\3.5\FluorineFx.dll");

мне очень не нравится x86 и .Net 3.5
   Garykom
 
12 - 09.11.16 - 20:24
(11)+ По хорошему бы пересобрать из исходников под целевую платформу и версию .Net
   Serginio1
 
13 - 09.11.16 - 20:25
(11) Да это не проблема.
(9) Ща посмотрю
   Serginio1
 
14 - 09.11.16 - 20:37
Там
public void Connect(string command, params object[] arguments)

 Нужно во втором параметре передать нулевой массив

Object=net.ПолучитьТип("System.Object"):
аргументы=net.СоздатьМассив(Object, 0);


_netConnection.Connect("http://127.0.0.1/instrument/eOrder/Amfphp/index.php";,аргументы);
   Serginio1
 
15 - 09.11.16 - 20:48
или
аргументы=net.СоздатьМассив("System.Object", 0);
   Serginio1
 
16 - 09.11.16 - 21:42
Кстати http://catalog.mista.ru/public/448668/

Для того, что бы исправлять такие ошибки я добавил  метод ВыполнитьМетод
Который принимает первым параметром тип или  объект
Вторым параметром имя метода, а дальше параметры для запрашиваемого метода
 
Сообщить(Врап.ВыполнитьМетод(String,"Format","загружено {0} из {1} байт. {2}  % complete...",
        e.BytesReceived, 

        e.TotalBytesToReceive,
        e.ProgressPercentage));


В твоем случае это будет
net.ВыполнитьМетод(_netConnection,"Connect",("http://127.0.0.1/instrument/eOrder/Amfphp/index.php";);
   Serginio1
 
17 - 09.11.16 - 23:30
Да еще для 77 нужно прописать

net.УстЭтоСемерка()

 и так как в семерке нет int то

аргументы=net.СоздатьМассив("System.Object",net.ToInt(0));
   Maximich
 
18 - 10.11.16 - 02:42
(17) Спасибо за советы.
при вызове
аргументы=net.СоздатьМассив("System.Object",net.ToInt(0));

выскакивает ошибка
Ошибка в методе [DISPID=0] Не найден метод "System.Int32.ToString". mscorlib

но при этом спокойно отработал код
аргументы=net.СоздатьМассив("System.Object", 0);
_netConnection.Connect("http://127.0.0.1/instrument/eOrder/Amfphp/index.php";,аргументы);

а вот дальше возникла другая проблема - как получить результат вызова методов

в документации приведен пример

_netConnection = new NetConnection();
_netConnection.ObjectEncoding = ObjectEncoding.AMF3;
_netConnection.NetStatus += new NetStatusHandler(_netConnection_NetStatus);
_netConnection.Connect(“http://localhost:1781/SilverlightApplicationWeb/Gateway.aspx”);
...
_netConnection.Call("ServiceLibrary.MyDataService.GetCustomers", new GetCustomersHandler(), new object[] { txtSearch.Text });

сами методы Call и Connect ничего не возвращают, а вместо этого вызываются функции _netConnection_NetStatus и GetCustomersHandler в которых и идет обработка результатов или ошибок. Как это можно реализовать в случае вызова из 1С ?
   Maximich
 
19 - 10.11.16 - 04:46
чую что нужно копать в сторону "СоздатьОберткуДляСобытий77"
   Serginio1
 
20 - 10.11.16 - 07:41
Нужно подключать события

.NET(C#) для 1С. Динамическая компиляция класса обертки для использования .Net событий в 1С через ДобавитьОбработчик или ОбработкаВнешнегоСобытия 


http://catalog.mista.ru/public/417830/

 Там есть пример и для 7.7
 В обработке можно получить описания обработчиков в 1С
   Maximich
 
21 - 10.11.16 - 08:21
(20) Сергей, а что в моем случае будет обертываемым объектом ?

Перем net;

Перем ОберткаСобытий;

Функция СоздатьОбертку(ОбертываемыйОбъект)
    ПодключитьВнешнююКомпоненту("AddIn.GlobalContext1C");
    объект = СоздатьОбъект("AddIn.GlobalContext1C");
    ГлобальныйКонтекст= объект.ГлобальныйКонтекст;
    ОберткаСобытий= net.СоздатьОберткуДляСобытий77(ОбертываемыйОбъект,ГлобальныйКонтекст);
КонецФункции

//*******************************************
Процедура Сформировать()
    net=СоздатьОбъект("NetObjectToIDispatch45");
    
    сборка = net.ЗагрузитьСборку("C:\Program Files (x86)\FluorineFx\Bin\net\3.5\FluorineFx.dll");
    _netConnection=net.СоздатьОбъект("FluorineFx.Net.NetConnection");
    
    ObjectEncoding     = net.ПолучитьТип("FluorineFx.ObjectEncoding");
    NetStatus        = net.ПолучитьТип("FluorineFx.ObjectEncoding");
    _netConnection.ObjectEncoding = ObjectEncoding.AMF3;
    net.УстЭтоСемерка();
    
    //аргументы=net.СоздатьМассив("System.Object",net.ToInt(0));
    аргументы=net.СоздатьМассив("System.Object", 0);
    _netConnection.Connect("http://127.0.0.1/instrument/eOrder/Amfphp/index.php";,аргументы);
    СоздатьОбертку(_netConnection);
    _netConnection.Close();
КонецПроцедуры

Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
  Сообщить("Внешнее событие: Источник="+Источник+"  Событие="+Событие+"Данные="+Данные);
КонецПроцедуры

Ошибка:
ОберткаСобытий= net.СоздатьОберткуДляСобытий77(ОбертываемыйОбъект,ГлобальныйКонтекст);
mscorlib: Адресат вызова создал исключение.
   Serginio1
 
22 - 10.11.16 - 08:25
_netConnection

Через час посмотрю.
   Maximich
 
23 - 10.11.16 - 08:26
или мне сначала нужно создать объект NetStatusHandler и именно к нему применить этот код ?
   Serginio1
 
24 - 10.11.16 - 09:56
Нет посмотри примеры в отчете ТестКомпиляцииСобытий.ert
Там кстати и можно получить описание событий

_netConnection=net.СоздатьОбъект("FluorineFx.Net.NetConnection");
 СоздатьОбертку(_netConnection);
   Serginio1
 
25 - 10.11.16 - 10:07
В отчете ТестКомпиляцииСобытий.ert 
Устанавливаешь поля 
ПолноеИмяКласса
FluorineFx.Net.NetConnection

ПолноеИмяФайла
C:\Program Files (x86)\FluorineFx\Bin\net\3.5\FluorineFx.dll

 И жмякаешь на кнопку ПолучитьОписаниеМодулей
   Serginio1
 
26 - 10.11.16 - 10:08
Получаешь описание всех событий

Перем врап,ОберткаСобытий;

           Функция СоздатьОбертку(ОбертываемыйОбъект)
            ПодключитьВнешнююКомпоненту("AddIn.GlobalContext1C");
            объект = СоздатьОбъект("AddIn.GlobalContext1C");
            ГлобальныйКонтекст = объект.ГлобальныйКонтекст;

            ОберткаСобытий = врап.СоздатьОберткуДляСобытий77(ОбертываемыйОбъект,ГлобальныйКонтекст);
           КонецФункции// СоздатьОбертку




// Свойства ОберткаСобытий.ПоследняяОшибка

//Событие:String Имя События в котором произошло исключение
//Данные:object Параметры события

//ИсключениеСобытия:Exception Ошибка произошедшая при вызове события
Функция ОшибкаСобытия()
    ПоследняяОшибка=ОберткаСобытий.ПоследняяОшибка;
    Сообщить("Не обработано событие "+ПоследняяОшибка.Событие);
    Сообщить(Врап.ВСтроку(Шаблон("[ОберткаСобытий." + ПоследняяОшибка.Событие + "]")));
    Сообщить("Ошибка");
    Сообщить(врап.ВСтроку(ПоследняяОшибка.Исключение))
 КонецФункции  
//  Свойства ОберткаСобытий.NetStatus

// sender:System.Object
// e:FluorineFx.Net.NetStatusEventArgs


            Функция NetStatus()
               Сообщить("NetStatus "+Врап.ВСтроку(ОберткаСобытий.NetStatus));
            КонецФункции

//  Свойства ОберткаСобытий.OnConnect

// sender:System.Object
// e:System.EventArgs


            Функция OnConnect()
               Сообщить("OnConnect "+Врап.ВСтроку(ОберткаСобытий.OnConnect));
            КонецФункции

//  Свойства ОберткаСобытий.OnDisconnect

// sender:System.Object
// e:System.EventArgs


            Функция OnDisconnect()
               Сообщить("OnDisconnect "+Врап.ВСтроку(ОберткаСобытий.OnDisconnect));
            КонецФункции




Процедура ПриОткрытии()
    врап=СоздатьОбъект("NetObjectToIDispatch45");

КонецПроцедуры// ПриОткрытии

              //======================================================================

Процедура ОбработкаВнешнегоСобытия(Источник, ИмяСобытия, Данные)
             Если Источник = "FluorineFx_Net_NetConnection" Тогда

                  Шаблон("[" + ИмяСобытия + "()]");
            КонецЕсли;
            КонецПроцедуры// ОбработкаВнешнегоСобытия
   Serginio1
 
27 - 10.11.16 - 10:27
Пот попробуй. У меня какие то проблемы с VS


//*******************************************

Перем врап,ОберткаСобытий;

           Функция СоздатьОбертку(ОбертываемыйОбъект)
            ПодключитьВнешнююКомпоненту("AddIn.GlobalContext1C");
            объект = СоздатьОбъект("AddIn.GlobalContext1C");
            ГлобальныйКонтекст = объект.ГлобальныйКонтекст;

            ОберткаСобытий = врап.СоздатьОберткуДляСобытий77(ОбертываемыйОбъект,ГлобальныйКонтекст);
           КонецФункции // СоздатьОбертку



// Свойства ОберткаСобытий.ПоследняяОшибка
//Событие:String Имя События в котором произошло исключение
//Данные:object Параметры события
//ИсключениеСобытия:Exception Ошибка произошедшая при вызове события
Функция ОшибкаСобытия()
    ПоследняяОшибка=ОберткаСобытий.ПоследняяОшибка;
    Сообщить("Не обработано событие "+ПоследняяОшибка.Событие);
    Сообщить(Врап.ВСтроку(Шаблон("[ОберткаСобытий." + ПоследняяОшибка.Событие + "]")));
    Сообщить("Ошибка");
    Сообщить(врап.ВСтроку(ПоследняяОшибка.Исключение))
КонецФункции  
//  Свойства ОберткаСобытий.NetStatus
// sender:System.Object
// e:FluorineFx.Net.NetStatusEventArgs

            Функция NetStatus()
               Сообщить("NetStatus "+Врап.ВСтроку(ОберткаСобытий.NetStatus));
            КонецФункции

//  Свойства ОберткаСобытий.OnConnect
// sender:System.Object
// e:System.EventArgs

            Функция OnConnect()
               Сообщить("OnConnect "+Врап.ВСтроку(ОберткаСобытий.OnConnect));
            КонецФункции

//  Свойства ОберткаСобытий.OnDisconnect
// sender:System.Object
// e:System.EventArgs

            Функция OnDisconnect()
               Сообщить("OnDisconnect "+Врап.ВСтроку(ОберткаСобытий.OnDisconnect));
            КонецФункции




Процедура ПриОткрытии()
    врап=СоздатьОбъект("NetObjectToIDispatch45");
    врап.УстЭтоСемерка();
КонецПроцедуры // ПриОткрытии
               //======================================================================
Процедура ОбработкаВнешнегоСобытия(Источник, ИмяСобытия, Данные)
             Если Источник = "FluorineFx_Net_NetConnection" Тогда

                  Шаблон("[" + ИмяСобытия + "()]");
            КонецЕсли;
            КонецПроцедуры // ОбработкаВнешнегоСобытия  

Процедура Сформировать()


    
ПутьКСборке="C:\Program Files (x86)\FluorineFx\Bin\net\3.5\FluorineFx.dll";
    сборка = врап.ЗагрузитьСборку(ПутьКСборке);
NetConnection=Врап.ПолучитьТипИзСборки("FluorineFx.Net.NetConnection",ПутьКСборке);
    _netConnection=врап.СоздатьОбъект(NetConnection);
     СоздатьОбертку(_netConnection);
    

    ObjectEncoding     = врап.ПолучитьТип("FluorineFx.ObjectEncoding");

    NetStatus        = врап.ПолучитьТип("FluorineFx.ObjectEncoding");

    _netConnection.ObjectEncoding = ObjectEncoding.AMF3;

    

    

    аргументы=врап.СоздатьМассив("System.Object",врап.ToInt(0));

    аргументы=врап.СоздатьМассив("System.Object", 0);

  //  _netConnection.Connect("http://127.0.0.1/instrument/eOrder/Amfphp/index.php";;,аргументы);

  

   // _netConnection.Close();

КонецПроцедуры
   Serginio1
 
28 - 10.11.16 - 12:32
Нужно дать права на папку C:\Program Files (x86)\FluorineFx\Bin\net\3.5\
 с полным доступом или запустить 1С от администратора
   Maximich
 
29 - 10.11.16 - 13:28
(28) Спасибо.

Ошибок не вылетает, но правда и событий никаких не появляется, ни при Connect, ни при Close. Короче ОбработкаВнешнегоСобытия даже не вызывается ни разу. )
у меня в коде отсутствует аналог _netConnection.NetStatus += new NetStatusHandler(_netConnection_NetStatus);
может в этом причина ?
   Maximich
 
30 - 10.11.16 - 13:30
и еще вопрос немного не по теме. А есть ли в природе софтинка каторая бы показавала инфу как "Обозреватель объектов" в VS ?

Ну и уже по теме. Какаие типы данных можно передавать/получать из 1С в .Net ? Стока, число это понятно, а ТЗ ?
   Maximich
 
31 - 10.11.16 - 13:44
Или я туплю и мне сгенерированный код на c# нужно скомпилировать ?

И странно что всего три события
NetStatus, OnConnect и OnDisconect

а как-же события метода Call ? там же должен возвращаться результат или тут событий уже нет ?
   Serginio1
 
32 - 10.11.16 - 13:59
Ты пробовал использовать ТестКомпиляцииСобытий.ert из 25?
 Там формируется и компилируется такой файл

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.Threading;
using System.Threading.Tasks;

 [Guid("ab634004-f13d-11d0-a459-004095e1daea"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IAsyncEvent
        {
            void SetEventBufferDepth(int lDepth);
            void GetEventBufferDepth(ref int plDepth);
            void ExternalEvent(string bstrSource, string bstrMessage, string bstrData);
            void CleanBuffer();
        }
        public class ВрапперДляFluorineFx_Net_NetConnection77
    {
        FluorineFx.Net.NetConnection РеальныйОбъект;
        public object NetStatus;
public object OnConnect;
public object OnDisconnect;


      
        private SynchronizationContext Sc;
        IAsyncEvent СобытиеДля1С;
        private Object thisLock = new Object();
        public object ПоследняяОшибка;
        public   ВрапперДляFluorineFx_Net_NetConnection77(Object ГлобальныйКонтекст, FluorineFx.Net.NetConnection РеальныйОбъект)
          {

            СобытиеДля1С = ГлобальныйКонтекст as IAsyncEvent;
            if (SynchronizationContext.Current == null)
                SynchronizationContext.SetSynchronizationContext(new WindowsFormsSynchronizationContext());

            Sc = SynchronizationContext.Current;


            this.РеальныйОбъект = РеальныйОбъект;
            
            РеальныйОбъект.NetStatus += (sender,e) =>
            {
                  NetStatus =  new { sender=sender,e=e};
                ОтослатьСобытие("NetStatus");
            };

РеальныйОбъект.OnConnect += (sender,e) =>
            {
                  OnConnect =  new { sender=sender,e=e};
                ОтослатьСобытие("OnConnect");
            };

РеальныйОбъект.OnDisconnect += (sender,e) =>
            {
                  OnDisconnect =  new { sender=sender,e=e};
                ОтослатьСобытие("OnDisconnect");
            };



        }
        void ОтослатьСобытие(string ИмяСобытия)
{

    Task.Run(() =>
    {

        lock (thisLock)
        {

            try
            {
                Sc.Send(d => СобытиеДля1С.ExternalEvent("FluorineFx_Net_NetConnection", ИмяСобытия, ""), null);
            }

            catch (Exception ex)
            {
                try
                {
                    ПоследняяОшибка = new { Событие = ИмяСобытия, Исключение = ex };
                    Sc.Send(d => СобытиеДля1С.ExternalEvent("FluorineFx_Net_NetConnection", "ОшибкаСобытия", ""), null);
                }
                catch (Exception)
                {
                }

            }
        }

    });
}

public static object СоздатьОбъект(Object ГлобальныйКонтекст, FluorineFx.Net.NetConnection РеальныйОбъект)
{
    return new ВрапперДляFluorineFx_Net_NetConnection77(ГлобальныйКонтекст, РеальныйОбъект);
}
    }
   Serginio1
 
33 - 10.11.16 - 14:01
В 27 я закоментировал 

//  _netConnection.Connect("http://127.0.0.1/instrument/eOrder/Amfphp/index.php";,аргументы);

раскомментируй, а
// _netConnection.Close();

так как соединение должно принимать события
 
 
   Serginio1
 
34 - 10.11.16 - 14:08
   Serginio1
 
35 - 10.11.16 - 14:10
Надо тогда еще и к GetCustomersHandler события подключать
   Maximich
 
36 - 10.11.16 - 14:16
(32) я просто даже не подозреваю что с ним делать )
   Serginio1
 
37 - 10.11.16 - 14:18
Терерь осталось понять откуда берется new GetCustomersHandler() он должен реализовать 
public interface IPendingServiceCallback
    {
        void ResultReceived(IPendingServiceCall call);
    }
   Maximich
 
38 - 10.11.16 - 14:20
(37) А что мне нужно сделать с Описанием модуля на C# который сгенерировался обработкой ?
   Serginio1
 
39 - 10.11.16 - 14:22
(38) Ничего. Он динамически компилируется.
Но вот если ты хочешь добавить еще код, то можешь создать сборку и добавить этот код и еще дополнительную обвязку
   Serginio1
 
40 - 10.11.16 - 14:30
Попробуй для начала создать проект в VS, а затем уж возиться с 1С


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