Асинхронное программирование в 1С через .Net Native ВК

    Это продолжение статьи Кроссплатформенное использование классов .Net в 1С через Native ВК. Или замена COM на Linux II

    В .Net сейчас во многих классах есть асинхронные методы. В 1С их можно применять например так

    Стр=ъ(Клиент.GetStringAsync(uriSources)).Result;

    И напомню про синонимы из предыдущей статьи/ Так добавив синоним

    Врап.ДобавитьСиноним(HTTPClient.ПолучитьСсылку(),"ПолучитьСтроку","GetStringAsync");
    Врап.ДобавитьСиноним(Task.ПолучитьСсылку(),"Результат","Result");

    Я могу использовать все на русском

    Стр=ъ(Клиент.ПолучитьСтроку(адрес)).Результат;

    Но можно использовать асинхронные методы так.

    
            Клиент = ъ(Врап.Новый(HttpClient.ПолучитьСсылку(),handler.ПолучитьСсылку()));
    	
    	лист=ъНовый("System.Collections.Generic.List`1[System.Threading.Tasks.Task]");
    	Для каждого стр из ПолучитьСписокURL() Цикл
    		Задача=ъ(Клиент.GetStringAsync(стр));
    		лист.Add(задача.ПолучитьСсылку()); 
    	КонецЦикла;
    	
    	Task=ъТип("System.Threading.Tasks.Task");
    	
    	Пока лист.Count>0 Цикл
    		массив=ъ(лист.ToArray());	
    		индекс = Task.WaitAny(массив.ПолучитьСсылку());
    		Сообщить(индекс);
    		результат = ъ(лист.get_Item(индекс)).Result;
    		Сообщить(СтрДлина(результат));
    		лист.RemoveAt(индекс);
    	КонецЦикла;

    Это конечно не совсем асинхронное программирование, но все же лучше чем отдельно для каждого запроса вызывать синхронный метод.

    Но нужно делать асинхронный вызов. Для этого создал простенький класс.

    public class АсинхронныйВыполнитель
        {// Данные связанные с задачей, что бы понять, что к чему при получении события
            public object ДанныеДляЗадача;
          // Сама задача
            public Task Задача;
         // Имя метода 1С обрабатывающего окончание задачи.
            public String ИмяМетода;
         
            public АсинхронныйВыполнитель(Task Задача, String ИмяМетода, Object ДанныеДляЗадача)
            {
                this.Задача = Задача;
                this.ДанныеДляЗадача = ДанныеДляЗадача;
                this.ИмяМетода = ИмяМетода;
                Задача.ContinueWith((t) =>
                {
                    var AW = new AutoWrap(this);
                    AutoWrap.ВызватьВнешнееСобытие1С("АсинхронныйВыполнитель", ИмяМетода, AW.ПолучитьСсылку());
                });
            }
        }

    А на стороне 1С:

    Функция ПолучитьДанныеДляЗадачи(адрес,Номер)
    	
    	объект=ъНовый(ExpandoObject.ПолучитьСсылку());
    	объект.Адрес=адрес;
    	объект.Номер=Номер;
    	возврат объект;
    	
    КонецФункции // ПолучитьДанныеДляЗадачи()
    
    Процедура ТестАсинхронногоВыполнителяНажатие(Элемент)
    		
    	Клиент = ъ(Врап.Новый(HttpClient.ПолучитьСсылку(),handler.ПолучитьСсылку()));
    	
    	лист=ъНовый("System.Collections.Generic.List`1[System.Threading.Tasks.Task]");
    	сч=0;
    	Для каждого стр из ПолучитьСписокURL() Цикл
              // Получаем задачу
    		Задача=ъ(Клиент.GetStringAsync(стр));
            // Получаем данные привязанные к данной задаче
    		объект=ПолучитьДанныеДляЗадачи(стр,сч);
    	//public static void ВыполнитьЗадачу(System.Threading.Tasks.Task Задача, String ИмяМетода, Object ДанныеДляЗадача)
                  
    		Врап.ВыполнитьЗадачу(Задача.ПолучитьСсылку(),"ПолученаСтраница",объект.ПолучитьСсылку());
    		сч=сч+1;
    		
    	КонецЦикла;
    	
    	// Добавим тест на ошибку
    	
    	Тестовый=ъТип("TestDllForCoreClr.Тестовый","TestDllForCoreClr");
    	Тест=ъ(Врап.Новый(Тестовый.ПолучитьСсылку()," Свойство из Конструктора"));
            Thread=ъТип("System.Threading.Thread");
    	
    	// При передаче 2 вызывается ошибка
    	Задача=ъ(Тест.ЗадачаСОшибкойAsync(2));
    	объект=ПолучитьДанныеДляЗадачи("ЗадачаСОшибкойAsync",2);
    	Врап.ВыполнитьЗадачу(Задача.ПолучитьСсылку(),"ПолученаСтраница",объект.ПолучитьСсылку());
    
        Задача2=ъ(Тест.ЗадачаСОшибкойAsync(0));
    	объект=ПолучитьДанныеДляЗадачи("ЗадачаСОшибкойAsync",0);
    	Врап.ВыполнитьЗадачу(Задача2.ПолучитьСсылку(),"ПолученаСтраница",объект.ПолучитьСсылку());
    
    КонецПроцедуры
    
    Процедура   ПолученаСтраница(знач данные)
    	
    	Задача=ъ(данные.Задача);
    	ДанныеДляЗадача=ъ(данные.ДанныеДляЗадача);
    	Сообщить("Адрес="+ДанныеДляЗадача.Адрес);
    	Сообщить("Номер="+ДанныеДляЗадача.Номер);
    
           // При возникновении ошибки при выполнении задачи
          // IsFaulted будет истина, а в Exception будет ошибка
    	Если (Задача.IsFaulted) Тогда  // Ошибка выполнения
    		    ошибка=Задача.Exception;
    		    Сообщить("Ошибка "+Врап.ВСтроку(ошибка));
    		//  Если сделать как ниже 1С хочет присвоить Задача.Exception новое значение
    		//  Даже если оно не было изменено
                    // Так как считает, что параметр передан по ссылке
    		// Сообщить("Ошибка "+Врап.ВСтроку(Задача.Exception));
    	    	   возврат;
    	КонецЕсли;
    		
    	результат=Задача.Result;
    	Сообщить(СтрДлина(результат));
    КонецПроцедуры	
    
    Процедура ВнешнееСобытие(Источник, Событие, Данные)
    	// Вставить содержимое обработчика.
    	
    	Сообщить("Источник="+Источник);
    	Сообщить("Событие="+Событие);
    	Сообщить("Данные="+Данные);
    	
    	Если Источник="АсинхронныйВыполнитель" Тогда
    		Данные=ъ(Данные);
    		Выполнить(Событие+"(Данные)");
    	КонецЕсли; 
    КонецПроцедуры

    Немного поясню по коду.

    Так как в Native ВК нельзя использовать ДобавитьОбработчик то сделаем его эмуляцию передав в АсинхронныйВыполнитель имя метода, который нужно вызвать в 1С

    Врап.ВыполнитьЗадачу(Задача.ПолучитьСсылку(),"ПолученаСтраница",объект.ПолучитьСсылку());

    Который будет вызываться при срабатывании внешнего события.

            Если Источник="АсинхронныйВыполнитель" Тогда
    		Данные=ъ(Данные);
    		Выполнить(Событие+"(ПолученаСтраница)");
    	КонецЕсли;
    

    В данном в переменной Событие хранится ПолученаСтраница и будет вызван метод

    ПолученаСтраница(ПолученаСтраница)

    Теперь про использование Внешнего события в .Net сборке

    Для этого нужно определить поле

     public Action<string, string, string> ВнешнееСобытие1С;

    И установить его из 1С.

    Тестовый=ъТип("TestDllForCoreClr.Тестовый, TestDllForCoreClr, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");
    	Тест=ъ(Врап.Новый(Тестовый.ПолучитьСсылку()," Свойство из Конструктора"));
    	
    	Делегат=Ъ(Врап.ПолучитьДелегатВнешнегоСобытия1C());
    	Тест.ВнешнееСобытие1С=Делегат.ПолучитьСсылку();
    	Тест.TestВнешнегоСобытия();

    Внутри .Net класса вызвать метод

    this?.ВнешнееСобытие1С("Тестовый", "ТестовоеСообщение", значение);

    При этом в 1С вызовется процедура

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


    Я постарался максимально приблизить синтаксис C# в 1С. И по мне, так даже в таком виде проще писать ВК на C#, чем использовать Native API на C++. При этом можно интегрировать использование .Net классов в 1С. Добавляя синонимы можно писать все на кириллице. Можно добавить поддержку итераторов итд.

    Сейчас на Windows много всяких ActiveX, кроме того не сложно и самим написать COM компонент на любом языке.
    Но это не кроссплатформенно.

    Используя .Net Core и данную обертку над объектами .Net в 1С можно значительно расширить возможности 1С используя огромное количество библиотек и классов в них находящихся. И сосредоточиться на разработку языка, наконец добавив замыкания, Linq, указание типа для intellisense (по аналогии с TypeScript). Разбиение модальных диалогов по аналогии с yeld и await в C#. А так же аналоги await для серверных вызовов с замыканиями.

    Я понимаю, что данная разработка мало кому интересна. Но мне было интересно её разрабатывать. Кроме того будет интересна кто пробует .Net Core и использут Reflection

    Примеры и исходники можно скачать Здесь
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 52

      +8
      Мои глаза кровоточат.

      И я даже не про то, что тут адская помесь ру/eng в коде, и даже не про то, что методы имеют ошибки в наименовании (eg. ТестАсинхрнногоВыполнителяНажатие, ПолучитьСписоуURL), а в целом про статью.
      И срсредоточится на разработку языка, наконец добавив замыкания, Linq, указание типа для intellisense


      Несерьёзный подход к написанию статьи (да и кода тоже).
        0
        Спасибо подправлю.
          0
          Полностью с вами соглашусь.
          Хотелось бы высказать своё мнение по-поводу этого «замечательного языка», а может быть и просто замечательного языка — если честно я не незнаю, но всё-таки тревожит меня здесь содержание русского языка, т.к зачем он(мои глаза просто читают его как китайский язык — т.к просто не привычно читать и тем более писать программы на своём оттечественном языке), думаю что Инностранные программисты также воспринимают языки программирования, которые содержат оттечественный язык.
          Всё же лучше писать программы на каком-нибудь другом языке, ежели на своём оттечественном языке.
            +1
            Сидят значит где-нибудь в Microsoft, кровоточат от английского, и только мечтают перейти на 1C.
            Впрочем против 1C ничего не имею)
          +14
          Очень helpful статья, и ъЯзык замечательный. Thanks вам, за то что продвигаете его в массы КонецСпасибо
            –6
            Эта статья для 1С ников. Там пишут все по русски. И я 1С овец. Мне проще давать имена переменным и методам осмыленные русские. А не искать аналоги в переводчиках. Кроме того с добавлением синонимов можно использовать любые классы .Net на русском.
              +5
              искать аналоги в переводчиках

              При знании языка это делать не приходится

                –10
                Еще раз я 1С ник. Мне не зачем англицкий.
                  +3
                  Таблицу умножения предлагаю тоже забыть. Компьютер умножать умеет сам.
                    +1
                    Понимаешь, я пишу основной код на 1С. Там все по русски. И этот код предназначен для 1С. Мне писать на русском и английском нет проблем. И я выбираю, то что мне удобно. Но вот мне интересно, что всех так коробит от латиницы? Вы русский забыли? А в школе я учил немецкий, в институте английский. Но удобнее мне русский.
                    А, что по существу? И кстати здесь код на 1С в основном.
                      +1
                      А по существу: Стр=ъ(Клиент.GetStringAsync(uriSources)).Result; в данной строки какая-то каша из кириллицы и латиницы, а зачем?
                        0
                        По существу это код 1С.

                        ъ это из других статей

                        //1С при передаче по ссылке свойства ВК Список.Current
                        // при выходе из метода присваивает  Список.Current значение переданное изначально
                        // Поэтому помечаем входной параметр как Знач
                        //Или же делать так, если методы изменить нельзя 
                        // То нужно присвоить значение переменной и вызвать метод передав в параметрах эту переменную
                        //Стр=Список.Current; 
                        //Зазача=ъ(Стр);
                        Функция Ъ(знач Ссылка)
                        	
                        	// Создаем объект по ссылке полученной из методов .Net классов
                        	//Физически это строка ёЁ<Ьъ>№_%)Э?&2 содержащее 12 символов для отделения их от других строк
                        	//и индекс в спике исполуемых объектов на стороне .Net
                        	
                        	рез = Новый("AddIn.NetObjectToNative.NetObjectToNative");
                        	// И установим ссылку
                        	рез.УстановитьСсылку(Ссылка);    
                        	возврат  рез
                        КонецФункции // СоздатьОбъектПоСсылке()
                        
                        
                          +2
                          А почему нельзя использовать полностью латиницу?
                            –2
                            Потому, что нужно писать все на кириллице. Для этого создана возможность добавлять синонимы для членов класса
                          –2
                          По существу это код 1С. А там принято писать на кириллице

                          ъ это из других статей

                          //1С при передаче по ссылке свойства ВК Список.Current
                          // при выходе из метода присваивает  Список.Current значение переданное изначально
                          // Поэтому помечаем входной параметр как Знач
                          //Или же делать так, если методы изменить нельзя 
                          // То нужно присвоить значение переменной и вызвать метод передав в параметрах эту переменную
                          //Стр=Список.Current; 
                          //Зазача=ъ(Стр);
                          Функция Ъ(знач Ссылка)
                          	
                          	// Создаем объект по ссылке полученной из методов .Net классов
                          	//Физически это строка ёЁ<Ьъ>№_%)Э?&2 содержащее 12 символов для отделения их от других строк
                          	//и индекс в спике исполуемых объектов на стороне .Net
                          	
                          	рез = Новый("AddIn.NetObjectToNative.NetObjectToNative");
                          	// И установим ссылку
                          	рез.УстановитьСсылку(Ссылка);    
                          	возврат  рез
                          КонецФункции // СоздатьОбъектПоСсылке()
                          
                          


                          В статье я как раз упоминал про синонимы.
                          Так добавив Синонми
                          Врап.ДобавитьСиноним(HTTPClient.ПолучитьСсылку(),"ПолучитьСтроку","GetStringAsync");
                          Врап.ДобавитьСиноним(Task.ПолучитьСсылку(),"Результат","Result");
                          
                          


                          Я могу использовать все на русском

                          Стр=ъ(Клиент.ПолучитьСтроку(адрес)).Результат;
                          
                        0
                        Я её ещё в школе не смог запомнить, и ничего, живу :)
                    +2
                    Вы, простите, 1С кого? :)
                      0
                      Я программирую на разных языках. Чему подтверждение мои статьи. Но основной мой язык программирования 1С.
                  +1
                  А что, вас там await нет ?))
                    –2
                    await вобще то и в C++ полного аналога нет.
                    0
                    «АсинхронныйВыполнитель», ору, простите
                      –1
                      И что должно приводить тебя в экстаз? AsyncRuner?
                      Еще раз вы с гор спустились? Кириллицу ни разу не видели? Зачем ввели возможность использовать Юникод?
                        0
                        Кирилицу видел, код программы видел, код на кирилице не видел) Это как дом из спичек и желудей. По отдельности это обычные вещи, но вместе вывзывают когнитивный диссонанс
                          –1
                          Вы кроме кириллицы ничего не видите? Это как красная тряпка для быка?
                          На 1С уже лет 20 как пишут. И у всех кто программирует на 1С вызывает только восторги. У них как раз на латиницу отторжение.
                          Хотя по мне так смешение языков это нормально. Даже на МКС разговаривают на РусЛише
                      0
                      Ого, вот это автор хапнул негативных комментариев за 1с и кириллицу :))
                        +2
                        Даже если для 1С норма писать вот так — это все равно выглядит ужасно, что бы автор не говорил
                          –1
                          Еще раз можно добавлять синонимы. Вы хоть почитайте. При чем в самом начале статьи.

                          Стр=ъ(Клиент.GetStringAsync(uriSources)).Result;
                          


                          И напомню про синонимы из предыдущей статьи/ Так добавив синоним

                          Врап.ДобавитьСиноним(HTTPClient.ПолучитьСсылку(),"ПолучитьСтроку","GetStringAsync");
                          Врап.ДобавитьСиноним(Task.ПолучитьСсылку(),"Результат","Result");
                          


                          Я могу использовать все на русском

                          Стр=ъ(Клиент.ПолучитьСтроку(адрес)).Результат;
                          


                          Если кого то раздражает смешение языков то может писать чисто на русском или английском.
                          Меня это не раздражает и я выбираю тот который мне нравится.
                          Например в 1С для
                          Get синоним ОтправитьДляОбработки
                          Я выбираю первый вариант, а все остальное мне удобнее писать на русском.
                          Вы кроме кириллицы больше ничего не видите?
                            0
                            Мы видим DSL, который по недоразумению стали считать языком программирования обещго назначения и строгать на нем всякое вот подобное
                            0
                            Количество нетерпимости зашкаливает, а казалось бы, умные люди собрались на специализированном сайте…
                            Каждый инструмент создан для своих задач, и раз люди пользуются 1С, им это нравится, значит инструмент нашёл свою нишу и своих пользователей.
                              0
                              Спасибо. Самый смех, что большинству кто здесь отписался не интересны не 1С, не возможность использования кроссплатформенного использования .Net классов из натива. Но все таки, данная разработка привлекла их внимание. И это тоже неплохо.
                              • НЛО прилетело и опубликовало эту надпись здесь
                                  +1
                                  А я и мне подобные имеем право писать на Руслише. Суть то не в этом. Ни одного комментария по сути статьи. А именно кроссплатформенного использования классов .Net в нативе. Суть в том, что возможности 1С можно расширить за счет классов .Net и синтаксис использования максимально приблизить к синтаксису C#. Вот об этом ни слова.
                                  • НЛО прилетело и опубликовало эту надпись здесь
                                      0
                                      Возможно. Просто когда я писал про использование .Net классов в 1С через Ireflect все кричали не кроссплатформенно и все на латинице.
                                      Ввел кроссплатформенность и ведение синонимов. Можно писать все на русском, максимально довел синтаксис до C#. И молчание.
                                0
                                1С это не язык программирования, это среда программирования бизнесс-алгогритмов.
                                Я тоже зарабатываю на жизнь автоматизируя бизнесс-процессы, используя 1С.
                                Пишу код только на русском, т.к. этот код имеет не только алгоритмическую, но и смысловую нагрузку.
                                Читая код, можно быстро (без толмача) понять, чего хотел добиться программист и какие результаты работы обработки или документа должны получиться.

                                Это специфическая среда разработки и создана она российскими разработчиками.

                                Пы.Сы. При создании 1С предполагалось, что бухгалтер сам сможет вносить изменения в код обработок и документов. Из-за этого было принято решение команды и процедуры, описывающие внутренние механизмы взаимодействия объектов конфигурации, писать кириллицей.
                                У бухгалтеров как-то не сложилось, а программисты 1С так и пишут, используя кириллическое написание команд.
                                  0
                                  Ну насчет бухгалтеров это скорее в 5 и 6. Помню одну которая делала шаблоны для печати документов. А вот начиная с сырой 7.0 уже требовало навыков программирования.
                                    0
                                    Скажу больше. До сих пор нерадивые директора малых и средних предприятий (некоторые из них, были моими клиентами) говорят бухгалтеру: «Я же купил вам бухгалтерию предприятия? Я же заплатил деньги? Зачем ещё звать программиста, ведь там всё должно быть?! А если этого нет, делайте сами!» :)
                                    В общем жесть жестяная :)
                                      0
                                      Жалко нет смайликов. Улыбнуло.
                                  –1
                                  Статья про 1С на хабре приравнивается к хабрасуициду.
                                  Впрочем, вполне обоснованно.
                                    0
                                    А почему обоснованно? Я не считаю себя камикадзе. Привлек внимание кому это интересно. Кто то впервый раз увидел кириллицу в коде, и пришел в шок от этого. Это нормально.
                                    Плохо, когда статья не вызывает никаких эмоций.
                                      –1
                                      Ради всех цифровых богов, не подумайте, что хотел обидеть или задеть. Попробую объяснить свою, возможно, сугубо субъективную точку зрения.
                                      Начнем с предпосылок, с чего все начинается.
                                      Начинается все с человека, искренне увлеченного 1С. Собственно, это только хорошо, и, даже более того, вызывает уважение. Увлеченность вообще штука редкая и склонная вызывать уважение (причем не только среди 1С-ников, но и в любой другой сфере в принципе). Вот этот самый человек пишет статью на хабр. Увлеченно пишет, в восторженных тонах, ведь он нашел очень интересный материал (в вашем случае прямо честно скажу, материал интересный, да и подход мне лично понравился). Естественно, человек ожидает некоторой отдачи, причем положительного толка, на то, что он написал. И вот тут, как правило, закопана собака. Эта собака закопана в той части, которая Хабрахабр.
                                      Кто здесь собирается и комментирует? Правильно, технические специалисты совершенно различного толка, но, как правило, с некоторым опытом за спиной. Взгляните на вашу статью глазами «не 1С-ника» (смею уверить, таких тут подавляющее большинство).
                                      Вы показываете некоторую «прорывную фичу», которая для любого разработчика (не 1С) кажется нормой и вообще «ничем удивительным». При этом выглядит решение, мягко говоря, «странно».
                                      Коммент «Очень helpful статья, и ъЯзык замечательный. Thanks вам, за то что продвигаете его в массы КонецСпасибо» — он, конечно, может показаться излишне язвительным, но, суть в том, что он «по теме» (при этом выдержано идеально в стилистике и корректно ровно в той мере, каковая необходима для сохранения смысла шутки-с-долей-правды, респект автору).
                                      К сожалению, человеку свойственно рефлексировать. И вы, как и все прошлые авторы «в тематике», не избежали этой участи. Я вас не виню, это действительно очень сложно — не отреагировать на подкол, а рассмотреть за ним вполне конструктивную критику. А она есть, и она действительно указывает на существенный недостаток. Вы же «срефлексировали». Вот это: «Понимаешь, я пишу основной код на 1С. Там все по русски. И этот код предназначен для 1С...» — больше похоже на детскую обиду и что-то вроде «а ты ваще вали отсюда, я тут пишу».
                                      Вот тут — самый опасный капкан.
                                      Если вы чувствуете в себе силы «отшутиться», подколоть в ответ, либо разумно по полочкам разложить «конструктивную часть вопроса» и проигнорировать все «неконструктивные выпады», тогда да — вопросов нет, вы специалист, который, в окружении неразумных детей разъясняет суть вопроса. Если вы хоть раз ответили обидой или «неконструктивом» со своей стороны, вся ваша идея с публикацией неизбежно превращается в балаган в комментариях и корм для троллей, когда сурово-адекватные пользователи минусуют вас за неконструктив, а «кормящиеся» участники продолжают вас троллить.
                                      Собственно, вот так и получается хабрасуицид. Что с этим делать — решать вам. Вы можете больше не писать на эту тему, либо подготовиться к реакции многоуважаемой публики. Можете попробовать написать на профильные ресурсы по 1С, но, боюсь, там это будет неинтересно (специфика специализации на 1С).
                                      Если хотите конструктивной и выдержанной критики и полемики — милости прошу, можно пообсуждать конкретно вашу статью. Попробуем потренироваться в сдержанности, мне это тоже не повредит)
                                        0
                                        Спасибо. Я уже понял здешние нравы. Я просто новичок. на данном форуме.
                                        Я пишу на разные площадки. Суть то в том, что с помощью данной разработки можно расширить возможности 1С, при этом приблизить синтаксис вызова методов и свойств .Net классов из нативного 1С, до синтаксиса C#. Я давно уже пишу обертки над .Net классами.
                                        Вот все разработки

                                        Смысл использовать существующие .Net библиотеки в 1С, так и адаптация кода под 1С.
                                          0
                                          И добавлю что на ресурсах 1С согласны пользоваться этой разработкой, если она будет интегрирована 1С.
                                          Пока моя задача просто показать возможности и довести по максимуму удобство использования. Что я и показал в статьях.
                                            0
                                            Нравы, как раз, нормальные. Даже образцовые, я бы сказал. Хоть и не без перегибов. Вон, и я минусов нахватал).
                                            Просто в вашей же статье немного спорная подача. Взять хотя бы заголовок: «Асинхронное программирование в 1С через .Net Native ВК».
                                            Дело в том, что непосредственно сама механика RPC в кроссплатформе в .Net Core к 1С отношение имеет постольку-поскольку. Ну, т.е., практически никакого. Да и представление об «асинхронном программировании» может варьироваться. Вы же сами, несмотря на громкий заголовок, пишете «Это конечно не совсем асинхронное программирование». Признаться, из заголовка можно было ожидать большего, но, чуда не случилось.
                                            Впрочем, пора, наверное, завязывать с речами «адвоката Хабра». Чисто по сути, язык 1С — это DSL, возможно, неплохой, но при этом достаточно ограниченный, замкнутый, обреченный на отставание и завязанный на своей вполне себе проприетарной экосистеме, причем от единственного вендора, практически не встречаемого за пределами СНГ (если надобно, могу привести обоснования по каждому пункту из перечня).
                                            По статье конкретно из критики:
                                            лист=ъНовый(«System.Collections.Generic.List`1[System.Threading.Tasks.Task]»);
                                            Вот это действительно страшно выглядит. Тут остается только искренне сочувствовать тем, кто вынужден это писать. И, таки да, по моему мнению кириллица в программировании — зло. Ну хотя бы из-за таких вот языковых конструкций. Вдумайтесь. Давайте на примере попробуем:
                                            Sheet = xNew(«System.Collections.Generic.List`1[System.Threading.Tasks.Task]») — ну реально же лучше. Даже не потому, что смотрится более «нативно». Просто есть такая штука — контекст. В данном случае я говорю о мыслительном контексте. И вот его «переключение» — штука достаточно накладная. Да, в данном случае его не избежать при любом раскладе. Мы имеем строку на C#, обернутую в строку 1С. Т.е. нам надо с 1С-контекста переключиться на контекст C#, что уже неприятно. Вы предлагаете в процессе переключиться еще и с русского языка на английский. Вот чисто по мне — это недостаток.
                                            Ну а по поводу «если она будет интегрирована 1С» из вашего следующего коммента. Не уверен, что это нужно самой 1С. Даже ваша статья — это попытка «побега» из текущих реалий 1С. Много просто нет, а хочется. В случае «бесшовной интеграции» с .Net, имхо, миграция конфигураций с 1С на .Net — вопрос исключительно временный. Не уверен, что 1С в этом хоть сколько-нибудь заинтересовано. Впрочем, тут могу ошибаться. Некоторое достаточно продолжительное уже время с 1С не пересекался, потому за «курсом компании» не слежу.
                                              0
                                              Вот ниже есть метод

                                                   Клиент = ъ(Врап.Новый(HttpClient.ПолучитьСсылку(),handler.ПолучитьСсылку()));
                                              	
                                              	лист=ъНовый("System.Collections.Generic.List`1[System.Threading.Tasks.Task]");
                                              	сч=0;
                                              	Для каждого стр из ПолучитьСписокURL() Цикл
                                                        // Получаем задачу
                                              		Задача=ъ(Клиент.GetStringAsync(стр));
                                                      // Получаем данные привязанные к данной задаче
                                              		объект=ПолучитьДанныеДляЗадачи(стр,сч);
                                              	//public static void ВыполнитьЗадачу(System.Threading.Tasks.Task Задача, String ИмяМетода, Object ДанныеДляЗадача)
                                                            
                                              		Врап.ВыполнитьЗадачу(Задача.ПолучитьСсылку(),"ПолученаСтраница",объект.ПолучитьСсылку());
                                              		сч=сч+1;
                                              		
                                              	КонецЦикла;
                                              
                                              


                                              В данном случае создается объект с задачей, после выполнения задачи вызвается метод в 1С ВнешнееСобытие, котрый по переданным данным вызывает метод связанный с эти событием.

                                              Процедура   ПолученаСтраница(знач данные)
                                              	
                                              	Задача=ъ(данные.Задача);
                                              	ДанныеДляЗадача=ъ(данные.ДанныеДляЗадача);
                                              	Сообщить("Адрес="+ДанныеДляЗадача.Адрес);
                                              	Сообщить("Номер="+ДанныеДляЗадача.Номер);
                                              
                                                     // При возникновении ошибки при выполнении задачи
                                                    // IsFaulted будет истина, а в Exception будет ошибка
                                              	Если (Задача.IsFaulted) Тогда  // Ошибка выполнения
                                              		    ошибка=Задача.Exception;
                                              		    Сообщить("Ошибка "+Врап.ВСтроку(ошибка));
                                              		//  Если сделать как ниже 1С хочет присвоить Задача.Exception новое значение
                                              		//  Даже если оно не было изменено
                                                              // Так как считает, что параметр передан по ссылке
                                              		// Сообщить("Ошибка "+Врап.ВСтроку(Задача.Exception));
                                              	    	   возврат;
                                              	КонецЕсли;
                                              		
                                              	результат=Задача.Result;
                                              	Сообщить(СтрДлина(результат));
                                              КонецПроцедуры	
                                              
                                              Процедура ВнешнееСобытие(Источник, Событие, Данные)
                                              	// Вставить содержимое обработчика.
                                              	
                                              	Сообщить("Источник="+Источник);
                                              	Сообщить("Событие="+Событие);
                                              	Сообщить("Данные="+Данные);
                                              	
                                              	Если Источник="АсинхронныйВыполнитель" Тогда
                                              		Данные=ъ(Данные);
                                              		Выполнить(Событие+"(Данные)");
                                              	КонецЕсли; 
                                              КонецПроцедуры
                                              


                                              Что касается руслиша, то я пишу на нем лет 20 и он мне нравится. Писать приходится много и давать осмысленные имена на русском проще. Кроме того в свойства документов справочников они русские. 1С как раз неудобна латиница. Поэтому я ввел синонимы. Теперь можно писать только на одном языке.
                                              По поводу интеграции, то в 1С есть ComОбъект, который не отличается от предлженного мной NetОбъект или JavaОбъект.
                                              1С это не только DSL. Это совмещение клиентского и серверного кода, удобные генераторы отчетов (Система компоновки данных СКД)
                                              Готовые конфигурации, которые можно расширять. 1С заинтересована выходить за пределы СНГ. Чем больше функционал, тем проще решать проблемы.
                                                0
                                                >> 1С это не только DSL.
                                                Все же DSL. Все же, язык не поворачивается назвать 1С языком общего назначения. Ну вот хоть режьте.
                                                Более того, ваша статья — прямое подтверждение моих слов. Вы пишете обертку для использования в коде 1С конструкций C#, высокоуровневого языка общего назначения. Зачем вы это делаете? Очевидно, компенсируете недостающие в 1С механизмы.
                                                Насчет поддержки со стороны компании 1С. Ну, в бытность мою штатным программистом 1С 7.7 такие вещи как «1С++» и «прямые запросы» были не только «глотком воздуха», но и шикарнейшим подспорьем. Насколько я в курсе, каких-то попыток интегрировать (хотя бы на уровне идей) или поддержать со стороны вендора замечено не было. Оно и логично. Дайте возможность «бесшовной интеграции» 1С с Net или Java, и возникновение мысли «А зачем в этой конструкции 1С?» станет исключительно вопросом времени. В конечном итоге, фирма 1С заинтересована не только и не столько в количестве возможностей для разработчика, сколько в удержании разработчика «внутри себя», в пределах строго своего технологического стека (очень похоже на ранний Microsoft). В конечном итоге, 1С раскачивается что-то сделать тогда, когда разработчики уже буквально бьются головой о стену, завывая «ну дайте уже фичу, ну интегрируйте продукт». На выходе мы получаем, как правило, узкоприменимое местечковое решение от самой 1С без интеграции с чем-то уже имеющимся. Возьмите хоть пресловутый контроль версий и «выгружаемую конфигурацию».
                                                >>> 1С заинтересована выходить за пределы СНГ.
                                                Ну, это все хотят. Но именно с этим у 1С проблемы. Без глобальной смены политики — не получится. Короче, не верю.
                                                Ну а по поводу «руслиша»… Ну, может оно и моя личная неприязнь. Но даже вот по клавиатуре посмотрите. Есть такие символы, как <>…
                                                Если Переменная1(тут переключение раскладки) > (переключение раскладки) Переменная2 Тогда…
                                                Ну неудобно…
                                                  0
                                                  Я пишу на руслише 20 лет. У меня это не вызывает проблем. Кроме того 1С сама дает названия
                                                  ComОбъект, ЧтениеXML, ОбъектXDTO итд. Что касается 7 ки, то С++ это более продвинутый инструмент 8 ки. Он конкурент. Поэтому и нет смысла его внедрять. Что касается моей разраьотки, то она направлена прежде всего на кросссплатформенность. На Windows есть COM через который можно все интегрировать. С Линуксом значительно сложнее. В любом случае я сделал всё, что мог. Найду другое приложение своих сил. Просто в данную разработку я вложил много времени. Как на получение новых знаний, так и на саму разработку. И аналог через IReflect позволяет решать кучу задач. Начиная от неподдерживаемых 1С вэб сервисов, Regex закачинвая месенджерами например на основе SignalR парсерами типа AngleSharp итд.
                                                  Мою разработку можно использовать из любого языка на нативе если нужно использовать какуюлибо сборку на .Net.
                                                    0
                                                    Не то, чтобы ComОбъект и прочее было проблемой. Но неудобство оно вызывает, тут вы, наверное, со мной согласитесь.
                                                    >> В любом случае я сделал всё, что мог. Найду другое приложение своих сил.
                                                    А отчаиваетесь вы зря. Инструмент вы создали, при этом достаточно неплохой, и он, вероятно, будет востребован. Просто с аудиторией промахнулись.

                                                    Вот лично мне интероп с 1С интересен в обратную сторону. Когда, условно, COM-сервером выступает сама 1С-ка. Т.е. интерфейс, который позволяет, скажем, из .Net-кода или из Java замутить конструкцию вида:
                                                    List GoodsListFrom1S = Com1SInterface.getInstanceByQuery(«Справочник.Номенклатура»)
                                                    .getByParent(«001245»);
                                                    for(Inst1SItem item: GoodsListFrom1S) {
                                                    System.out.println(item.Name());
                                                    }
                                      0
                                      Ну сейчас это возможно через COM. Кстати в статье Быстрое создание Внешних Компонент на C#. Примеры использования Глобального Контекста, IAsyncEvent, IExtWndsSupport, WinForms и WPF
                                      Можно в ВК использовать глобальный Контекст и создавать любые объекты 1С. Но это COM.
                                      Для Native ВК это тоже возможно, но…
                                        0

                                        ctrl+f Mithgol
                                        хмммм, ему тут место, мне кажется.

                                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                        Самое читаемое