Имя: Пароль:
JOB
Работа
Неспешно ищу работу. 1С + .Net
, ,
0 Serginio1
 
10.05.16
10:42
20 лет программирую на 1С и 13 на C#. Давно интегрирую .Net в 1С для расширения возможностей. Вот мои разработки http://catalog.mista.ru/profile/82159/public/
Основные это Использование сборок .NET в 1С 7.x b 8.x и . Динамическая компиляция класса обертки для использования .Net событий в 1С через ДобавитьОбработчик или ОбработкаВнешнегоСобытия
Если в 8.х есть множество возможносей, то для 7.7 функционал очень скуден.
Для 8.x часто испльзуется доступ к Вэб сервисам неподдерживаемыми 1С. Например Ws-протоколы и тд. Можно использовать асинхронные HTTP запросы, multipart/form-data итд.
Использовать Push-уведомления. Есть множество библиотек для разбора HTML (AngleShart, Silenium)
  При  работе с различными EDI есть уже готовые библиотеки на . Net которые можно использовать как в 7.7 так и в 8.x. В общем возможностей для интеграции огромное количество.
Есть опыт программирования для ТСД на WM. Скоро появятся ТСД на Windows mobile 10 где с использованием  UWP и Xamarin для других осей
Знаний много, но на нынешней работе не могу и малую толику возможностей использовать.
505 Serginio1
 
15.06.16
12:37
Добил поиск метода
http://rsdn.ru/forum/dotnet/6471273.1

Поэкспериментировал с CallBack


[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
         delegate void myDelegate(IntPtr thisptr);

  public static void TestCallBack(IntPtr Str,IntPtr FuncPtr)
        {

            myDelegate fun = Marshal.GetDelegateForFunctionPointer<myDelegate>(FuncPtr);

            fun(Str);

            var str = Marshal.PtrToStringUni(Str);
        }



На С++

typedef void(STDMETHODCALLTYPE *ManagedTestCallBack)(const wchar_t*, void(*) (const wchar_t*));

    typedef void(STDMETHODCALLTYPE *ManagedTestCallBack)(const wchar_t*, void(*) (const wchar_t*));
    
void TestCallBack(const wchar_t* str)
{

    printf_s("Return string %S.\n", str);
}


    ManagedTestCallBack pTestCallBack;
    
    
    hr = CreateDelegate2(pCLRRuntimeHost, domainId, L"CoreClrDLL", L"CoreClrDLL.Program", L"TestCallBack", (INT_PTR*)&pTestCallBack);
        if (FAILED(hr))
        {
            printf_s("Failed to create a delegate to the managed entry point: (%d).\n", hr);
    
        }
        else
        {
            wchar_t* str = L"Test str from unmanaged";
            pTestCallBack(str, TestCallBack);
        }

ManagedTestCallBack pTestCallBack;


hr = CreateDelegate2(pCLRRuntimeHost, domainId, L"CoreClrDLL", L"CoreClrDLL.Program", L"TestCallBack", (INT_PTR*)&pTestCallBack);
    if (FAILED(hr))
    {
        printf_s("Failed to create a delegate to the managed entry point: (%d).\n", hr);

    }
    else
    {
        wchar_t* str = L"Test str from unmanaged";
        pTestCallBack(str, TestCallBack);
    }


Работает. Так что можно память выделять на стороне натива и использовать обратные вызовы.
506 Serginio1
 
15.06.16
12:38
507 Serginio1
 
16.06.16
14:32
Сделал маршалинг из _tVariant натива в манагед
http://rsdn.ru/forum/dotnet/6472655.1
508 Gary417
 
16.06.16
14:59
пора уж блог заводить, а то на форуме это выгдядит "Тихо сам с собою, я веду беседу" (с)
509 Serginio1
 
16.06.16
15:04
510 Кирпич
 
16.06.16
15:08
(509) а чо такое "Элемент + 44"?
511 Serginio1
 
16.06.16
15:10
(510) Это смещене vt
512 Serginio1
 
22.06.16
10:28
В общем выхожу на финишную прямую
http://rsdn.ru/forum/dotnet/6478527.1
513 Serginio1
 
23.06.16
11:50
Наткнулся на то, что двоичные данные нельзя передать.
Может есть обходной путь?
514 Garykom
 
гуру
23.06.16
11:52
(513) В строку их
515 Serginio1
 
23.06.16
13:00
(514) Это понятно. Интересно а почему ДД то нельзя?
Получить можно, но передать нет?
516 Serginio1
 
24.06.16
10:49
Сделал

Перем   Врап,СсылкаНаДомен;
Функция СоздатьОбъектПоСсылке(Ссылка)

рез = Новый("AddIn.NetObjectToNative.NetObjectToNative");
рез.УстановитьСсылку(СсылкаНаДомен,Ссылка);    
возврат  рез
КонецФункции // СоздатьОбъектПоСсылке()


Процедура КнопкаВыполнитьНажатие(Кнопка)
            
СылкаСБ=Врап.Новый("System.Text.StringBuilder","Первая Строка");
//Сообщить(СылкаСБ);

СсылкаCultureInfo=Врап.ПолучитьТип("System.Globalization.CultureInfo");

    СсылкаCultureInfo=Врап.Новый(СсылкаCultureInfo,"es-ES");

//
    СultureInfo=СоздатьОбъектПоСсылке(СсылкаCultureInfo);
    
    СБ=СоздатьОбъектПоСсылке(СылкаСБ);
    Сообщить(СБ.Capacity);
    Сообщить(СБ.ПолучитьСсылку());
    
    СсылкаInvariantCulture=СultureInfo.InvariantCulture;

    // К сожалению 1С вызывает метод имеющий возвращаемое значение как функцию даже если вызов идет как процедура
    //Нужно очистить ссылку в списке объектов
    ссылка=Сб.Append("Новая Строка"); Врап.ОчиститьСсылку(ссылка);
    ссылка=Сб.AppendLine();   Врап.ОчиститьСсылку(ссылка);
    ссылка=Сб.Append("Вторая Строка"); Врап.ОчиститьСсылку(ссылка);
    ссылка=Сб.AppendLine();     Врап.ОчиститьСсылку(ссылка);

    ссылка=Сб.AppendFormat("AppendFormat {0}, {1}, {2}, {3}, {4},", "Строка", 21, 45.89, ТекущаяДата(),истина );   Врап.ОчиститьСсылку(ссылка);
    ссылка=Сб.AppendLine(); Врап.ОчиститьСсылку(ссылка);

    // Так как в параметрах можно передавать только простые типы закодирум ссылку на объект в строку
    ссылка=Сб.AppendFormat(СсылкаCultureInfo,"AppendFormat {0}, {1}, {2}, {3}, {4},", "Строка", 21, 45.89, ТекущаяДата(),истина );  Врап.ОчиститьСсылку(ссылка);
    ссылка=Сб.AppendLine(); Врап.ОчиститьСсылку(ссылка);

    ссылка=Сб.AppendFormat(СсылкаInvariantCulture,"AppendFormat {0}, {1}, {2}, {3}, {4},", "Строка", 21, 45.89, ТекущаяДата(),истина );
    Врап.ОчиститьСсылку(СсылкаInvariantCulture);





    Сообщить(СБ.ToString());
    СБ.Capacity=40;
    Сообщить(СБ.Capacity);

    // Очистка ссылок СБ и  СultureInfo осуществляется внутри ВК
    КонецПроцедуры

Процедура ПриОткрытии()


ИмяФайла="d:\MyPrograms\VNCOMP83\AddInNetObjectToNative\AddInNetObjectToNative\Debug\AddInNetObjectToNative.dll";

    ПодключитьВнешнююКомпоненту(ИмяФайла, "NetObjectToNative",ТипВнешнейКомпоненты.Native);
    Врап = Новый("AddIn.NetObjectToNative.LoaderCLR");
    CoreClrDir="c:\Program Files\DNX\runtimes\dnx-coreclr-win-x86.1.0.0-rc1-update1\bin\";
    ДиректорияNetObjectToNative="d:\MyPrograms\VNCOMP83\NetObjectToNative\NetObjectToNative\bin\Debug\";
    
    СсылкаНаДомен=Врап.СоздатьОбертку(CoreClrDir,ДиректорияNetObjectToNative,"");
    
КонецПроцедуры
517 Serginio1
 
24.06.16
10:57
Модераторам. Можно код выделить?

Пока сделал для Win. Допилю еще вызовы методов расширений. Вызов дженериков определяемых по типу.

Но по моему никому это не надо. А жалко.
Под линукс проще писать расширения будет.

Чуть позже наришу статью и выложу исходники
518 Кирпич
 
24.06.16
11:08
Я себе сделал типа такое и мне хватает.

Прог = " //
|public static class AddinHelloClass
|{
|    public static int AddinМойМетод(ref string s)
|    {
|        s = ""hello"";
|        return 100500;
|    }           
|}";

Шарп.ДобавитьМодуль(Прог);
Шарп.Компилировать();    
стр = "раз два три";
ч =Шарп.МойМетод(стр);
Сообщить(стр);
Сообщить(ч);
519 Кирпич
 
24.06.16
11:11
т.е. тупо готовую программу в виде текста компилирую и когда надо выполняю. без всяких глазоломательных оберток. текст модулей можно хранить в БД, в макетах или файлах.
520 Garykom
 
гуру
24.06.16
11:12
(518) Давно на это и намекал )) и не надо больше никаких извратов.

Точнее параметры туда и результаты оттуда еще как то и все.
521 Garykom
 
гуру
24.06.16
11:14
(519) ВК NativeAPI и классик и чтобы под linux на mono тоже работало на сервере
И на ИС продавать поддержку или наборы готовых "текстов программы"
522 Кирпич
 
24.06.16
11:15
(520) ну результаты оттуда идут нормально. сделаю на досуге чтобы можно было из шарпа внешнее событие вызывать. больше особо ничего и не требуется.
523 Serginio1
 
24.06.16
11:16
(519) А как события прикручивать?

Ну если ты видел у меня этот подход много где используется.
В том числе и Scripting API
524 Кирпич
 
24.06.16
11:17
(523) "у меня этот подход много где используется" ну и правильно. больше ничего и не надо, имхо.
525 Garykom
 
гуру
24.06.16
11:18
(523) Да у тебя получается мощнее не просто вызов стороннего кода из 1С, а полноценное взаимодействие с этим кодом.
По сути система получается из 2 языков одновременно работающих 1С и .Net
526 Кирпич
 
24.06.16
11:19
(523) события сделаю. там ничего сложного не вижу. только нужно решить как удобнее сделать.
527 Garykom
 
гуру
24.06.16
11:19
(525)+ А в (518) работает только по очереди или 1С или .Net
528 Serginio1
 
24.06.16
11:20
529 Serginio1
 
24.06.16
11:22
(526) Так у меня это все есть.
Да и суть то новой компонеты в том, что это работает без COM и может работать на Линкусе.
530 Кирпич
 
24.06.16
11:26
(529) ну у меня тоже Native API. На счет Линукса не знаю, может и на Линуксе работает. :)
Но писать как в (516) вы меня не заставите. Я лучше напишу и отлажу в VS, а потом скопипастю в 1С.
531 Serginio1
 
24.06.16
11:57
(530)  Ну я никого не заставляю.

Проблемы в архитектуре ВК
1. Вызов метода как процедуры должен и вызвать метод CallAsProc
2. Добавить возможность передавать в параметрах ВК и возвращать ВК что бы обойтись без ссылок.
А так по линуксом это значительно проще  чем писать отдельно ВК
532 Serginio1
 
24.06.16
12:00
533 Serginio1
 
24.06.16
12:40
Кстати в примере ошибка прокралась
СылкаСБ=Врап.Новый("System.Text.StringBuilder","Первая Строка");
//Сообщить(СылкаСБ);

СсылкаCultureInfo=Врап.ПолучитьТип("System.Globalization.CultureInfo");

    СсылкаCultureInfo=Врап.Новый(СсылкаCultureInfo,"es-ES");
// Здесь уже СсылкаCultureInfo указывает на объект

//
    СultureInfo=СоздатьОбъектПоСсылке(СсылкаCultureInfo);

И СultureInfo это не тип а объект СсылкаCultureInfo,"es-ES");  

  
// Вызываем статический метод    
    СсылкаInvariantCulture=СultureInfo.InvariantCulture;

он проходит, так как нет проверки на статик.

Я думаю так и оставить. Можно из объекта как в Delphi вызывать и методы объекта и статические
534 Gary417
 
24.06.16
12:43
(533) <Врап.Новый(СсылкаCultureInfo,"es-ES"); >

Hablo espanol?
535 Gary417
 
24.06.16
12:43
+тьфу habla espanol?
536 Serginio1
 
24.06.16
12:46
Наверное взял из примера

es-ES

Испанский (Испания)

Международная: 0x00000C0A

Традиционные: 0x0000040A
537 Кирпич
 
24.06.16
13:13
(532) и чо там смотреть? опять 8 листов русско-турецкого кода на который я смотреть не могу. а что мне нужно я и так знаю.
538 Кирпич
 
24.06.16
13:14
(531) "Вызов метода как процедуры должен и вызвать метод CallAsProc"

ты хочешь сказать, что 1с не вызывает CallAsProc?
у меня вызывает вроде.
539 Serginio1
 
24.06.16
13:36
(538) Вызывает если HasRetVal возвращает ложь.

Но например если я вызываю
Сб.AppendLine(); // А у него есть возвращаемое значение this

То даже если метод возвращает значение нужно вызывать
CallAsProc

Тогда не нужно оборачивать результат.
540 Кирпич
 
24.06.16
14:20
(539) ну это так и должно быть. как говорил один мой шеф: "если решение некрасивое, то оно обычно и неправильное" :)
541 Garykom
 
гуру
24.06.16
14:25
(540) Даже неправильные решения могут быть востребованными и хорошо оплачиваемыми.
542 Кирпич
 
24.06.16
15:43
(541) это ты намекаешь на сборнуюю РФ по футболу?
543 Кирпич
 
24.06.16
15:50
СсылкаCultureInfo=Врап.ПолучитьТип("System.Globalization.CultureInfo");

Вот автор, например, предлагает после каждой выпитой рюмки, ездить в гараж на электричке за соленым огурцом, а я предлагаю съездить в гараж, привезти банку огурцов и сидеть спокойно выпивать и закусывать. Какой метод правильный? Я думаю мой.
544 Serginio1
 
24.06.16
17:31
Правильны это тот который удобный.
Еще раз у меня используется Scripting Api из Каропки. При этом я могу передавать любые объекты. В том числе и объекты 1С.
Могу пользоваться IronPithon. Только это не относится к теме. А именно кросплатформенная ВК использования классов .Net в 1С.

А твой метод использует Hosting API?
545 Serginio1
 
24.06.16
17:33
(543) Чуть позже сделаю загрузку классов из сторонних сторонних сборок.
546 oleg_km
 
24.06.16
18:11
(543) Твой метод реализует процедурный подход. А метод автора объектный. Ты можешь сохранить объект дот нета допустим в реквизит формы и повторно его использовать в течении жизни формы?
547 Serginio1
 
25.06.16
16:53
(543) На самом деле я начал использовать классы .Net для использования Вэб сервисов неподдерживаемых 1С с кучей классов которые используют данные 1С и записываются. Все построено на классах. Так вот выбор был делать ручную обертку или автоматическу. Твой подход с кимпиляцией текста не подходит. Нужно сериализовывать объекты десериализовывать. Для передачи в методахь и возврата. Это частный подход который используется как при компиляции событий, так и для заполнения данных 1С так и для получения делегатов
548 Serginio1
 
25.06.16
16:53
(543) Для упрощения получения объектов можно создать методы

Функция Ъ(Ссылка)
    рез = Новый("AddIn.NetObjectToNative.NetObjectToNative");
    рез.УстановитьСсылку(СсылкаНаДомен,Ссылка);    
    возврат  рез
КонецФункции // СоздатьОбъектПоСсылке()
Функция ъНовый(стр)
    возврат ъ(Врап.Новый(стр));
КонецФункции

Функция ъТип(стр)
      возврат ъ(Врап.ПолучитьТип(стр));
КонецФункции

Процедура ТестСокпВызоваНажатие(Элемент)
    // Вставить содержимое обработчика.
    СБ=ъНовый("System.Text.StringBuilder");
    CultureInfo=ъТип("System.Globalization.CultureInfo");
    CultureInfoES=ъ(Врап.Новый(CultureInfo.ПолучитьСсылку(),"es-ES"));
    Сообщить(CultureInfoES.ПолучитьСсылку());

    
    Сообщить(СБ.Capacity);
    Сообщить(СБ.ПолучитьСсылку());
    
   InvariantCulture=ъ(CultureInfo.InvariantCulture);
   ссылка= InvariantCulture.ПолучитьСсылку();

    // К сожалению 1С вызывает метод имеющий возвращаемое значение как функцию даже если вызов идет как процедура
    //Нужно очистить ссылку в списке объектов
    ссылка=Сб.Append("Новая Строка"); Врап.ОчиститьСсылку(ссылка);
    ссылка=Сб.AppendLine();   Врап.ОчиститьСсылку(ссылка);
    ссылка=Сб.Append("Вторая Строка"); Врап.ОчиститьСсылку(ссылка);
    ссылка=Сб.AppendLine();     Врап.ОчиститьСсылку(ссылка);
    
    ссылка=Сб.AppendFormat("AppendFormat {0}, {1}, {2}, {3}, {4},", "Строка", 21, 45.89, ТекущаяДата(),истина );   Врап.ОчиститьСсылку(ссылка);
    ссылка=Сб.AppendLine(); Врап.ОчиститьСсылку(ссылка);

    // Так как в параметрах можно передавать только простые типы закодирум ссылку на объект в строку
    
    ссылка=Сб.AppendFormat(InvariantCulture.ПолучитьСсылку(),"AppendFormat {0}, {1}, {2}, {3}, {4},", "Строка", 21, 45.89, ТекущаяДата(),истина );  Врап.ОчиститьСсылку(ссылка);
    ссылка=Сб.AppendLine(); Врап.ОчиститьСсылку(ссылка);
    
    ссылка=Сб.AppendFormat(CultureInfoES.ПолучитьСсылку(),"AppendFormat {0}, {1}, {2}, {3}, {4},", "Строка", 21, 45.89, ТекущаяДата(),истина );
  
    
    
    Сообщить(СБ.ToString());
    СБ.Capacity=40;
    Сообщить(СБ.Capacity);

КонецПроцедуры
549 DES
 
25.06.16
19:43
(518) Я дика извиняюсь, это реальность или фантастика ?
550 DES
 
25.06.16
20:34
(0) Если помнишь, я тебе давно надоедал насчет
врап=новый COMОбъект("NetObjectToIDispatch45");
в 1с 7.7 ?

Теперь я взялся за ум и перешел на 8.3.

И у меня вопрос, есть ли что-то новое по этой теме  для 8?
551 Garykom
 
гуру
25.06.16
21:11
(549) это даже проще даже без вк можно
552 DES
 
25.06.16
21:23
без ВК любой Д сможет
553 Garykom
 
гуру
25.06.16
21:29
(552) Не в этом смысла, динамическая компиляция .net можно через запись файлика и выполнение командасистемы или выполнить
554 DES
 
25.06.16
23:00
(553) в виде примера можно ?
555 Garykom
 
гуру
25.06.16
23:06
556 Serginio1
 
26.06.16
00:11
(549) Смотри 528.
557 Кирпич
 
26.06.16
09:47
(551) можно и без ВК, только данные через файлы передавать и внешнее событие никак не вызвать.
558 Кирпич
 
26.06.16
09:53
(548) "Для упрощения получения объектов можно создать методы"
да у меня претензии к скорости выполнения такого кода и сложности разработки. Я то один раз в VS все напишу и с отладчиком, в нормальной IDE все отлажу, а тебе приходится русско-буржуйскую кашу ковырять прямо в 1С. Это же муторно и некрасиво.

А про передачу объектов 1с в ВК я так и не понял. Оно у тебя работает или нет?
559 Кирпич
 
26.06.16
09:55
(549) я думаю, лет 8 уже как не фантастика.
560 DES
 
26.06.16
11:15
(556) напомни, все еще  нужно что-то регистрировать в винде 2008R2 чтобы заюзать твою обертку в 8.3 ?
561 Serginio1
 
26.06.16
12:07
(559) Да. Вот пример с подгрузкой сборок.

HttpClient=ъТип("System.Net.Http.HttpClient, System.Net.Http, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");
HttpClientHandler = ъТип("System.Net.Http.HttpClientHandler, System.Net.Http, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");
DecompressionMethods= ъТип("System.Net.DecompressionMethods, System.Net.Primitives, Version=4.0.11.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");


handler = ъНовый(HttpClientHandler.ПолучитьСсылку());
// Можно использовать и так. Только Не соберем ссылки
//handler.AutomaticDecompression=Врап.OR(DecompressionMethods.GZip,DecompressionMethods.Deflate);

ссылкаGZip=DecompressionMethods.GZip;
ссылкаDeflate=DecompressionMethods.Deflate;

handler.AutomaticDecompression=Врап.OR(ссылкаGZip,ссылкаDeflate);
Врап.ОчиститьСсылку(ссылкаGZip);   Врап.ОчиститьСсылку(ссылкаDeflate);

Клиент = ъ(Врап.Новый(HttpClient.ПолучитьСсылку(),handler.ПолучитьСсылку()));

uriSources ="https://msdn.microsoft.com/en-us/library/system.net.decompressionmethods(v=vs.110).aspx";;

Стр=ъ(Клиент.GetStringAsync(uriSources)).Result;
Сообщить(СтрДлина(стр));
562 Serginio1
 
26.06.16
12:12
(560 Инструкция в шапке Использование классов .Net в 1С для новичков

кроме того рядом с NetObjetToIDispatch45.dll лежит RegAsm.bat который нужно запустить от имени администратора
563 Serginio1
 
26.06.16
12:20
(558) У меня разные подходы. В том числе и твой. Я например заполняю ТаблицуЗначений внутри .Net класса. Могу использовать DLL, могу DynamicMethod.
На самом деле, я легко пишу как ты говоришь мешанину и на 1С. Её проще править и отлаживать. Внутри 1С. Еще раз повторю у тебя очень частный случай возможностей моей компоненты. Но она мощнее так как позволяет использовать объекты, в том числе и 1С. Использование событий .Net объектов. Асинхронное программирование.

Но это опять не по теме. Сейчас я говорю о кроссплатформенном использовании классов .Net в 1С.
564 Кирпич
 
26.06.16
17:10
(563) "Я например заполняю ТаблицуЗначений внутри .Net класса"
Такое в NativeAPI возможно? Я от не понимаю как ты это делаешь. Пример есть? Только не надо вываливать листинг на 150 строк :)
565 Serginio1
 
26.06.16
18:20
(564) В NativeAPI нет. А в COM легко.
Но на самом деле можно и через Native. Но только на Виндовс.
Обернуть любой объект через СОМ объекта у которого запросить Long на себя, который можно передавать в параметрах и вызывать на нем методы IDispatch.
566 DES
 
26.06.16
21:46
(565) подскажи почему не присваивается значение структуре ?
newid = Врап.ПолучитьТип("System.Guid").NewGuid().ToString();
ТипRequest = Врап.ПолучитьТип("ServiceEfactura.ServiceReference.InvoicesRequest");
ТипЛист = Врап.ПолучитьТип("System.Collections.Generic.List`1");
ТипInvoiceIndentificator = Врап.ПолучитьТип("ServiceEfactura.ServiceReference.InvoiceIndentificator");
    
Request = Врап.СоздатьОбъект(ТипRequest);
ТипЛистОбъект = Врап.ТипКакОбъект(ТипЛист);
ТипизированныйЛист = ТипЛистОбъект.MakeGenericType(ТипInvoiceIndentificator);
SeriaAndNumbers = Врап.СоздатьОбъект(ТипизированныйЛист);
SeriaAndNumber = Врап.СоздатьОбъект(ТипInvoiceIndentificator);
SeriaAndNumber.Number = "000000001";
SeriaAndNumber.Seria = "EAA";
SeriaAndNumbers.Add(SeriaAndNumber);
    
request.RequestId = newid; // тут нормально присваивается
А тут затык, так как это массив.
request.SeriaAndNumbers = SeriaAndNumbers;
пишет ошибка в методе SeriaAndNumbers  не найден метод *.*.*.*.SeriaAndNumbers.mscorlib
567 Serginio1
 
26.06.16
22:03
Нужно смотреть тип ServiceEfactura.ServiceReference.InvoiceIndentificator

Заведи отдельную ветку.
568 Serginio1
 
26.06.16
22:18
Возможно у тебя тип request.SeriaAndNumbers
ServiceEfactura.ServiceReference.InvoiceIndentificator[]

Тогда
request.SeriaAndNumbers = SeriaAndNumbers.ToArray();
569 DES
 
27.06.16
00:11
да, спс, таки оно.
570 Serginio1
 
27.06.16
12:12
Поработал с интерфейсами и Энумераторами

Функция ПолучитьЭнумератор(Объект)

Перечислимый=ъ(Врап.ПолучитьИнтерфейс(Объект.ПолучитьСсылку(),"IEnumerable"));
ПеречислительСсылка=Перечислимый.GetEnumerator();
// На всякий случай приведем к Интерфейсу IEnumerator
Перечислитель=ъ(Врап.ПолучитьИнтерфейс(ПеречислительСсылка,"IEnumerator"));
Врап.ОчиститьСсылку(ПеречислительСсылка);    
// Можно и так
//IEnumerable=ъТип("System.Collections.IEnumerable");
//IEnumerator=ъТип("System.Collections.IEnumerator")
// Перечислимый=ъ(Врап.ПолучитьИнтерфейс(Объект.ПолучитьСсылку(),IEnumerable));
//ПеречислительСсылка=Перечислимый.GetEnumerator();
// На всякий случай приведем к Интерфейсу IEnumerator
// Перечислитель=ъ(Врап.ПолучитьИнтерфейс(ПеречислительСсылка,IEnumerator));
//Врап.ОчиститьСсылку(ПеречислительСсылка);    

возврат  Перечислитель
КонецФункции // ПолучитьЭнумератор()

Процедура ТестЭнумератораНажатие(Элемент)
    List=ъТип("System.Collections.Generic.List`1[System.String]");
//Сообщить(Врап.ИнформацияОТипе(List.ПолучитьСсылку()));    

//IEnumerable=ъТип("System.Collections.IEnumerable");
//IEnumerator=ъТип("System.Collections.IEnumerator");

Список=ъНовый(List.ПолучитьСсылку());
Для сч=1 По 10 Цикл
Список.Add(строка(сч));    
КонецЦикла;

// Нет поддержки энумераторов. В COM есть
//Для каждого стр   Из Список Цикл

//Сообщить(стр);    

//КонецЦикла;

СписокЭнум=ПолучитьЭнумератор(Список);
  
Пока СписокЭнум.MoveNext() Цикл
//  Врап.ВСтроку вывоит строковое представление всех типов в том числе числовые, строки, неопределено
    Сообщить(СписокЭнум.Current);

КонецЦикла;

КонецПроцедуры
571 Serginio1
 
27.06.16
12:24
Протестировал out параметры
TryGetValue(ключ, out значение))

Процедура TestDictionaryНажатие(Элемент)
    // Вставить содержимое обработчика.
Словарь= ъНовый("System.Collections.Generic.Dictionary`2[System.String,System.Int32]");

Для сч=1 По 10 Цикл
  Словарь.Add(строка(сч),сч);    
КонецЦикла;

зн=0;
Если Словарь.TryGetValue("5",зн) Тогда
  Сообщить(зн);
КонецЕсли;

КонецПроцедуры
572 Serginio1
 
28.06.16
12:03
Проверил производительность
http://rsdn.ru/forum/dotnet/6484358.1

миллион вызовов функции .Net занимает порядка 3 секунд, на моем не можном компе.
573 Serginio1
 
28.06.16
15:20
А вот в 1С
    // Вставить содержимое обработчика.
    КоличествоИтераций=20000;
Тестовый=ъТип("TestDllForCoreClr.Тестовый, TestDllForCoreClr, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");
Тест=ъ(Врап.Новый(Тестовый.ПолучитьСсылку()," Свойство из Конструктора"));

    stopWatch = ъНовый("System.Diagnostics.Stopwatch,System.Runtime.Extensions, Version=4.0.11.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");
    
    стр="";
     Тест.ПолучитьЧисло(1);
    
    НачВремя=ТекущаяДата();
    stopWatch.Start();
    
    
    Для сч=1 по КоличествоИтераций Цикл
        Тест.ПолучитьЧисло(сч);

    КонецЦикла;
    
    stopWatch.Stop();
    
    ВремяВыполнения=ТекущаяДата()-НачВремя;
    Сообщить("ПолучитьЧисло ="+ВремяВыполнения);
    ВывестиВремя(stopWatch);

1 секунда на 20 000 вызовов .
против
1 секунда на 300 000.
574 Serginio1
 
28.06.16
15:32
Да еще зачем то хочет установить свойство Elapsed
Хотя никакой установки нет

Процедура ВывестиВремя(знач stopWatch)
     ts = ъ(stopWatch.Elapsed);

    String=ъТип("System.String");
    // Format and display the TimeSpan value.
     Hours=ts.Hours;
     Minutes=ts.Minutes;
     Milliseconds=ts.Milliseconds;
     Seconds=ts.Seconds;
    elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",Hours, Minutes, Seconds,Milliseconds / 10);
    Сообщить(elapsedTime);
КонецПроцедуры
575 Кирпич
 
28.06.16
15:34
(0) вчера студент приходил, вебсервис синтезатора речи Ivona испытывали.
как с помощью врапера его к 1с прикрутить?

ниже работающий пример на С#:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Security.Cryptography;
using System.Text;
using System.Web.Script.Serialization;
using System.Runtime.InteropServices;


class Program
{
    const string AccessKey = "GDNAJP73IAROH72QWEHA";
    const string SecretKey = "9Q7vSMMvVbMw8t9Ti5HRTSWde1E4cah9N9DV8pG7";

    [DllImport("winmm.dll")]
    private static extern long mciSendString(string strCommand, StringBuilder strReturn, int iReturnLength, IntPtr hwndCallback);

    static void Main()
    {
        string errortext = "";

        try
        {
            var path = System.Environment.GetFolderPath(System.Environment.SpecialFolder.ApplicationData) + "1.mp3";
            File.Delete(path);

            byte[] voice = IvonaCreateSpeech("Привет, красавчики!");
            File.WriteAllBytes(path, voice);

            string command = "play " + path + " wait ";
            mciSendString(command, null, 0, IntPtr.Zero);

            File.Delete(path);

            return;
        }
        catch (WebException ex)
        {
            errortext = ex.Message;
        }
        catch (Exception ex)
        {
            errortext = ex.Message;
        }
        Console.WriteLine(errortext);
    }

    //-----------------------------------------------------------------------------
    //-----------------------------------------------------------------------------

    private static byte[] IvonaCreateSpeech(string text)
    {
        var date = DateTime.UtcNow;

        const string algorithm = "AWS4-HMAC-SHA256";
        const string regionName = "eu-west-1";
        const string serviceName = "tts";
        const string method = "POST";
        const string canonicalUri = "/CreateSpeech";
        const string canonicalQueryString = "";
        const string contentType = "application/json";

        const string host = serviceName + "." + regionName + ".ivonacloud.com";

        var obj = new
        {
            Input = new
            {
                Data = text,
                Type = "text/plain"
            },
            OutputFormat = new
            {
                Codec = "MP3",
                SampleRate = 22050
            },
            Parameters = new
            {
                Rate = "medium",
                Volume = "medium",
                SentenceBreak = 500,
                ParagraphBreak = 800
            },
            Voice = new
            {
                Name = "Tatyana",
                Language = "ru-RU",
                Gender = "Female"
            }
        };
        var requestPayload = new JavaScriptSerializer().Serialize(obj);

        var hashedRequestPayload = HexEncode(Hash(ToBytes(requestPayload)));

        var dateStamp = date.ToString("yyyyMMdd");
        var requestDate = date.ToString("yyyyMMddTHHmmss") + "Z";
        var credentialScope = string.Format("{0}/{1}/{2}/aws4_request", dateStamp, regionName, serviceName);

        var headers = new SortedDictionary<string, string>
            {
                {"content-type", contentType},
                {"host", host},
                {"x-amz-date", requestDate}
            };

        string canonicalHeaders =
            string.Join("\n", headers.Select(x => x.Key.ToLowerInvariant() + ":" + x.Value.Trim())) + "\n";
        const string signedHeaders = "content-type;host;x-amz-date";

        var canonicalRequest = method + '\n' + canonicalUri + '\n' + canonicalQueryString +
                               '\n' + canonicalHeaders + '\n' + signedHeaders + '\n' + hashedRequestPayload;

        var hashedCanonicalRequest = HexEncode(Hash(ToBytes(canonicalRequest)));

        var stringToSign = string.Format("{0}\n{1}\n{2}\n{3}", algorithm, requestDate, credentialScope,
            hashedCanonicalRequest);

        byte[] signingKey = GetSignatureKey(SecretKey, dateStamp, regionName, serviceName);

        var signature = HexEncode(HmacSha256(stringToSign, signingKey));

        var authorization =
            string.Format("{0} Credential={1}/{2}/{3}/{4}/aws4_request, SignedHeaders={5}, Signature={6}",
                algorithm, AccessKey, dateStamp, regionName, serviceName, signedHeaders, signature);

        // Send the request

        var webRequest = WebRequest.Create("https://"; + host + canonicalUri);

        byte[] buffer = ToBytes(requestPayload);

        webRequest.Method = method;
        webRequest.Timeout = 20000;
        webRequest.ContentType = contentType;
        webRequest.Headers.Add("X-Amz-date", requestDate);
        webRequest.Headers.Add("Authorization", authorization);
        webRequest.Headers.Add("x-amz-content-sha256", hashedRequestPayload);
        webRequest.ContentLength = buffer.Length;

        using (Stream newStream = webRequest.GetRequestStream())
        {
            newStream.Write(buffer, 0, buffer.Length);
            newStream.Flush();
        }

        var response = (HttpWebResponse)webRequest.GetResponse();

        using (Stream responseStream = response.GetResponseStream())
        {
            if (responseStream != null)
            {
                using (var memoryStream = new MemoryStream())
                {
                    responseStream.CopyTo(memoryStream);
                    return memoryStream.ToArray();
                }
            }
        }
        return new byte[0];
    }

    private static byte[] GetSignatureKey(String key, String dateStamp, String regionName, String serviceName)
    {
        byte[] kDate = HmacSha256(dateStamp, ToBytes("AWS4" + key));
        byte[] kRegion = HmacSha256(regionName, kDate);
        byte[] kService = HmacSha256(serviceName, kRegion);
        return HmacSha256("aws4_request", kService);
    }

    private static byte[] ToBytes(string str)
    {
        return Encoding.UTF8.GetBytes(str);
    }

    private static string HexEncode(byte[] bytes)
    {
        return BitConverter.ToString(bytes).Replace("-", string.Empty).ToLowerInvariant();
    }

    private static byte[] Hash(byte[] bytes)
    {
        return SHA256.Create().ComputeHash(bytes);
    }

    private static byte[] HmacSha256(String data, byte[] key)
    {
        return new HMACSHA256(key).ComputeHash(ToBytes(data));
    }
}
576 Serginio1
 
28.06.16
15:50
И? Нужно каждую сборку регистрировать. Кроме того если нужно подправить на сервере например нужно сервер останавливать, так как DLL не выгружается.
Используй HTTPClient
там есть расширение PostAsJsonAsync.
И зачем мусорить ветку. Я прекрасно все знаю.
577 Serginio1
 
28.06.16
15:51
Я это и на 1С прекрасно напишу. Без всяких DLL и регистрации.
578 Кирпич
 
28.06.16
15:55
(576) я думал ты себе в портфолио запишешь. типа вот 1с человеческим голосом заговорила.
(577) не. на 1с не получится. там какие то хеши, массивы...
579 Кирпич
 
28.06.16
15:58
(576) "так как DLL не выгружается" кстати проблема. NET вк не выгружаются сами, хоть тресни, а обычные выгружаются.
580 Serginio1
 
28.06.16
16:09
(578) Легко. Вот код для 7 ки
Функция ВычислитьHMAC(key,стр)
    врап=СоздатьОбъект("NetObjectToIDispatch45");
    врап.УстЭтоСемерка();
//    если только латиница
//encoding=Врап.ПолучитьТип("System.Text.Encoding").ASCII;
encoding=Врап.ПолучитьТип("System.Text.Encoding").UTF8;

keyByte = encoding.GetBytes(key);

hmacmd5 = Врап.СоздатьОбъект("System.Security.Cryptography.HMACMD5",keyByte);
hmacsha1 = Врап.СоздатьОбъект("System.Security.Cryptography.HMACSHA1",keyByte);

messageBytes = encoding.GetBytes(стр);
hashmessage = hmacmd5.ComputeHash(messageBytes);
hashmessage2 = hmacsha1.ComputeHash(messageBytes);
BitConverter=Врап.ПолучитьТип("System.BitConverter");
Strhashmessage=СтрЗаменить(BitConverter.ToString(hashmessage),"-","");
Strhashmessage2=СтрЗаменить(BitConverter.ToString(hashmessage2),"-","");

Сообщить(Strhashmessage);
Сообщить(Strhashmessage2);
    

КонецФункции// ВычислитьHMAC()
581 Serginio1
 
28.06.16
16:11
Почему в этой ветке нет подсветки кода?
582 Зая Бусечка
 
28.06.16
16:12
(581) Подсветка работает только в разделе 1с. Ибо нефиг
583 Кирпич
 
28.06.16
16:14
(580) это всё вместо двух строчек? ого.

    private static byte[] HmacSha256(String data, byte[] key)
    {
        return new HMACSHA256(key).ComputeHash(ToBytes(data));
    }
584 Serginio1
 
28.06.16
16:17
(582) То есть в поиске работы кода не может быть?
(579) На 1С можно все. В том числе и выполнение асинхронных методов, подключение к событиям.

И все это возможно и на Линукс. Тут все кричали .Net отстой он не кросплатформен. Я даю кроссплатформенный вариант.
Который может выполняться и на Линукс

(584) Там тоже 2 строчки только алгоритмы разные

hmacsha1 = Врап.СоздатьОбъект("System.Security.Cryptography.HMACSHA1",keyByte);
hashmessage2 = hmacsha1.ComputeHash(messageBytes);
585 Serginio1
 
28.06.16
16:19
Или
Врап.СоздатьОбъект("System.Security.Cryptography.HMACSHA1",keyByte).ComputeHash(messageBytes);
586 Кирпич
 
28.06.16
16:21
(585) о. так гораздо лучше
587 Serginio1
 
28.06.16
16:22
(583) И еще раз как это относится к Linux?
Я показываю кроссплатформенный код. Который можно улучшить если 1С предпримет шаги для оптимизации своей Native ВК или введения новой более оптимальной версии.
588 Serginio1
 
28.06.16
16:24
Или можно так
ъНовый("System.Security.Cryptography.HMACSHA1",keyByte).ComputeHash(messageBytes);
589 Зая Бусечка
 
28.06.16
16:25
(587) Если бы 1с "предпринимала шаги", мы бы ещё долго и счастливо сидели на 77
590 Кирпич
 
28.06.16
16:26
(587) "И еще раз как это относится к Linux?"
да никак. я про линукс и не заикался.
591 Serginio1
 
28.06.16
16:30
(589) Дело в том, что Native ВК они сделали. Но уже сейчас много недостатков.
1. Нельзя передать или возвратить объект ВК
2. Метод имеющий возвращаемое значение вызывается как функция не зависимо от тог как вызывается метод. Даже когда он вызывается как процедура ВК требует возвращаемое значение.
3. При возврате bool SetPropVal(const long lPropNum, tVariant* varPropVal) и GetPropVal при возврате ложь исключение не вызывается
4. Зачем то происходит установка свойств там где этого в коде нет. И вызываются по некольку раз.
592 Serginio1
 
28.06.16
16:31
(590) А вся это ветка посвящена Кроссплатформенному использованию классов .Net в 1С.
593 Кирпич
 
28.06.16
16:34
(592) так а я как узнаю, что она посвящена там чему то. написано "Неспешно ищу работу. 1С + .Net"
С названием, кстати, не согласен. Нет такой отрасли народного хозяйства "1С + .Net". Хотя, если цель - создать такую отрасль из голого пальца, то пожалуйста.
594 Serginio1
 
28.06.16
17:05
(593) Дело в том, что 1С может использовать кроссплатформенность .Net на прямую. Можно для определенных типов прописать рускоязычные ресурсы. Это легко сделать.
Например в Microsoft Dynamics AX есть ClrObject.
И 1С ничем не хуже. При этом если в .Net практически ничего не ломается, то 1С постоянно косячит JOB: HTTPСоединение и SSL connect error

И поверь если бы 1С ввела поддержку .Net все прекрасно писали бы используя классы .Net так как из каропки.

А интегрировать на самом деле много. Ко мне сейчас много обращаются, а у меня вот времени нет совсем.
595 Gary417
 
28.06.16
17:25
(594) <При этом если в .Net практически ничего не ломается, то 1С постоянно косячит JOB: HTTPСоединение и SSL connect error>

Ну ненадо, когда начинаются нюансы с алгоритмами шифрования, требованиями FIPS и т.п. всякие глюи и у явы и у .net и вообще с пустого места начинают выползать
596 Serginio1
 
28.06.16
17:44
(595) Ну размер библиотек 1С и .Net несопоставим. А вот твой пример касается нового.
Но аналоги HTTPСоединения никогда не ломались, хотя и значительно мощнее. Помню вэб сервисы слетели и пришлось ждать обновления. Ну и по мелочи там сям.
597 Serginio1
 
28.06.16
17:46
И каксается я так понимаю, что нет поддержки на уровне ОС
https://msdn.microsoft.com/ru-ru/library/aa738624(v=vs.110).aspx
598 Serginio1
 
28.06.16
20:07
Кстати .Net Core релизнули. А Samsung подтвердил поддержку
https://blogs.msdn.microsoft.com/dotnet/2016/06/27/announcing-net-core-1-0/

Samsung присоединяется к .NET Foundation

Повышенный интерес к .NET Ядро также приводится к более глубокому взаимодействию в .NET Foundation , которая в настоящее время управляет более чем 60 проектов.  Сегодня мы объявляя Samsung в качестве нового члена .  В апреле Red Hat, Мозги Jet и Единство приветствовали Руководящей группы технического .NET Foundation.

".NET Является отличным технология , которая значительно повышает производительность труда разработчиков. Samsung вносит свой ??вклад в .NET Ядро на GitHub - особенно в области поддержки ARM - и мы с нетерпением ожидаем дальнейшего содействия в .NET сообщества с открытым исходным кодом. Samsung рада присоединиться к технической руководящей группы .NET Foundation и помочь большему количеству разработчиков пользоваться преимуществами .NET. "Хонг-Сек Ким, вице - президент Samsung Electronics.

Вклады от Samsung были впечатляющими.  У них есть отличная команда разработчиков, которые проявили интерес к .NET Core.  Мы рады иметь их как часть большой команды
599 Serginio1
 
29.06.16
09:57
(575) Кстати давно делал. Есть COM класс
glSpeechApi = Новый COMОбъект("SAPI.SpVoice");
        Для каждого звук из glSpeechApi.GetVoices() Цикл
            Сообщить(Звук.ID);
            Если Найти(Звук.ID,"Alyona22k")>0 Тогда
                glSpeechApi.voice=Звук;
                КонецЕсли;
            КонецЦикла;
и вызов
glSpeechApi.Speak(стр);
600 Serginio1
 
30.06.16
15:38
Выложил статью и исходники
https://habrahabr.ru/post/304482/
601 Serginio1
 
01.07.16
13:27
Выложил статью с исходниками Разработка ? Кроссплатформенное использование классов .Net в 1С через Native ВК. Или замена COM на Linux

https://habrahabr.ru/post/304542/
602 russiavp
 
02.07.16
12:34
Помощь нужна в настроике саита на Битрикс. платно. Сам я не шарю от сова совсем

Проблема такая. Связь с 1С у саита есть. Товар выгружается в инфоблок-элементы, но в каталог-товары не выгружается, хотя раньше се работало. И соответстенно на саите товары не появляются.
Обратился к одному программисту с заданием настроить накопительные скидки, в итоге произошел какои-то сбои, человек слинял и на звонки не отечает. Другои программист по саитам два дня уже не может ничего сделать. Честно говоря устал уже бороться. Услуги оказывают некачественно, обманывают и просто разводят на бабло.

Помогите настроить ради Бога, уже руки опускаются  и плкать хочется. С саитом уже третии месяц вожусь и все никак не могу добиться результатов ни от кого. Оплачу работу,
603 Serginio1
 
02.07.16
15:55
(602) Это не ко мне. Я битриксом не занимаюсь. Да и атеист .
Сделай сдельный топик. Сюда все равно мало кто заглядывает.
604 PR
 
02.07.16
16:05
(602) Судя по уровню твоей грамотности мой опыт подсказывает, что ты нам вешаешь лапшу на уши.
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.