8

Определение классов .Net и работа с ними в 1С:Предприятие

by Elisy 10. October 2009 09:37

Статья описывает, каким образом можно динамически определять, создавать и обращаться к созданным .Net-классам из 1С:Предприятие (7.7/8.0/8.1/8.2). Методика опирается на компонент Elisy .Net Bridge.

Введение

Ранее я описывал, каким образом можно создавать объекты .Net framework из 1С, используя мощные возможности компонента Elisy.NetBridge (см. http://www.richmedia.us/category/1cnet.aspx и обсуждение http://infostart.ru/public/20035/). Эта статья описывает порядок динамического определения типов из кода 1С и последующего обращения к объектам этих типов. Есть две основные причины, по которым потребовалась такая методика:

  • Чтобы во много раз расширить функциональность 1С, применяя, например, такие новые механизмы как объектно-ориентированное программирование, LINQ, использование lambda-функций;
  • Чтобы дать возможность устанавливать атрибуты классам и методам при наследовании, не прибегая к услугам Visual Studio.

Аналоги

Тема подключения функционала .Net framework к 1С не нова. До появления Elisy .Net Framework в основном решалась написанием внешних компонент 1С на C# или VB.Net. Самая близкая к теме данной статьи разработка: COM: Объект для компиляции модулей .NET в процессе выполнения "На лету" (http://www.forum.mista.ru/topic.php?id=322712). Недостатки внешних компонентов C# выражаются в том, что их практически невозможно отлаживать из 1С и поддерживать может только разработчик этого компонента.

Все описанные выше подходы уступают изложенному в статье тем, что ограничены при взаимодействии с родными объектами 1С. Хорошо, если передавать в .Net-класс нужно строку или число, проблемы начинаются уже при передаче обычного Enum.

Elisy .Net Bridge устраняет упомянутые проблемы, предоставляя прозрачный способ связи между 1С и .Net framework, при этом расширяя недостающую в 1С функциональность.

Описание примера

В самом начале необходима подготовительная операция – инициализация внешнего компонента Elisy.Net Bridge.

Когда в .Net framework речь заходит о компиляции исходного кода, на помощь приходят классы пространства имен System.CodeDom.Compiler. Класс CompilerParameters отвечает за параметры компиляции, а метод CreateProvider класса CodeDomProvider позволяет выбрать, какой язык необходимо компилировать. В нашем случае параметр метода будет строка CSharp.

Простейшая в нашем случае инициализация класса параметров состоит из перечисления сборок, на которые ссылается исходный код.

Исходный код определяется в переменной исходныйКод несколько непривычным для 1С способом – через НСтр метод. Это сделано, чтобы иметь возможность удобно редактировать код через пункт меню 1С Конструктор строк на разных языках.

Сама компиляция осуществляется методом CompileAssemblyFromSource.

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

Последние 2 строки отвечают за обращение к сгенерированному классу.

Исходный код примера:

AttachAddIn("AddIn.ElisyNetBridge");
AddIn = New("AddIn.ElisyNetBridge");
net = AddIn.New("Elisy.NetBridge", "Elisy.ElisyNetBridge");
провайдер = net.CallStatic("System.CodeDom.Compiler.CodeDomProvider", "CreateProvider", "CSharp");
Если провайдер = Неопределено Тогда
Сообщить("Не найден DOM-провайдер");
Возврат;
КонецЕсли;
//Перечисление сборок, на которые ссылается исходный код
параметрыКомпилятора = net.New("System.CodeDom.Compiler.CompilerParameters");
параметрыКомпилятора.ReferencedAssemblies.Add("System.Windows.Forms.dll");
исходныйКод = НСтр("ru = '
                    |using System.Windows.Forms; 
                    |namespace Пример
                    |{
                    |    public class Сообщение
                    |    {
                    |        public void Показать(string сообщение) 
                    |        {
                    |            MessageBox.Show(сообщение); 
                    |        }
                    |    }
                    |}
                    |
                    |'");
переченьИсходныхКодов = net.New("System.Collections.Generic.List`1[System.String]");
переченьИсходныхКодов.Add(исходныйКод);
результат = провайдер.CompileAssemblyFromSource(параметрыКомпилятора, переченьИсходныхКодов.ToArray());
Если результат.Errors.HasErrors Тогда
Сообщить("Ошибки компиляции:");
нумератор = результат.Errors.GetEnumerator();
Пока нумератор.MoveNext() Цикл
текущаяОшибка = нумератор.Current;
Сообщить(текущаяОшибка.ToString(), СтатусСообщения.Важное);
КонецЦикла
Иначе
net.LoadAssemblyFrom(результат.PathToAssembly);
КонецЕсли;
сообщение = net.New("Пример.Сообщение");
сообщение.Показать("Сообщение из динамически скомпилированного класса");

Выводы

Методика, изложенная в статье, определяет простой способ генерации .Net-сборок на лету. Фактически он сводится к вызову метода CompileAssemblyFromSource. Остальной код – это установка параметров и обработка результата.

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

Дальнейшим шагом может стать применение на практике в 1С реализации асинхронных веб-сервисов и Xml-сериализации.

Tags: ,

1C.Net | C#

Comments

Mityusha
Mityusha
10/15/2009 8:05:12 AM #

интересная статья

Birka
Birka
10/23/2009 3:47:50 PM #

хорошая статья)

Yulia
Yulia
10/26/2009 2:01:19 PM #

Спасибо за статью, пригодилась))

ILYA
ILYA
10/26/2009 8:26:13 PM #

good!

gun365
gun365
10/27/2009 1:23:19 AM #

Придется долго разбираться пока реально пойму в чём дело.

TommyGun
TommyGun
11/2/2009 12:40:46 PM #

Спасибо большое за советы.

Elisy
Elisy
11/3/2009 6:01:25 AM #

В продолжение темы добавлена статья: Многопоточность 1C и обратная связь из .Net Framework
www.richmedia.us/.../...nd-callback-functions.aspx

642-901 exam
642-901 exam
1/6/2010 11:31:32 AM #

:0 Придется долго разбираться пока реально пойму в чём дело.

Powered by BlogEngine.NET 1.6.0.0
Original Design by Laptop Geek, Adapted by onesoft

Wisata Semarang : News : Travelling : Used Stationary Bikes : Used Stationary Bikes : Used Stationary Bikes : Seo Services Company : Indonesia Furniture Handicraft Wholesale Marketplace : My Blogpost : My Blogpost : My Blogpost: Eiknujomorp : Google Ranking Master Gujarat : Wisata Dieng