Определение классов .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 (1) -

Павел
Павел Russia
4/26/2012 12:41:45 PM #

1. У вас не работает закладка контакты.
2. не удается загрузить ни одну обработку на которую есть ссылки (ошибка 404)
3. отправить вам письмо так и не получилось.

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

С уважением,
Павел

Add comment

  Country flag

biuquote
  • Comment
  • Preview
Loading

Richmedia.us

Добро пожаловать на сайт Richmedia.us

1 2 3 4 5 6 7 8

RecentComments

Comment RSS