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

Публикация № 534901

Разработка - Практика программирования

.Net C# кроссплатформенный .Net Core

С выходом .Net Core CLR стало возможным использование классов .Net не только на Windows, но и других операционных системах. Это особенно важно в разрезе импортозамещения. И главное - это аналог COM под Linux. Сейчас под Linux для расширения возможностей 1С используются Web сервисы. Данная разработка позволит использовать не только сборки входящие в состав .Net Core, но и пользовательские портативные сборки.

Являясь автором Использование сборок .NET в 1С 7.x b 8.x. Создание внешних Компонент, я часто слышал в свой адрес, что это все туфта, ибо не кроссплатформенна.  Кроме того, под Windows полно готовых COM библиотек и несложно сделать свои COM библиотеки на разных языках. Для Linux ситуация сложнее. Там нет COM, а технология .Native API не слишком-то и дружелюбна.

Поэтому было решено, используя Native API, сделать ВК, которая будет взаимодействовать с .Net библиотекой для использования классов .Net в 1С. Следует учесть, что .Net Core CLR пока только на начальном пути, и многое недоступно, что есть в большом .Net, но даже того, что есть, достаточно для расширения возможностей 1С.

Одним из недостатком Native API является то, что мы не можем возвратить ВК и передать параметры ВК в метод ВК. Поэтому пришлось возвращать ссылку на объект в виде строки. И создавать методы для обертки ВК над строкой.

Не буду описывать внутренности ВК. Описание и исходники можно посмотреть 

Кроссплатформенное использование классов .Net из неуправляемого кода. Или аналог IDispatch на Linux

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

 

Там же можно скачать и исходники.  

Сначала определим вспомогательные методы для создания объектоа типов и обертки.

 

Перем   Врап,СсылкаНаДомен;

Функция Ъ(Ссылка)
	
	// Создаем объект по ссылке полученной из методов .Net классов
	//Физически это строка ёЁ<Ьъ>№_%)Э?&2 содержащее 12 символов для отделения их от других строк
	//и индекс в спике исполуемых объектов на стороне .Net

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

// Сокращенное использование метода ВК Новый
// Создает объект по строковому представлению типа или по ссылке на тип
Функция ъНовый(стр)
	возврат ъ(Врап.Новый(стр));
КонецФункции

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



Процедура ПриОткрытии() 
	
	// Установим отчет рядом с  AddInNetObjectToNative.dll
	// NetObjectToNative.dll
	// и библиотеками  Microsoft.NETCore.App\1.0.0\	
	// Так как нужны 32 разрядные так как клиент 1С 32 разрядный
	// Скачать можно здесь https://github.com/dotnet/cli
	// На сервере можно использовать 64 разрядную Core Clr
	
	Файл=Новый Файл(ЭтотОбъект.ИспользуемоеИмяФайла);  
	КаталогОтчета=Файл.Путь;	
	
	ИмяФайла=КаталогОтчета+"\AddInNetObjectToNative.dll";
	
	ПодключитьВнешнююКомпоненту(ИмяФайла, "NetObjectToNative",ТипВнешнейКомпоненты.Native); 
	Врап = Новый("AddIn.NetObjectToNative.LoaderCLR");
	CoreClrDir=КаталогОтчета+"\bin\";
	ДиректорияNetObjectToNative=КаталогОтчета;
	
	СсылкаНаДомен=Врап.СоздатьОбертку(CoreClrDir,ДиректорияNetObjectToNative,"");
	Врап.ЗагрузитьDLL(ИмяФайла);
	
	
КонецПроцедуры

 Я создал каталог, в который положил библиотеки

AddInNetObjectToNative.dll это сама ВК

NetObjectToNative.dll это .Net библиотека для получения классов .Net из .Net

TestDllForCoreClr.dll это тестовая сборка для загрузки её в пространство .Net и использования класса и его методов и свойств.

Кроме того, в папке Bin\ лежит сам .Net Core Clr, который можно скачать отсюда 

.NET Core Installers and Binaries

Ну вот он, долгожданный миг, когда можно наконец-то использовать классы .Net Core CLR.

Заодно проверим передаваемые типы.

СБ=ъ(Врап.Новый("System.Text.StringBuilder","Первая Строка"));
	CultureInfo=ъТип("System.Globalization.CultureInfo");
	
	CultureInfoES=ъ(Врап.Новый(CultureInfo.ПолучитьСсылку(),"es-ES"));
	
	
	Сообщить(СБ.Capacity);
	Сообщить(СБ.ПолучитьСсылку());
	
	InvariantCulture=ъ(CultureInfo.InvariantCulture);
	
	// К сожалению 1С вызывает метод имеющий возвращаемое значение как функцию даже если вызов идет как процедура
	//Нужно очистить ссылку в списке объектов
	ссылка=Сб.Append("Новая Строка"); Врап.ОчиститьСсылку(ссылка);
	ссылка=Сб.AppendLine();   Врап.ОчиститьСсылку(ссылка);
	ссылка=Сб.Append("Вторая Строка"); Врап.ОчиститьСсылку(ссылка);
	ссылка=Сб.AppendLine();     Врап.ОчиститьСсылку(ссылка);
	
	ссылка=Сб.AppendFormat("AppendFormat {0}, {1}, {2}, {3}, {4},", "Строка", 21, 45.89, ТекущаяДата(),истина );   Врап.ОчиститьСсылку(ссылка);
	ссылка=Сб.AppendLine(); Врап.ОчиститьСсылку(ссылка);
	
	// Так как в параметрах можно передавать только простые типы закодирум ссылку на объект в строку
	ссылка=Сб.AppendFormat(CultureInfoES.ПолучитьСсылку(),"AppendFormat {0}, {1}, {2}, {3}, {4},", "Строка", 21, 45.89, ТекущаяДата(),истина );  Врап.ОчиститьСсылку(ссылка);
	ссылка=Сб.AppendLine(); Врап.ОчиститьСсылку(ссылка);
	
	ссылка=Сб.AppendFormat(InvariantCulture.ПолучитьСсылку(),"AppendFormat {0}, {1}, {2}, {3}, {4},", "Строка", 21, 45.89, ТекущаяДата(),истина ); 
	
	Сообщить(СБ.ToString());
	Сообщить("Ёмкостъ ="+СБ.Capacity);
	// Увеличим емкость
	СБ.Capacity=СБ.Capacity+40;
	Сообщить("Новая Ёмкостъ ="+СБ.Capacity);
	
	// Очистка ссылок СБ и  СultureInfo осуществляется внутри ВК

Теперь перейдем к более сложным классам. А именно HTTPClient с возможностью сжатия трафика


 
// Вставить содержимое обработчика.
	//	System.Net.Http, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
	
	
	// Создадим HttpClient и вызовем Get запрос используя сжатие трафика 
	// На данный момент я не нашел как получить загруженные сборки или как загрузить сборку по имени файла
	// Поэтому загружаем по полному имени
	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;
	
	// В 1С нет бинарных операция. Для этого на стороне .Net есть функция
	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;
	Сообщить(СтрДлина(стр));

Ух ты, и это работает!

Еще одна особенность Native API в том, что мы можем получить двоичные данные, но вот передать их в параметры метода метода ВК нет.

Дальше идет проверка вызова сторонней библиотеки и работа с двоичными данными.


 
Тестовый=ъТип("TestDllForCoreClr.Тестовый, TestDllForCoreClr, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");
	Тест=ъ(Врап.Новый(Тестовый.ПолучитьСсылку()," Свойство из Конструктора"));
	Сообщить(Тестовый.Поле);
	Тестовый.Поле="Установка из 1С";
	Сообщить(Тестовый.Поле);
	
	Сообщить(Тест.СвойствоОбъекта);
	
	Тест.СвойствоОбъекта=("Установлено Свойство из 1С");
	Сообщить(Тест.СвойствоОбъекта);
	Сообщить(Тест.ПолучитьСтроку());
	
	
	Врап.ДвоичныеДанныеКакОбъект=истина;
	ДД=Тест.ПолучитьДвоичныеДанные();
	UnicodeEncoding= ъНовый("System.Text.UnicodeEncoding, System.Text.Encoding.Extensions, Version=4.0.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");
	//Если не установить Врап.ДвоичныеДанныеКакОбъект=истина;
	//То при вызове  UnicodeEncoding.GetString(ДД);
	// 1С выдает ошибку
	// Неверный аргумент
	
	СтрокаИзДД=UnicodeEncoding.GetString(ДД);
	Сообщить(СтрокаИзДД);

 

Самое главное, что мы можем использовать сторонние библиотеки, которые должны лежать рядом с NetObjectToNative.dll

К сожалению, в отличие от COM в .Native ВК мы не можем использовать энумераторы

 Для Каждого Элемент ИЗ Списка Цикл

 

Поэтому для упрощения использования массивов и списков создана функция ПолучитьЭнумератор


 
Функция ПолучитьЭнумератор(Объект)
	
	Перечислимый=ъ(Врап.ПолучитьИнтерфейс(Объект.ПолучитьСсылку(),"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.ПолучитьСсылку());
	Для сч=1 По 10 Цикл
		Список.Add(строка(сч));    
	КонецЦикла; 
	
	// Получим энумератор через соответствующие интерфейсы
	// Заодно проверим  метод ПолучитьИнтерфейс
	СписокЭнум=ПолучитьЭнумератор(Список);
	
	Пока СписокЭнум.MoveNext() Цикл
		//  Врап.ВСтроку вывоит строковое представление всех типов в том числе числовые, строки, неопределено
		Сообщить(СписокЭнум.Current);
		
	КонецЦикла; 
	
	// Получение Энумератора из ВК
	СписокЭнум2=ъ(Врап.ПолучитьЭнумератор(Список.ПолучитьСсылку()));
	
	Пока СписокЭнум2.MoveNext() Цикл
		//  Врап.ВСтроку вывоит строковое представление всех типов в том числе числовые, строки, неопределено
		Сообщить(СписокЭнум2.Current);
		
	КонецЦикла; 
	
КонецПроцедуры

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

Проведем аналогичный тест на 1С:


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

Процедура ТестСкорости2Нажатие(Элемент)
	// Вставить содержимое обработчика.
	КоличествоИтераций=200000;
	Тестовый=ъТип("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);
	
	
	НачВремя=ТекущаяДата();
	stopWatch.Restart();
	
	
	Для сч=1 по КоличествоИтераций Цикл
		ПолучитьЧисло(сч);
		
	КонецЦикла;
	
	stopWatch.Stop();
	
	ВремяВыполнения=ТекущаяДата()-НачВремя;
	Сообщить("ПолучитьЧисло ="+ВремяВыполнения);
	ВывестиВремя(stopWatch);
	
КонецПроцедуры

 

00:00:09.63  Для .Net
00:00:01.23  Для 1С

 

00:00:09.93 Для .Net
00:00:01.20 Для 1С

То есть скорость вызова уменьшилась до  20 000 вызовов в секунду.
Но и этого достаточно, так обычно вызываются более тяжелые методы.


Добавил поддержку IDynamicMetaObjectProvider (DynamicObject,ExpandoObject).  В исходниках есть примеры. Это важно при использовании различного рода парсеров


Теперь стоит поговорить о недостатках 1С реализации Технологии Внешних Компонент.

1. Абсолютно не нужны методы FindMethod, FindProp, IsPropReadable, IsPropWritable, GetNParams, HasRetVal, GetParamDefValue

Так как у методов

bool CallAsProc

bool CallAsFunc

bool SetPropVal и bool GetPropVal есть возвращаемое значение об успешном выполнении

Информация об ошибке возвращается через AddError.

Да и вызов по индексу это анахронизм от IDiapatch, где было описание диспинтерфейсов для увеличения скорости вызова.

2. При возвращении методами SetPropVal и GetPropVal исключение не вызывается

3. Зачем-то происходит установка свойств там, где в коде этого не требуется.

4. Вызывается метод как функция там, где метод вызывается как процедура.

5. Один из основных - это нельзя вернуть и передать экземпляр ВК из методов ВК.

Я лично не вижу никаких проблем. Определить значение для такого типа и установить ссылку в поле pInterfaceVal.

Подсчет ссылок происходит на стороне 1С. Передавать можно в том числе и объекты 1С только на время вызова метода.

В дальнейшем можно развить до использования событий объектов .Net в 1С по примеру .NET(C#) для 1С. Динамическая компиляция класса обертки для использования .Net событий в 1С через ДобавитьОбработчик или ОбработкаВнешнегоСобытия

Использовать асинхронные вызовы по примеру ".Net в 1С. Асинхронные HTTP запросы, отправка Post нескольких файлов multipart/form-data, сжатие трафика с использованием gzip, deflate, удобный парсинг сайтов и т.д."

Вообще интеграция .Net есть в Microsoft Dynamics AX ClrObject.

Используя кроссплатформенный Core Clr, можно интегрировать в 1С. Особенно это актуально для Linux как импортозамещения.

Пока проверил, работает на Windows 7,10. Linux и IOS пока нет, но в скором проверю на виртуальной машине. .Net Core CLR можно скачать здесь

С чем я бы с удовольствием помог 1С. Есть огромный опыт использования классов .Net в 1С.

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. kiv1c 620 06.07.16 14:25 Сейчас в теме
Скажите, а таки чем вы руководствуетесь когда называете функции "Ъ", "Ъновый" и "Ътип" ???
SShipilov; baracuda; ётун; +3 Ответить
2. Serginio 846 06.07.16 14:52 Сейчас в теме
Чтобы было сокращенно и было созвучно с Новый , а Ътип из той же оперы.
Мне лично, так код удобнее читать.
L0z4; albert.goncharov; +2 Ответить
3. pbazeliuk 1798 06.07.16 20:22 Сейчас в теме
Плюс за старания. Но по опыту скажу, если совмещать высокую нагрузку с внешними компонентами, до добра это не доводит.
5. Serginio 846 06.07.16 21:35 Сейчас в теме
(3) pbazeliuk,
Проблема тут не в самой компоненте, а интерфейсе, что 1С предоставляет.

Например практически все программисты 1С используют ComОбъект.

По моей методе можно использовать
NetОбъект,NetТип
JavaОбъект,JavaТип

И эти объявления будут реально кроссплатформенны.
При это различия с ComОбъект минимальны. Имя класса равноценно комовскому ProgID. При этом нет ограничений на используемые типы.
Ты можешь написать свою библиотеку поместить в определенное место и использовать её вместо COM. Без регистрации итд. Расширять возможности 1С станет легче.

Например сейчас в конфигураторе куча функций, которые есть в стандартных библиотеках. При этом функционал 1С функций сильно недотягивает до стандартных библиотек.
Учитывая кроссплатформенность можно использовать нетовские или явовские библиотеки везде где можно. Упрощая программирование.
А что касается работы с HTTP,SMPT, JSON то эти библиотеки были задолго до того как 1С их реализовывала, при этом с ошибками и функционалом сильно недотягивающих до .Net или Java.
Стоит ли тратить время на то, что можно взять из стандартных библиотек. А ведь можно легко расширить за счет своих сборок.

При этом например нетовская библиотека весит всего 65 мегабайт, которую можно включить в дистрибутив и главное это кроссплатформенное решение. Причем нет ничего сложного передавать в параметрах и объекты 1С которые поддерживают аналогичный интерфейс. Можно пойти по пути подсчета ссылок в 1С, а доступ к объектам 1С только на время вызова метода ВК.

Например Использование сборок .NET в 1С 7.x b 8.x. Создание внешних Компонент многие бы использовали на равне с ComОбъект, но главная причина её неприменения в том, что она неинтегрирована в 1С.

Даже если 1С не хочет интегрировать .Net в 1С, то можно сделать вариант ВК под .Net и Java . Прежде всего для получения объектов ВК и передачи их в параметрах. Кроме того можно добавить доступ по индексу [], получения итератора.
duhin; SShipilov; +2 Ответить
6. Serginio 846 06.07.16 21:37 Сейчас в теме
(3) pbazeliuk,

Кстати сейчас нашел способ вызвать методы и свойсва для Динамиков https://rsdn.ru/forum/dotnet/6493695.1
и вставлю в компоненту
4. soba 06.07.16 21:22 Сейчас в теме
Направление интересное. Пожалуй только фраза про "импортозамещение" не к месту прикреплена. Вроде Линус Торвальдс российского паспорта не получал пока. Ну и из 1с- "Энумератор" и "Врап" звучат так себе.
ётун; +1 Ответить
7. Serginio 846 06.07.16 21:40 Сейчас в теме
(4) soba,
Согласен, но меня на это сподвигло собеседование при поиске работы. Так как моя разработка
Использование сборок .NET в 1С 7.x b 8.x. Создание внешних Компонент
была мало интересна, так как не кроссплатформенна, а в разрезе "импортозамещения" сейчас требуется кроссплатформенное решение.
Сделал, но какого не то, что ажиотажа а даже простой заинтересованности не видно.
17. PolSerg 08.07.16 09:28 Сейчас в теме
(7) Причем здесь импортозамещение, Linux интересен прежде всего тем, что не кишит всякой заразой как винда, поэтому и тренд во многих компаниях, включая ту в которой работаю я, как бонус свободный софт, как правило, бесплатен.
18. Serginio 846 08.07.16 10:08 Сейчас в теме
(17) Если ты прочитал 7 то это не мой термин. Но, что скажешь по поводу расширения функционала 1С на Linux за счет использования классов .Net?
8. Serginio 846 06.07.16 21:53 Сейчас в теме
(4) soba, По поводу врап и Энумератор.
Лучше было бы по аналогии с ComОбъек писать NetОбъект.
Но так много писанины. На сче Энумератора, то не нашел лучшего перевода (перечислитель перечислимый)
Было бы проще если бы по аналогии с COM была поддержка Для Каждого
13. ётун 07.07.16 08:07 Сейчас в теме
(8) самое пикантное, что функция "ПолучитьЭнумератор" при этом возвращает переменную "Перечислитель". Первый звоночек - если человек не может понятно что-то назвать, то это сигнал о том, что в предметной области проблемы. Ну или несерьезное отношение.

Общее впечатление, что решается какая-то очень локальная задача, черезчур много "я", "мне", "лично". Сам придумал, сам обиделся, что 1С не такая. Направление интересное, но не больше, типа "а смотрите как я могу".
15. Serginio 846 07.07.16 10:37 Сейчас в теме
(13) ётун, >> Общее впечатление, что решается какая-то очень локальная задача

Ну если использование огромного количества стандартных библиотек .Net и расширения за счет написания своих библиотек и практически замена COM это локальная задача, то что называется глобальной?
9. Vovan58 51 06.07.16 23:01 Сейчас в теме
Идея +. А Java c CORBA - не рулят?
10. Serginio 846 06.07.16 23:17 Сейчас в теме
CORBA это Out Process, я предлагаю упрощенный In Process взаимодействие.
Сейчас линуксоиды используют HTTP или Web сервисы, это и есть аналог CORBA .
Java тоже можно прикрутить по аналогичной методе, если Java поддерживает экспорт методов в Native.
11. premierex 07.07.16 06:29 Сейчас в теме
(0) 5. Один из основных - это нельзя вернуть и передать экземпляр ВК из методов ВК.
Я тоже писал много внешних компонент, но вот этого реально не понял. Куда надо передавать экземпляр ВК из методов ВК?
ётун; +1 Ответить
12. Serginio 846 07.07.16 06:58 Сейчас в теме
Ты статью читал?
У ВК есть методы
УстановитьСсылку Создается ВК по строковому представлению, применяется как ъ(
ПолучитьСсылку Получается Ссылка для передачи в параметрах.

14. Serginio 846 07.07.16 09:50 Сейчас в теме
Там на самом деле два захода. Сначала получаем Энумератор, а из энумератора получаем перечислитель. Это просто проблемы перевода.
IEnumerator и IEnumerable
Смотрите не как я могу, а используй то, что я сделал. И делюсь своим опытом, на что было потрачено куча времени в том числе и на изучение предметной области.

Кроме того я просто говорю о недостатках реализации .Native ВК, которые легко исправить.
Или вообще можно интегрировать в 1С. Хуже от этого точно не будет. Но будет замена ComОбъект
16. Serginio 846 07.07.16 16:00 Сейчас в теме
Добавил поддержку объектов с поддержкой IDynamicMetaObjectProvider

Для теста создал ExpandoObject
  public object ПолучитьExpandoObject()
        {

            dynamic res = new ExpandoObject();
            res.Имя = "Тест ExpandoObject";
            res.Число = 456;
            res.ВСтроку = (Func<string>)(() => res.Имя);
            res.Сумма = (Func<int, int, int>)((x, y) => x + y);

            return res;
        }

Показать



И наследника DynamicObject

class TestDynamicObject : DynamicObject
    {

        public override bool TrySetMember(SetMemberBinder binder, object value)
        {

            return true;
        }
        // получение свойства
        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            result = binder.Name;
            return true;
        }
        // вызов метода
        public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
        {
            var res = new StringBuilder("{0}(");
            var param = new object[args.Length + 1];
            param[0] = binder.Name;
            if (args.Length > 0)
            {
                Array.Copy(args, 0, param, 1, args.Length);
                for (int i = 0; i < args.Length; i++)
                {
                    res.AppendFormat("{{{0}}},", i + 1);

                }

                res.Remove(res.Length - 1, 1);

            }
            res.Append(")");

            result = String.Format(res.ToString(), param);
            return true;


        }
    }


Показать


Теперь можно вызвать на 1С

Тестовый=ъТип("TestDllForCoreClr.Тестовый, TestDllForCoreClr, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");
	Тест=ъ(Врап.Новый(Тестовый.ПолучитьСсылку()," Свойство из Конструктора"));
	
	// Это аналог структуры, но с поддержкой методов
	РасширяемыйОбъект=ъ(Тест.ПолучитьExpandoObject());
	
	Сообщить("ВСтроку="+РасширяемыйОбъект.ВСтроку());
	Сообщить("Сумма=" + РасширяемыйОбъект.Сумма(1, 2));
	
	Сообщить(РасширяемыйОбъект.Имя);
	Сообщить(РасширяемыйОбъект.Число);
	
	РасширяемыйОбъект.Имя="Новое Имя";
	РасширяемыйОбъект.Число=768;
	// Добавим новое свойство
	РасширяемыйОбъект.НовоеСвойство="Новое Свойство";
	
	Сообщить(РасширяемыйОбъект.Имя);
	Сообщить(РасширяемыйОбъект.Число);
	Сообщить(РасширяемыйОбъект.НовоеСвойство);
	
	НовыйРеквизит=ъ(Врап.Новый("System.Dynamic.ExpandoObject, System.Dynamic.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"));
	
	НовыйРеквизит.Имя="Новый Реквизит";
	НовыйРеквизит.Значение=123;
	
	
	РасширяемыйОбъект.НовыйРквизит=НовыйРеквизит.ПолучитьСсылку();
	Сообщить(ъ(РасширяемыйОбъект.НовыйРквизит).Имя);
	
	
	TestDynamicObject=ъТип("TestDllForCoreClr.TestDynamicObject, TestDllForCoreClr, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");
	
	ДинамикОбъект=ъНовый(TestDynamicObject.ПолучитьСсылку());
	ДинамикОбъект.УстановимЛюбоеСвойство="Чего то там";
	Сообщить( ДинамикОбъект.ПолучитТоЧтоПередали);
	Сообщить(ДинамикОбъект.ПолучитТоЧтоПередалиСПараметрами(1,3.45,ТекущаяДата()));

Показать




Это удобно при работе с различными парсерами
19. Serginio 846 13.07.16 15:41 Сейчас в теме
Добави вывод типов для дженерик методов
Теперь можно не выводить отдельно метод

// public T ДженерикМетод<V, T>(V param1, T param2, V param3)
Сообщить(Тест.ДженерикМетод(1,"Привет",3));
//

//public V ДженерикМетод2<K, V>(Dictionary<K, V> param1, K param2, V param3)
Словарь= ъНовый("System.Collections.Generic.Dictionary`2[System.Int32,System.String]");
Сообщить(Тест.ДженерикМетод2(Словарь.ПолучитьСсылку(),3,"Привет2"));

// public K ДженерикМетод3<K>(IList<K> param1, int param2, K param3)
List=ъНовый("System.Collections.Generic.List`1[System.String]");
Сообщить(Тест.ДженерикМетод3(List.ПолучитьСсылку(),3,"Привет3"));

Показать
20. Serginio 846 19.07.16 14:59 Сейчас в теме
Сделал поддержку внешнего события
В классе создадим пле типа Action<string, string, string>
 public class Тестовый 
    { 
      public Action<string, string, string>   ВнешнееСобытие1С;

// И сделаем эмуляцию события.



public async void TestВнешнегоСобытия() 
        { 
            for(int i=0;i<100; i++)
            {
                var значение = i.ToString();
                Task.Run(async() =>
                {
                   await Task.Delay(1000).ConfigureAwait(false);
                   this?.ВнешнееСобытие1С("Тестовый", "ТестовоеСообщение", значение);
                });

                await Task.Delay(50).ConfigureAwait(false);
            }


        } 

Показать



В 1С.

Процедура ВнешнееСобытие(Источник, Событие, Данные)
    // Вставить содержимое обработчика.

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

Процедура ТестВнешнегоСобытияНажатие(Элемент)
    // Вставить содержимое обработчика.

    Тестовый=ъТип("TestDllForCoreClr.Тестовый, TestDllForCoreClr, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");

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

Делегат=Ъ(Врап.ПолучитьДелегатВнешнегоСобытия1C());
Тест.ВнешнееСобытие1С=Делегат.ПолучитьСсылку();
Тест.TestВнешнегоСобытия();
КонецПроцедуры

Показать



И не забыть в Переменных модуля установить
Перем   Тест;
21. Serginio 846 21.07.16 14:46 Сейчас в теме
В VS 2015 апдейт 3 появилась возможность создавать библиотеки и приложения под .Net Core
Вкладка
Шаблоны->Windows->.Net Core

Такой проект отличается от портативного.
В тестах добавил пример создания JObject и сериализации его в Json

Про установку SDK и прочее можно посмотреть здесь
http://metanit.com/sharp/aspnet5/1.2.php
22. Serginio 846 27.07.16 15:18 Сейчас в теме
Добавил поддержку параметров по умолчанию
Тест вызова метода с параметрами по умолчанию
	//public static int OptionalParam(int x, int y, int z = 5, int s = 4,string str="Привет")
	//       {
	//           return x + y + z + s;
	//       }


	Сообщить("OptionalParam(int x, int y)="+Тестовый.OptionalParam(1,2));
	Сообщить("OptionalParam(int x, int y, int z = 5)="+Тестовый.OptionalParam(1,2,3));
	Сообщить("OptionalParam(int x, int y, int z = 5, int s,string str)="+Тестовый.OptionalParam(1,2,3,4,"ХаХа"));
Показать
23. par_62 22.01.19 07:47 Сейчас в теме
Все хорошо,красиво. Но мы прагматики и зададим вопрос. И он сакраментальный. Зачем?
Если 1С для Native API избрало С++ зачем использовать Net библиотеки? Есть море библиотек на С++ спокойно и хорошо работающих в ВК. Точно так же как нет смысла в СОМ на NET.
Преимуществ нет никаких,одни проблемы.
Автор проделал большую работу,теоретически интересную и прочитал я с удовольствием. Но использовать просто не для чего. Возможно,только мне лично. Без обид,просто делюсь мнением
24. Serginio 846 22.01.19 14:35 Сейчас в теме
Так ВК то тоже нужно программировать и для каждого случая своя. Да и С++ это не особо то удобный инструмент. А здесь есть одна ВК и ну и нужно знать только классы и методы. По сути то и C# знать не нужно. Только 1С.

Если бы 1С удосужились дать возможность возвращать объект типа ВК то можно было бы избавиться от Ъ, но у них своя политика.
Конечно в таком виде это использовать нельзя. А вот Использование классов .Net в 1С для новичков многие используют. Ну и как я понял линукс используют единицы
25. victor_goodwill 7 17.01.20 12:19 Сейчас в теме
Очень интересная тема с точки зрения кроссплатформенности. Можете подсказать (при беглом просмотре не увидел), где есть указание того, как правильно запустить подключение Net под Linux из 1С? Есть ли какая-то инструкция или ссылка на документацию, где почитать что установить и как настроить, как создать класс? Мы хотели бы сделать замену Новый COMОбъект("ADODB.Connection") для доступа к базе MS Sql с сервера Linux
26. victor_goodwill 7 17.01.20 12:24 Сейчас в теме
Видел в примерах в другой статье такие конструкции:
27. victor_goodwill 7 17.01.20 12:24 Сейчас в теме
connection = new Net.System.Data.SqlClient.SqlConnection(ConnectionString);
command = new Net.System.Data.SqlClient.SqlCommand(ТекстЗапроса,connection);
28. Serginio 846 17.01.20 12:34 Сейчас в теме
Давно это писалось еще под .Net Core 1
В этой статье есть ссылки
https://habr.com/ru/post/304482/

Но многие уже не работают.

https://docs.microsoft.com/ru-ru/dotnet/core/tutorials/netcore-hosting

Вот этот недавно изменяли
https://github.com/dotnet/coreclr/blob/master/src/dlls/mscoree/unixinterfac­e.cpp

https://github.com/dotnet/coreclr/issues/22271
29. victor_goodwill 7 17.01.20 16:13 Сейчас в теме
Спасибо, будем разбираться!
31. victor_goodwill 7 20.01.20 13:07 Сейчас в теме
(28) Подскажите, у вас был опыт тестирования вашей компоненты именно под Linux?
30. Serginio 846 17.01.20 16:56 Сейчас в теме
Вот здесь примеры подключния к Ado
https://infostart.ru/public/544232/

СборкаSqlClient=ъ(Врап.Сборка("System.Data.SqlClient.dll"));
    SqlConnection=ъ(СборкаSqlClient.GetType("System.Data.SqlClient.SqlConnection"));
    SqlCommand=ъ(СборкаSqlClient.GetType("System.Data.SqlClient.SqlCommand")); 
    
    connection =ъ(Врап.Новый(SqlConnection.ПолучитьСсылку(),ConnectionString));
    connection.Open();
    
    ТекстЗапроса = "Sel ect Номенклатура.DESCR Наименование  Fr om sc84 Номенклатура where DESCR Like '%'+@Строка+'%'
    |order by Номенклатура.DESCR";
    
    
    command = ъ(Врап.Новый(SqlCommand.ПолучитьСсылку(),ТекстЗапроса,connection.ПолучитьСсылку()));
    
    Parameters=ъ(command.Parameters);
    Parameters.AddWithValue("@Строка", "ДСП");
    dr = ъ(command.ExecuteReader());
    
    Пока dr.Read() Цикл
        Сообщить(dr.get_Item("Наименование"));
    КонецЦикла;
Показать
32. victor_goodwill 7 21.01.20 15:55 Сейчас в теме
Попытались скомпилировать компоненту под Linux и столкнулись с вызовами чистого Win API - LoadLibrary. Получается, что кросс-платформенность не поддерживается?
33. Serginio 846 24.01.20 12:42 Сейчас в теме
Ну когда я делал не было нужды в линуксе.
Нужно добавить условную компиляцию и
используя данную статью https://docs.microsoft.com/ru-ru/dotnet/core/tutorials/netcore-hosting
использовать dlopen (в Linux или macOS).

Шаг 1. Поиск и загрузка CoreCLR

Интерфейсы API среды выполнения .NET Core находятся в coreclr.dll (в Windows), в libcoreclr.so (на платформе Linux) или в libcoreclr.dylib (в macOS). Первым шагом для размещения .NET Core является загрузка библиотеки CoreCLR. Некоторые основные приложения проверяют разные пути или используют входные параметры для поиска библиотеки, пока другие могут загрузить ее по заранее определенному пути (рядом с основным приложением, например, или из известного расположения на компьютере).
После обнаружения библиотека загружается с помощью LoadLibraryEx (в Windows) или dlopen (в Linux или macOS).
Оставьте свое сообщение

См. также

Звуковое управление в 1С 8.3 Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

В данной статье описано создание библиотеки для звукового управления (выполнение команд голосом) для платформы 1С 8.3. Задача была поставлена так, чтобы модуль функционировал непосредственно на клиенте 1С, осуществляя управление формами, и взаимодействовал с интерфейсом.

16.03.2021    2697    velemir    29    

Полезные примеры СКД, ч.2

Практика программирования v8 v8::СКД Бесплатно (free)

Еще несколько примеров решения задач в СКД.

06.04.2021    2936    Neti    7    

Обзор полезных методов БСП 3.1.4

Практика программирования БСП (Библиотека стандартных подсистем) v8 1cv8.cf Бесплатно (free)

Библиотека стандартных подсистем (далее - БСП) является частью любой типовой конфигурации, поэтому умение применять готовые процедуры и функции повышает качество разработки и избавляет от написания лишнего кода. К сожалению, не у всех есть время и упорство овладеть всей документацией, поэтому я собрал воедино наиболее популярный функционал.

25.03.2021    11360    rayastar    45    

Базовые вещи БСП, которые облегчат жизнь программисту 1С

Практика программирования БСП (Библиотека стандартных подсистем) v8 1cv8.cf Россия Бесплатно (free)

В данной публикации я опишу полезные процедуры и функции модуля общего назначения библиотеки стандартных подсистем, обязательные к использованию любым программистом 1С.

30.08.2020    12515    quazare    34    

Serverless (Faas) в 1С. Создание и вызов Yandex Cloud Functions Промо

Универсальные функции Практика программирования v8 Бесплатно (free)

"Я не могу просто взять и скопировать код с гитхаба", "у нас 1С микросервисами окружена", "возможностей мало" - частые фразы 1С разработчиков. которым не хватает возможностей платформы в современном мире. Faas, конечно, история не новая, но нас сдерживало 152ФЗ и задержки по пингам. Для того, чтобы действительно использовать в 1С код, к примеру, на Python, надо было приложить усилия. Теперь всё намного проще - берём и используем.

28.12.2020    5130    comol    31    

Работа с журналом регистрации. Выходим за границы платформы

Журнал регистрации Бесплатно (free)

Работа с журналом регистрации нестандартными средствами. А также немного про использование платформы .NET в экосистеме 1С.

12.05.2020    8552    YPermitin    28    

Форма выбора (подбор) в управляемых формах

Практика программирования v8 v8::УФ 1cv8.cf Россия Бесплатно (free)

Разбор небольших примеров того, как правильно открывать форму выбора (подбора) в управляемых формах, не прибегая к модальным окнам.

08.05.2020    41941    user5300    17    

Программная работа с настройками СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Нюансы программной работы с настройками системы компоновки данных в отчетах и динамических списках. Обзор всех видов настроек компоновки. Что в каких случаях правильно применять. В качестве примера рассмотрена работа с отборами и группировками.

27.01.2020    43250    ids79    26    

Использование программных перечислений, ч.1: строковые константы Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Часто ли у вас возникает необходимость в коде выполнять сравнение на строку?

10.12.2016    38864    unichkin    74    

[СКД] Программное создание схемы компоновки данных

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Сделаем отчет на СКД полностью программно, без использования макета "схема компоновки данных".

15.01.2020    32557    John_d    22    

Последовательности событий при проведении документа 1С. Шпаргалка + про формы + про расширения

Практика программирования v8 Россия Бесплатно (free)

Собрал информацию о событиях/подписках/расширениях в одном месте.

30.12.2019    25045    kuzyara    38    

30 задач. Странных и не очень

Практика программирования v8 Бесплатно (free)

30 задач на знание языка программирования 1С и некоторого поведения платформы. Маленьких. Странных и не очень.

02.12.2019    19618    YPermitin    60    

Вспомогательные инструкции в коде 1С Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Помогаем редактору кода 1С помогать нам писать и анализировать код.

15.10.2018    32626    tormozit    105    

Как передать IP адрес, который вызвал HTTP запрос в 1C (для веб-сервера Apache)

Практика программирования v8 Бесплатно (free)

Столкнулся с задачей получения IP адреса, который вызывает http сервис 1С. Итак, решение:

22.11.2019    10226    Sibars    19    

Полезные процедуры и функции для программиста

Практика программирования Универсальные функции v8 1cv8.cf Россия Бесплатно (free)

Все мы пишем программный код и часто используем процедуры, облегчающие его написание. Ниже приведена выборка таких полезных процедур и функций.

07.10.2019    34263    HostHost    41    

Таблица значений. Нюансы

Практика программирования v8 Бесплатно (free)

Обзор некоторых аспектов использования общеизвестного инструмента 1С.

01.10.2019    42629    Yashazz    50    

Оформление и рефакторинг сложных логических выражений Промо

Практика программирования v8 Россия Бесплатно (free)

В сложных логических выражениях нередко самому автору спустя какое-то время тяжело разобраться, не говоря уже о других программистах. Предлагаемая методика позволяет повысить наглядность таких выражений путем оформления в виде И-ИЛИ дерева и одновременно выполнять их рефакторинг.

20.09.2012    79734    tormozit    131    

О программе Postman для тестирования API и для чего она нужна 1С-нику

Практика программирования Программное обеспечение (software) v8 Бесплатно (free)

Для чего нужна программа Postman для тестирования API и какая от него польза для 1С-программиста.

24.09.2019    15456    budidich    28    

[Шпаргалка] Программное создание элементов формы

Практика программирования Работа с интерфейсом v8 1cv8.cf Бесплатно (free)

Программное создание практически всех популярных элементов формы.

06.09.2019    72749    rpgshnik    70    

Агрегатные функции СКД, о которых мало кто знает

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Пользуетесь ли Вы всеми возможными агрегатными функциями, которые предоставляет система компоновки данных? Если Вы используете только: СУММА, КОЛИЧЕСТВО, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, то эта статья для Вас.

05.09.2019    61187    ids79    55    

Запись значения в поле ввода/формы со срабатыванием события ПриИзменении Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Иногда возникает необходимость после записи значения в какое либо поле ввода/формы вызвать для него обработчик события ПриИзменении, а о вызове самого события приходится только мечтать. В этой статье приводится программный способ вызова этого события.

11.07.2007    50638    tormozit    48    

Регистры бухгалтерии. Общая информация

Практика программирования Математика и алгоритмы v8 v8::БУ БУ Бесплатно (free)

Общая информация о внутреннем устройстве регистров бухгалтерии.

05.09.2019    34830    YPermitin    25    

Три костыля. Сказ про фокусы в коде

Практика программирования v8 Бесплатно (free)

Три интересных (или странных) костыля в коде, которые могут помочь в повседневных и не очень задачах.

03.09.2019    27567    YPermitin    81    

Отслеживание выполнения фонового задания

Практика программирования Универсальные функции Разработка v8 1cv8.cf Бесплатно (free)

Запуск фонового задания из модуля внешней обработки. Отслеживание выполнения задания в виде прогресса, расположенного на форме.

17.08.2019    37867    ids79    16    

Как сделать из &НаКлиентеНаСервереБезКонтекста почти &НаКлиентеНаСервере Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Как сделать метод формы, доступный на клиенте и на сервере одновременно, и сохранить при этом удобство разработки

10.09.2017    47496    tormozit    74    

Функции СКД: ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Подробное описание и использование внутренних функций системы компоновки данных: Вычислить, ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив, ВычислитьВыражениеСГруппировкойТаблицаЗначений.

08.08.2019    114674    ids79    69    

Фоновое выполнение кода в 1С - это просто

Практика программирования v8 1cv8.cf Бесплатно (free)

Как легко запускать выполнение в фоне, не прибегая к долгому описанию фоновых процедур.

02.08.2019    46806    avalakh    26    

Разбираемся с параметрами редактирования СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Связь по типу, Параметры выбора, Связи параметров выбора

31.07.2019    31348    json    15    

Выгрузка документа по условию Промо

Практика программирования Разработка v8 Бесплатно (free)

Что делать, если документы нужно выгружать не все подряд, а по какому-то фильтру: статусу, дате, набору условий... А что если он соответствовал этим условиям, а потом перестал? А если потом опять начал? Такие ситуации заставили попотеть не одного программиста.

25.04.2019    16615    m-rv    2    

СКД - наборы данных и связи между ними, создание собственной иерархии, вложенные отчеты

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Набор данных объект. Использование в схеме компоновки нескольких наборов данных. Различные варианты связи наборов: объединение, соединение. Использование иерархии в отчетах на СКД. Создание собственной иерархии, иерархия детальных записей. Использование вложенных схем в отчетах на СКД.

26.07.2019    81360    ids79    14    

СКД - использование расширений языка запросов, секция ХАРАКТЕРИСТИКИ

Инструментарий разработчика Практика программирования v8 v8::СКД Бесплатно (free)

Автоматическое и не автоматическое заполнение полей компоновки данных. Использование расширений языка запросов для СКД «{…}», секция ВЫБРАТЬ, секция ГДЕ, параметры виртуальных таблиц. Автоматизированное использование дополнительных данных в запросе: секция ХАРАКТЕРИСТИКИ.

17.07.2019    41327    ids79    27    

Регистры сведений. За кулисами

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Небольшие заметки по внутреннему устройству регистров сведений.

09.07.2019    29269    YPermitin    14    

Как прикрутить ГУИД к регистру сведений Промо

Практика программирования Перенос данных из 1C8 в 1C8 Разработка v8 Бесплатно (free)

... и немного теории обмена данными. В частности, разберем боль всех, кто пишет небанальные обмены данными: как набору записей регистра сведений назначить гуид и далее использовать его в обмене для идентификации этого набора.

16.04.2019    21217    m-rv    17    

"Меньше копипаста!", или как Вася универсальную процедуру писал

Практика программирования Разработка v8 v8::СКД 1cv8.cf Бесплатно (free)

Программист Вася разбирает подход создания универсальных методов на примере программного вывода СКД.

04.07.2019    20639    SeiOkami    50    

Работа с настройками системы компоновки данных

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Варианты отчетов, работа с настройками вариантов: структура группировок, поля отчета, отборы, сортировка, условное оформление, другие настройки, настройки отображения диаграмм.

02.07.2019    63635    ids79    17    

Создание отчетов с помощью СКД - основные понятия и элементы

Практика программирования Математика и алгоритмы v8 v8::СКД Бесплатно (free)

Основные принципы работы СКД. Понятия схемы компоновки и макета компоновки. Описание основных элементов схемы компоновки: наборы данных, поля, вычисляемые поля, ресурсы, параметры.

25.06.2019    62915    ids79    26    

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

Практика программирования v8 v8::Запросы 1cv8.cf Бесплатно (free)

В статье приведены особенности внутренней архитектуры и примеры работы с расширением языка запросов 1С.

01.06.2018    32969    m-rv    22    

Многопоточное ускорение однопользовательских нагрузок в 1С + Microsoft SQL Server 2017

Практика программирования Производительность и оптимизация (HighLoad) v8 v8::Запросы Бесплатно (free)

Взаимодействие с Microsoft SQL Server нередко вызывает трудности у 1С-ников, а потому интересны любые моменты, связанные с его использованием. О своем опыте работы с новым SQL Server 2017 участникам конференции Infostart-2018 рассказал директор ООО «Аналитика софт» Дмитрий Дудин.

11.06.2019    27751    dmurk    146    

Регистры накопления. Виртуальные таблицы. Часть №2: "Остатки" и "Остатки и обороты"

Практика программирования v8 1cv8.cf Бесплатно (free)

Описание работы платформы 1С:Предприятие 8.2 с виртуальными таблицами регистров накопления "Остатки" и "Остатки и обороты". Анализ SQL-запрос при работе с виртуальными таблицами

22.05.2019    34059    YPermitin    7    

Регистры накопления. Структура хранения в базе данных

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Структура хранения регистров накопления в базе данных для платформы 1С:Предприятие 8.x. Первая часть в серии публикаций.

16.05.2019    51813    YPermitin    30    

Метод формирования движений в типовых регистрах нетиповыми регистраторами Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Вариант решения задач с проведением по типовым регистрам нетиповыми регистраторами. Зачем - чтобы при сравнении конфигурации не обращать внимание на свойства регистров и исключить вероятность допущения горькой оплошности при обновлении информационных баз, заменив типы регистраторов основной конфигурации типами конфигурации поставщика. Для программных продуктов, имеющих в своем составе метаданных документ "Корректировка регистров"("Корректировка записей регистров").

05.12.2017    29012    itriot11    34    

О расширениях замолвите слово...

Практика программирования Разработка v8 Бесплатно (free)

О чём стоит задуматься при принятии решения о создании расширения конфигурации…

07.04.2019    38767    ellavs    127    

Git-репозитории для 1С-кода (опыт использования при небольших проектах)

Практика программирования v8 Бесплатно (free)

Инструкции по взаимодействию с Git-репозиторием, которые писались для тех наших программистов, которые вообще никогда не работали с Git (руководства в духе "Как получить код из git-репозитория?", "Как отправить код в git-репозиторий")...

28.03.2019    29021    ellavs    90    

Трюки с внешними источниками данных

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Некоторые трюки для преодоления ограничений внешних источников данных.

14.03.2019    35605    YPermitin    53    

Использование классов .Net в 1С для новичков Промо

Практика программирования Разработка внешних компонент Универсальные функции v7.7 v8 Бесплатно (free)

Руководство для новичков. Написав статью http://infostart.ru/public/238584/, я понял, что многие не понимают того, что написано. Поэтому в этой статье постараюсь более подробно остановиться на азах и без кода на вражеском языке (C#)

27.01.2016    79076    Serginio    113    

Ошибки при работе с хранилищем конфигурации и способы их решения

Практика программирования v8 Бесплатно (free)

В статье собраны наиболее распространенные ошибки при работе с хранилищем конфигурации и способы их обхода и решения.

01.03.2019    51753    Смешной 1С    31    

Разработка и сценарное тестирование с Vanessa-ADD. Отчетность Allure. Автоматизация запуска сценариев

Практика программирования Vanessa Automation v8 Россия Бесплатно (free)

Формируем отчетность о результатах выполнения сценариев. Автоматизируем запуск.

26.02.2019    24928    Vladimir Litvinenko    28    

Автоматические и управляемые блокировки применительно к типовым конфигурациям 1С Промо

Математика и алгоритмы Практика программирования v8 v8::blocking 1cv8.cf Бесплатно (free)

Основные принципы работы с режимами автоматических и управляемых блокировок в 1С Предприятие 8. Теория и применение в типовых конфигурациях: БП, УТ, ЕРП

10.11.2018    38604    ids79    40