Кроссплатформенное использование классов .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 ВК

См. также

Как вызвать скрипты на python в 1С по технологии NativeAPI

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

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

15.04.2024    1662    YA_418728146    11    

53

Зачем нам 1С:Элемент

Мобильная разработка Языки и среды Бесплатно (free)

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

19.03.2024    9797    ROk_dev    67    

41

(Не) Строгая типизация 1С

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

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

16.01.2024    4621    SeiOkami    21    

55

Простое приложение на Dart

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

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

08.08.2023    3368    acvatoris    6    

14

Статический анализатор кода 1С на Си

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

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

30.06.2023    3067    prohorp    15    

12

Сквозная задача на Исполнителе - часть первая (IMAP)

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

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

1 стартмани

01.06.2023    1953    0    kembrik    2    

7

1С# - Расширяем код 1С кодом на C#

Языки и среды Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Вставки кода на C# внутри кода на 1С.

7 стартмани

07.04.2023    9493    4    SerVer1C    56    

43

Независимая разработка совместимых компонент на ORM 1С – миф или истина где-то в аннотациях Java?

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

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

13.03.2023    1069    1CUnlimited    0    

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