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

09.08.16

Разработка - Языки и среды

Это продолжение статьи http://infostart.ru/public/534901/ С того времени добавил поддержку методов с параметрами по умолчанию, вызов методов расширений, вывод типов для дженерик методов, поддержка объектов реализующих IDynamicMetaObjectProvider (ExpandoObject,DynamicObject), добавление синонимов к членам типа и асинхронное программирование на 1С!
В свое время написал статью .Net в 1С. На примере использования HTTPClient,AngleSharp. Удобный парсинг сайтов с помощью библиотеки AngleSharp, в том числе с авторизацией аля JQuery с использованием CSS селекторов. Динамическая компиляция  .Net в 1С. На примере использования HTTPClient,AngleSharp. Удобный парсинг сайтов с помощью библиотеки AngleSharp, в том числе с авторизацией аля JQuery с использованием CSS селекторов. Динамическая компиляция
 В котором был пример использования методов расширения, дженерик методов, параметров по умолчанию. И в итоге код с использованием IReflect был очень далек от реального на C#. В новой версии я попытался максимально приблизить код на 1С к оригиналу.
Разберем пример на C#
        var config = Configuration.Default.WithDefaultLoader().WithCookies();
	// Устанавливаем адрес страницы сайта
	var address = "https://en.wikipedia.org/wiki/List_of_The_Big_Bang_Theory_episodes";
	// загружаем страницу и разбираем её
	var document = BrowsingContext.New(config).OpenAsync(address).Result;
	// найдем <a href="/wiki/The_Big_Bang_Theory" title="The Big Bang Theory">The Big Bang Theory</a>
	var rowSelector = "a[title='The Big Bang Theory']";
	var HtmlAnchorElement = document.QuerySelector<IHtmlAnchorElement>(rowSelector);
	rowSelector="form#searchform";	
	var FormElement = doc.<IHtmlFormElement>QuerySelector(rowSelector));

 Вот его аналог на 1С

        СборкаAngleSharp=ъ(Врап.Сборка("AngleSharp"));
	Assembly=ъ(СборкаAngleSharp.GetType());
	Врап.ДобавитьСиноним(Assembly.ПолучитьСсылку(),"Тип","GetType");
	
	
	// Теперь мы можем использовать синоним Тип
	AngleSharp_Configuration=ъ(СборкаAngleSharp.Тип("AngleSharp.Configuration"));
	// Или вызвать реальный метод  GetType
	HtmlParser=ъ(СборкаAngleSharp.GetType("AngleSharp.Parser.Html.HtmlParser"));
       
       //Получим типы
	BrowsingContext = ъ(СборкаAngleSharp.Тип("AngleSharp.BrowsingContext"));
	Configuration=ъ(СборкаAngleSharp.Тип("AngleSharp.Configuration"));
	
	// Методы рсширения ConfigurationExtensions
	// public static IConfiguration WithDefaultLoader(this IConfiguration configuration, Action<LoaderService> setup = null, IEnumerable<IRequester> requesters = null);
	// public static IConfiguration WithCookies(this IConfiguration configuration);
	config = ъ(ъ(ъ(Configuration.Default).WithDefaultLoader()).WithCookies());
	
	address = "https://en.wikipedia.org/wiki/List_of_The_Big_Bang_Theory_episodes";
        context = ъ(BrowsingContext.New(config.ПолучитьСсылку()));	
	
	// Загрузим начальную страницу
	// Метод расширения BrowsingContextExtensions
	//public static Task<IDocument> OpenAsync(this IBrowsingContext context, string address);
	
	document =  ъ(ъ(context.OpenAsync(address)).Result);
	
	rowSelector = "a[title='The Big Bang Theory']";	
	// Метод расширения ApiExtensions
	//public static TElement QuerySelector<TElement>(this IParentNode parent, string selectors) where TElement : class, IElement;
	HtmlAnchorElement=ъ(ъ(document.in(IHtmlAnchorElement.ПолучитьСсылку())).QuerySelector(rowSelector));
	
	//Метод расширения ApiExtensions
	//public static Task<IDocument> ApiExtensions.NavigateAsync<TElement>(this TElement element) where TElement : IUrlUtilities, IElement;
	//Вывод типа this TElement  по ограничению IElement
	doc=ъ(ъ(HtmlAnchorElement.NavigateAsync()).Result);
	
	rowSelector="form#searchform";
	FormElement = ъ(ъ(doc.in(IHtmlFormElement.ПолучитьСсылку())).QuerySelector(rowSelector));
	
	Сообщить("OuterHtml="+FormElement.OuterHtml);

Обращу внимание на несколько моментов
Конструкция
document.QuerySelector<IHtmlAnchorElement>(rowSelector);
На 1С выглядит так
HtmlAnchorElement=ъ(ъ(document.in(IHtmlAnchorElement.ПолучитьСсылку())).QuerySelector(rowSelector));
 Я использовал зарезервированное слово in Для создания потомка DynamicObject, в котором сохраняются объект и дженерик аргументы, а затем через TryInvokeMember получаем имя метода и параметры и находим нужный метод и выполняем .
 Пока для дженериков не реализовал методы с дефолтными параметрами и параметрами массивами.
Для дженериков выводится типы для таких конструкций
 public K ДженерикМетод3<K>(IList<K> param1, int param2, K param3)

 Пример на 1С
 List=ъНовый("System.Collections.Generic.List`1[System.String]");
 Сообщить(Тест.ДженерикМетод3(List.ПолучитьСсылку(),3,"Привет3"));
 Тип выводится из List приводя к Ilist и сравнивая результат с типом 3 параметра.
 1. Нет кроссплатформенности
 2. Нет рускоязычных синонимов.
 Ну с кроссплатформенностью подсобил MS, и сделал кроссплатформенную компоненту.
 И сделал возможность добавлять синонимы к типу. 

 СборкаAngleSharp=ъ(Врап.Сборка("AngleSharp"));

 Assembly=ъ(СборкаAngleSharp.GetType());

 Врап.ДобавитьСиноним(Assembly.ПолучитьСсылку(),"Тип","GetType");

  
 
 // Теперь мы можем использовать синоним Тип

 AngleSharp_Configuration=ъ(СборкаAngleSharp.Тип("AngleSharp.Configuration"));

 // Или вызвать реальный метод  GetType

 HtmlParser=ъ(СборкаAngleSharp.GetType("AngleSharp.Parser.Html.HtmlParser"));
 Синонимы можно использовать и из расширений. Например
 public static class РасширенияДляТестовый

    {

        public static string ПолучитьСтрокуИзРасширенияСпарам(this Тестовый тест,string Str)

        {

            return тест.ПолучитьСтроку()+" "+ Str;

        }

    }


 Теперь можно вызвать
        // Ищем сборку по путям переданным при создании компоненты
        //ПодключитьВнешнююКомпоненту(ИмяФайла, "NetObjectToNative",ТипВнешнейКомпоненты.Native);
        // Врап = Новый("AddIn.NetObjectToNative.LoaderCLR");
        // Врап.СоздатьОбертку(CoreClrDir,ДиректорияNetObjectToNative,"");
        // Где
        // CoreClrDir Это директория где лежат основные библиотеки .Net и в частности coreclr
        // ДиректорияNetObjectToNative директория где лежит эта сборка
        // на данный момент все пользовательские сборки нужно сохранять рядом с ней
        //Пример использования
        //СборкаHttpClient=ъ(Врап.Сборка("System.Net.Http",истина));
        //HttpClient=ъ(СборкаHttpClient.GetType("System.Net.Http.HttpClient"));
       // Можно опускать разрешение. По умолчанию Dll
    РасширенияДляТестовый=ъ(СборкаТестовый.Тип("TestDllForCoreClr.РасширенияДляТестовый"));
    Врап.ДобавитьСиноним(РасширенияДляТестовый.ПолучитьСсылку(),"GetStringFromExtensionWithParams","ПолучитьСтрокуИзРасширенияСпарам");

   // Вызовем по оригигальному названию
    Сообщить(Тест.ПолучитьСтрокуИзРасширенияСпарам("Привет"));
   // Вызовем по синониму
    Сообщить(Тест.GetStringFromExtensionWithParams("Привет из GetStringFromExtensionWithParams"));


 Так же можно вызывать расширения и для дженерик методов. В том числе с выводом по ограничению
       Метод расширения ApiExtensions
public static Task<IDocument> ApiExtensions.NavigateAsync<TElement>(this TElement element) where TElement : IUrlUtilities, IElement;


 
     Выводится тип this TElement  по ограничению IElement
  doc=ъ(ъ(HtmlAnchorElement.NavigateAsync()).Result);
 Пока не нашел способа просмотреть все загруженные сборки. Поэтому поиск расширений пока ведется в сборке где находится тип с вызываемым методом. Надеюсь осенью выйдет релиз с большими возможностями. Правда можно вручную добавить сборки в которых нужно искать расширения.
Кроме того добавил более краткую запись получения интерфейса

Вместо
  Перечислимый=ъ(Врап.ПолучитьИнтерфейс(Объект.ПолучитьСсылку(),"IEnumerable"));

Можно использовать as

        Перечислимый=ъ(Объект.as("IEnumerable"));
	Перечислитель=ъ(Перечислимый.GetEnumerator());
	// На всякий случай приведем к Интерфейсу IEnumerator
	Перечислитель=ъ(Перечислитель.as("IEnumerator"));
 Примеры и исходники можно скачать Здесь
 В следующей статье расскажу про асинхронное программирование в 1С

.Net Core C# .Native ВК

См. также

Языки и среды Программист Платформа 1С v8.3 Бесплатно (free)

Будем писать свои скрипты на питоне и запускать их на 1С.

15.04.2024    4035    YA_418728146    13    

62

Мобильная разработка Языки и среды 1С:Элемент Программист Бесплатно (free)

Flutter может быть использован с 1С:Предприятием для разработки кроссплатформенных мобильных приложений, обеспечивая единый интерфейс и функциональность на устройствах под управлением iOS и Android. Это позволяет создавать приложения с высокой производительностью благодаря использованию собственного движка рендеринга Flutter. Интеграция Flutter с 1С:Предприятием позволяет создавать мобильные приложения любого уровня сложности, интегрировать их в корпоративные информационные системы, а также реализовывать бизнес-логику

19.03.2024    18320    ROk_dev    74    

43

Языки и среды Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Существует множество языков программирования, и каждый имеет свои особенности по работе с типами данных. Слабые, явные, динамические и другие... Но кто же здесь 1С и почему с приходом "строгой" типизации EDT 1С-программистам стоит задуматься над изменением своих привычек.

16.01.2024    7332    SeiOkami    25    

61

Языки и среды Программист Бесплатно (free)

Пример небольшого приложения, с которого можно начать изучать язык программирования Dart.

08.08.2023    4206    acvatoris    6    

15

Языки и среды Программист Платформа 1С v8.3 Россия Бесплатно (free)

Написание статического анализатора для 1С традиционным способом на Си.

30.06.2023    3496    prohorp    15    

12

Языки и среды Программист Абонемент ($m)

Поставили нам задачу - вынести на отдельный сервер функционал получения заказов от клиентов по электронной почте, парсинг полученных XLS в приемлемый вид и трансформация заказов в красивый JSON, понятный нашей учетной системе на 1С. Всю эту красоту желательно запустить в отдельном докер - контейнере, по возможности не тратя лицензии, поэтому отдельно стоящую конфигурацию на БСП отвергаем сразу. Можно было бы собрать всё на Apache Airflow или Apache NiFi, но решили попробовать реализовать всю логику без Open Source, будем делать свой ETL, с Исполнителем, который в версии 3.0 научился взаимодействовать с электронной почтой по IMAP. Начнем с середины - сначала напишем скрипты, а потом соберем их в рабочую конструкцию

1 стартмани

01.06.2023    2314    0    kembrik    2    

7

Языки и среды Программист Платформа 1С v8.3 Бесплатно (free)

При работе с 1С ORM (object relation mapping) все время преследует ощущение постоянного создания монолитного приложения — один раз привязался к какой либо сущности (например, справочник Контрагенты), и весь код заполнен ссылками на эту конкретную реализацию. Можно ли независимо разрабатывать в ORM совместимые между собой справочник «Контрагентов» и использующий его документ «Платежное поручение», но при этом избежать жестких зависимостей? Спасут ли нас микросервисы? Пример на аннотациях Java демонстрирует, как это возможно делать.

13.03.2023    1306    1CUnlimited    0    

3
Оставьте свое сообщение