All streams
Search
Write a publication
Pull to refresh
17
0
Смирнов Сергей @Serginio1

Программист

Send message
А вот для строкового представления в InvariantCulure лучше использовать XMLСтрока
В 1С invariantCulure для чисел. То есть в любой локали то есть 8000.93 будет 8000.93 в любой локали.
За статью спасибо, посмотрю.
Ну сейчас это возможно через COM. Кстати в статье Быстрое создание Внешних Компонент на C#. Примеры использования Глобального Контекста, IAsyncEvent, IExtWndsSupport, WinForms и WPF
Можно в ВК использовать глобальный Контекст и создавать любые объекты 1С. Но это COM.
Для Native ВК это тоже возможно, но…
Я пишу на руслише 20 лет. У меня это не вызывает проблем. Кроме того 1С сама дает названия
ComОбъект, ЧтениеXML, ОбъектXDTO итд. Что касается 7 ки, то С++ это более продвинутый инструмент 8 ки. Он конкурент. Поэтому и нет смысла его внедрять. Что касается моей разраьотки, то она направлена прежде всего на кросссплатформенность. На Windows есть COM через который можно все интегрировать. С Линуксом значительно сложнее. В любом случае я сделал всё, что мог. Найду другое приложение своих сил. Просто в данную разработку я вложил много времени. Как на получение новых знаний, так и на саму разработку. И аналог через IReflect позволяет решать кучу задач. Начиная от неподдерживаемых 1С вэб сервисов, Regex закачинвая месенджерами например на основе SignalR парсерами типа AngleSharp итд.
Мою разработку можно использовать из любого языка на нативе если нужно использовать какуюлибо сборку на .Net.
Вот ниже есть метод

     Клиент = ъ(Врап.Новый(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С заинтересована выходить за пределы СНГ. Чем больше функционал, тем проще решать проблемы.
И добавлю что на ресурсах 1С согласны пользоваться этой разработкой, если она будет интегрирована 1С.
Пока моя задача просто показать возможности и довести по максимуму удобство использования. Что я и показал в статьях.
Спасибо. Я уже понял здешние нравы. Я просто новичок. на данном форуме.
Я пишу на разные площадки. Суть то в том, что с помощью данной разработки можно расширить возможности 1С, при этом приблизить синтаксис вызова методов и свойств .Net классов из нативного 1С, до синтаксиса C#. Я давно уже пишу обертки над .Net классами.
Вот все разработки

Смысл использовать существующие .Net библиотеки в 1С, так и адаптация кода под 1С.
А почему обоснованно? Я не считаю себя камикадзе. Привлек внимание кому это интересно. Кто то впервый раз увидел кириллицу в коде, и пришел в шок от этого. Это нормально.
Плохо, когда статья не вызывает никаких эмоций.
В шапке статьи есть ссылка на предыдущюю статью Кроссплатформенное использование классов .Net в 1С через Native ВК. Или замена COM на Linux

Которая в свою очередь ссылается на Кроссплатформенное использование классов .Net из неуправляемого кода. Или аналог IDispatch на Linux
И там подробно описано, что как и почему.
Так как из Native ВК возвращается закодированная строка например ёЁ<Ьъ>№_%)Э?&2
//Физически это строка ёЁ<Ьъ>№_%)Э?&2 содержащее 12 символов для отделения их от других строк
//и индекс в спике исполуемых объектов на стороне .Net

То есть СборкаAngleSharp.GetType() вернет не объект а строку.

Я не вижу огромной разницы между $ ъ cog. Они не несут никакой смысловой нагрузки. А вот код на 1С максимально приближен к коду на C#

var config = Configuration.Default.WithDefaultLoader().WithCookies();


config = ъ(ъ(ъ(Configuration.Default).WithDefaultLoader()).WithCookies());


И ъ будет встречаться на каждом шагу. Поэтому вэб программисты испльзуя JQuery используют $ а не метод JQuery
Никто не запрещает тебе использовать вместо ъ cog. Это дело вкуса.
Я в статье дал ссылку на статью где используется COM через IReflect. Там можно получать и передавать объекты, но нет возможности использовать дженерики напрямую.
Net в 1С. На примере использования HTTPClient,AngleSharp. Удобный парсинг сайтов с помощью библиотеки AngleSharp, в том числе с авторизацией аля JQuery с использованием CSS селекторов. Динамическая компиляция

Приведу код который решает ту же задачу, но он менее удобный чем с ъ

В C# есть удобный сахар в виде расширений. Например, код
Configuration.Default.WithDefaultLoader().WithCookies();


//На самом деле представляет собой

var configuration = AngleSharp.Configuration.Default;

            configuration=AngleSharp.ConfigurationExtensions.WithDefaultLoader(configuration);
            configuration = AngleSharp.ConfigurationExtensions.WithCookies(configuration);


//

Так как функция WithDefaultLoader представляет функцию расширения
// так как первый параметр помечен как this 
// Что позволяет использовать этот метод через точку
public static IConfiguration WithDefaultLoader(this IConfiguration configuration, Action<LoaderService> setup = null, IEnumerable<IRequester> requesters = null);

 
Кроме того, используются дженерик функции. Я покажу, как с этим бороться.
Но, к сожалению, красивый код на C# превращается в монстра на 1С. Но зато есть примеры, как с этим бороться

//Получить типизированную дженерик функцию
//TElement QuerySelector<TElement>(this IParentNode parent, string selectors) 
Функция ПолучитьДжененрикМетодИнфо(тип,ИмяМетода,типПараметра)
    method = Врап.ТипКакОбъект(тип).GetMethod(ИмяМетода);
    generic = method.MakeGenericMethod(типПараметра);
    return generic;
    
КонецФункции

// Когда есть перегрузка методов нужно искать метод по имени и типам параметров
// Task<IDocument> Navigate<TElement>(this TElement element)
// string Text<T>(this T element)
Функция ПолучитьМетодИнфоОдинДженерикТип(тип,ИмяМетода,типПараметра)
    
    Для Каждого m in Врап.ТипКакОбъект(тип).GetMethods() Цикл
        
        параметры = m.GetParameters();
        if  (m.Name = ИмяМетода)   
            И (параметры.Length = 1)
            И (Врап.ТипКакОбъект(параметры.GetValue(0).ParameterType).IsGenericParameter)
            Тогда
            method = m;
            break;
        КонецЕсли
    КонецЦикла;
    generic = method.MakeGenericMethod(типПараметра);
    return generic;
    
КонецФункции

Функция  ПолучитьМетодИнфо(тип,ИмяМетода)
    method = Врап.ТипКакОбъект(тип).GetMethod(ИмяМетода);
    
    return method;
    
КонецФункции

Функция  ПолучитьПропертиИнфо(тип,ИмяСвойства)
    свойство = Врап.ТипКакОбъект(тип).GetProperty(ИмяСвойства);
    
    return свойство;
    
КонецФункции

Функция ПолучитьМетодИнфо2Параметра(тип,ИмяМетода)
    
    Для Каждого m in Врап.ТипКакОбъект(тип).GetMethods() Цикл
        
        параметры = m.GetParameters();
        if  (m.Name = ИмяМетода)   
            И (параметры.Length = 2)
            Тогда
            method = m;
            break;
        КонецЕсли
    КонецЦикла;
    
    return method;
    
КонецФункции

Функция Получить_SBAppend()
    
    
    Для Каждого m in Врап.ТипКакОбъект(StringBuilder).GetMethods() Цикл
        
        параметры = m.GetParameters();
        if ( (m.Name = "Append")   
            И (параметры.Length = 1) 
            И (Врап.ТипКакОбъект(параметры.GetValue(0).ParameterType).Equals(String)))   
            Тогда
            возврат  m
        КонецЕсли
    КонецЦикла;
    
    возврат Неопределено
КонецФункции

Процедура AngleSharpFormНажатие(Элемент)
    // Вставить содержимое обработчика.
    
    ПутьКСборке="d:\Vs2015Programs\TestScriptingAPI\TestScriptingAPI\bin\Debug\AngleSharp.dll";
    WebsiteUrl = "http://localhost:54361";
    // Получим используемые типы
        AngleSharp_ConfigurationExtensions = Врап.ПолучитьТип("AngleSharp.ConfigurationExtensions");

    BrowsingContext = Врап.ПолучитьТип("AngleSharp.BrowsingContext");
    BrowsingContextExtensions = Врап.ПолучитьТип("AngleSharp.BrowsingContextExtensions");
    ApiExtensions = Врап.ПолучитьТип("AngleSharp.Extensions.ApiExtensions");
    
    // Получим типы нужных интерфейсов
    IHtmlAnchorElement = Врап.ПолучитьТип("AngleSharp.Dom.Html.IHtmlAnchorElement");
    IHtmlFormElement = Врап.ПолучитьТип("AngleSharp.Dom.Html.IHtmlFormElement");
    IElement=Врап.ПолучитьТип("AngleSharp.Dom.IElement");
    
    // Получим типизированные функции    
    QuerySelector_AnchorElement = ПолучитьДжененрикМетодИнфо(ApiExtensions, "QuerySelector",IHtmlAnchorElement);
    QuerySelector_FormElement =   ПолучитьДжененрикМетодИнфо(ApiExtensions, "QuerySelector",IHtmlFormElement);
    
    ApiExtensions_Navigate=ПолучитьМетодИнфоОдинДженерикТип(ApiExtensions,"Navigate",IHtmlAnchorElement);
    ApiExtensions_Text= ПолучитьМетодИнфоОдинДженерикТип(ApiExtensions,"Text",IElement);
    
    configuration = Configuration.Default;
    
    configuration = AngleSharp_ConfigurationExtensions.WithDefaultLoader(configuration);
    configuration = AngleSharp_ConfigurationExtensions.WithCookies(configuration);
    
    context = BrowsingContext.New(configuration);
    
    // Загрузим начальную страницу
    BrowsingContextExtensions.OpenAsync(context, WebsiteUrl).Wait();
    doc = context.Active;
    
    // Получим ссылку содержащий адрес страницы для авторизации
    //<a class="log-in" href="/Home/LogIn">log in here</a>
    
    HtmlAnchorElement = Врап.MethodInfo_Invoke(QuerySelector_AnchorElement,Неопределено,doc, "a.log-in");
    //  var HtmlAnchorElement = AngleSharp.Extensions.ApiExtensions.QuerySelector<AngleSharp.Dom.Html.IHtmlAnchorElement>(doc, "a.log-in");
    // И перейдем на страницу авторизации
    //  doc = ApiExtensions.Navigate(HtmlAnchorElement).Result;
    
    doc = Врап.MethodInfo_Invoke(ApiExtensions_Navigate,Неопределено,HtmlAnchorElement).Result;
    
    
    //  doc = context.Active;
    
    // Получим форму
    //скрытый элемент для верификации который нужно отправить
    //<input name="__RequestVerificationToken" type="hidden" value="2Y-sFIY9JBZc6wc7antGFsBPG1GoiYCbVDtS0khv3JRkcG8CuN69pS3tAZrSiTevGkBjzpTF9AnuK8tZEUrjqn4qB_lbF4dVxsQBubYZkck1">
    HtmlFormElement = Врап.MethodInfo_Invoke(QuerySelector_FormElement,Неопределено,doc, "form");
    
    //   var HtmlFormElement = AngleSharp.Extensions.ApiExtensions.QuerySelector<AngleSharp.Dom.Html.IHtmlFormElement>(doc, "form");
    
    d = Врап.СоздатьОбъект(Dictionary);
    d.Add("User", "User");
    d.Add("Password", "secret");
    // Авторизуемся установив нужные поля и отправим Post запрос на сервер
    ApiExtensions.Submit(HtmlFormElement, d).Wait();
    
    
    doc = context.Active;
    
    // получим ссылку на искомую страницу
    //<a class="secret-link" href="/Home/Secret">our secret</a>
    HtmlAnchorElement = Врап.MethodInfo_Invoke(QuerySelector_AnchorElement,null, doc, "a.secret-link");
    // HtmlAnchorElement = AngleSharp.Extensions.ApiExtensions.QuerySelector<AngleSharp.Dom.Html.IHtmlAnchorElement>(doc, "a.secret-link");
    
    // Перейдем по ссылке
    // doc = ApiExtensions.Navigate(HtmlAnchorElement).Result;
    doc = Врап.MethodInfo_Invoke(ApiExtensions_Navigate,null,HtmlAnchorElement).Result;
    // В первом селекторе параграфе лежит искомая строка
    //<p>The answer to everything is <span id="secret">42</span>.</p>
    селектор=doc.QuerySelector("p");
    резулт = Врап.MethodInfo_Invoke(ApiExtensions_Text,null,селектор);
    //  резулт =The answer to everything is 42
    Сообщить(резулт);
КонецПроцедуры

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

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

РасширенияДляТестовый=ъ(СборкаТестовый.Тип("TestDllForCoreClr.РасширенияДляТестовый"));
    Врап.ДобавитьСиноним(РасширенияДляТестовый.ПолучитьСсылку(),"GetStringFromExtensionWithParams","ПолучитьСтрокуИзРасширенияСпарам");

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


То есть все в твоих руках. Хочешь по англицки то пиши по англицки, хочешь на русском пиши по русском.
На вкус и цвет товарищей нет.

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Date of birth
Registered
Activity