В связи с планируемым выходом Elisy .Net Bridge 4 публикуем наиболее полное на данный момент руководство по использованию .Net Bridge для предыдущей (третьей) версии.
Elisy Software Design

Руководство по использованию внешнего компонента Elisy .Net Bridge
Elisy .Net Bridge- это внешний компонент для бесшовного подключения .Net framework к 1С:Предприятие с целью использования всех передовых разработок .Net framework. Упор в проекте сделан на гармоничную интеграцию двух технологий, где ведущую роль играет 1С:Предприятие. Поддерживается 1С:Предприятие 8.1 (ограниченная поддержка 7.7/8.0/8.2).
Системные требования
- Операционная система (Архитектура x86): Windows 7/Vista/XP/2008 R2/2008/2003
- Версия .Net-платформы: .Net framework 3.5 SP1
- Версия 1С: 1С:Предприятие 8.1 (ограниченная поддержка 1С:Предприятие 7.7/8.0/8.2)
Основные возможности
Библиотекой проекта является Elisy.NetBridge.dll. Она предоставляет следующие преимущества:
- Поддерживает создание объектов .Net из GAC и по полному пути к сборке;
- Поддерживает обращение к свойствам и методам объектов .Net;
- Не требует атрибута ComVisible=true, назначенного классам .Net;
- Поддерживает типы Enum и производные;
- Обеспечивает развернутую информацию об ошибках;
- Свойства объектов .Net видны при отладке из конфигуратора 1C;
- Не требует предварительной регистрации через REGSVR32 и REGASM: можно обращаться через функцию 1C ЗагрузитьВнешнююКомпоненту;
- Содержит логику для обращения к специфическим возможностям .Net framework: вызов статических методов, обращение к статическим свойствам, обращение к индексным свойствам;
Ниже сравнивается код C# и соответствующий ему код скрипта 1С с использованием Elisy .Net Bridge:
| Код C# | Код 1С:Предприятие |
private SeriesCollection getVolumeData() { SeriesCollection SC = new SeriesCollection(); Random myR = new Random(1); for(int i = 0; i < 1; i++) { Series s = new Series(); s.Name = "Volume"; double startPrice = 50; DateTime startDT = new DateTime(2000,1,1); for(int b = 0; b < 75; b++) { Element e = new Element(); e.XDateTime = startDT; startDT = startDT.AddDays(1); e.YValue = myR.Next(100); s.Elements.Add(e); } SC.Add(s); } return(SC); } |
Function getVolumeData() SC = net.New("dotnetCHARTING.WinForms.SeriesCollection"); myR = net.New("System.Random", 1); for a = 0 to 0 do s = net.New("dotnetCHARTING.WinForms.Series"); s.Name = "Volume"; startPrice = 50; startDT = net.New("System.DateTime", 2000, 1, 1); for b = 0 to 74 do e = net.New("dotnetCHARTING.WinForms.Element"); e.XDateTime = startDT; startDT = startDT + 1*60*60*24; e.YValue = myR.Next(100); s.Elements.Add(e); enddo; SC.Add(s); enddo; return SC; EndFunction |
Взаимодействие с 1С:Предприятие
Внешний компонент Elisy .Net Brdige написан в соответствие с "Технологией создания внешних компонент". Реализует интерфейсы: IInitDone, ILanguageExtender. Инициализация компонента из 1С происходит стандартным образом:
ПодключитьВнешнююКомпоненту("AddIn.ElisyNetBridge");
AddIn = Новый("AddIn.ElisyNetBridge");
или
ЗагрузитьВнешнююКомпоненту("C:\Program Files\Elisy .Net Bridge\Elisy.NetBridge.dll");
AddIn = Новый("AddIn.ElisyNetBridge");
ВК реализует свои методы New/Новый – создать объект .Net из GAC, NewFrom/НовыйИз – создать объект .Net из файла, Activate/Активировать – ввести информацию о лицензии. А также 1 свойство Активирован/IsActivated – выдающее информацию об активации. Например, можно создать .Net-объект следующим образом:
message = AddIn.New("System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", "System.Net.Mail.MailMessage");
New и NewFrom возвращают собственный IDispatch класс-обертку для передачи внутрь 1С объектов .Net framework, делая открытыми для программ 1С все свойства и методы объекта .Net. Все развернутые сообщения об ошибках выдаются через IErrorLog-интерфейс в 1С.
Для возможности вызова статических методов и обращения к статическим свойствам .Net framework в состав ВК входит класс Elisy.NetBridge, написанный на .Net framework. Обращение к нему возможно общим образом:
net = AddIn.New("Elisy.NetBridge", "Elisy.ElisyNetBridge");
Класс Elisy.NetBridge реализует методы CallStatic, GetStatic, SetStatic. Например, становится возможным следующий вызов:
image = net.CallStatic("System.Drawing.Image", "FromFile", "d:\SampleImage.jpg");
Примеры использования
Работа с регулярными выражениями, например, для получения из текста URL и E-mail'ов. Следующий пример проверяет корректность e-mail адресов:
//Подключение внешнего компонента
ЗагрузитьВнешнююКомпоненту("C:\Program Files\Elisy .Net Bridge SDK\Elisy.NetBridge.dll");
AddIn = Новый("AddIn.ElisyNetBridge");
net = AddIn.New("Elisy.NetBridge", "Elisy.ElisyNetBridge");
//Создать массив строк для проверки
address = Новый Массив();
address.Add("jay@southridgevideo.com");
address.Add("barry@adatum.com");
address.Add("treyresearch.net");
address.Add("karen@proseware.com");
//Создать шаблон регулярного выражения
emailregex = net.New("System.Text.RegularExpressions.Regex", "(?<user>[^@]+)@(?<host>.+)");
For i=0 To address.Count()-1 Do
//Проверить на соответствие шаблону
m = emailregex.Match(address[i]);
Сообщить(address[i]);
If m.Success Then
//В случае успеха
Сообщить(" User=" + m.Groups.get_Item("user").Value);
Сообщить(" Host=" + m.Groups.get_Item("host").Value);
Else
Сообщить(" (invalid email address)");
EndIf
EndDo;
Работа с графикой: рисование произвольных изображений из 1С, накладывание водяных знаков на фото номенклатуры, изменение формата и разрешения фото номенклатуры. Следующий пример рисует простой рисунок из 1С и сохраняет его на диск:
ЗагрузитьВнешнююКомпоненту("C:\Program Files\Elisy .Net Bridge SDK\Elisy.NetBridge.dll");
AddIn = Новый("AddIn.ElisyNetBridge");
net = AddIn.New("Elisy.NetBridge", "Elisy.ElisyNetBridge");
//Код показывает, как нарисовать простое изображение и записать его в файл
drawing = net.LoadAssembly("System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");
buffer = net.New("System.Drawing.Bitmap", 350, 350);
bufferSurface = net.CallStatic("System.Drawing.Graphics", "FromImage", buffer);
//Желтой кистью
yellowBrush = net.New("System.Drawing.SolidBrush", net.New("System.Drawing.Color").Yellow);
//Нарисовать круг
bufferSurface.FillEllipse(yellowBrush, 25, 25, 187, 187);
//Черной кистью
blackBrush = net.New("System.Drawing.SolidBrush", net.New("System.Drawing.Color").Black);
//Нарисовать эллипсы
bufferSurface.FillEllipse(blackBrush, 70, 75, 22, 17);
bufferSurface.FillEllipse(blackBrush, 140, 75, 22, 17);
//Черным карандашом
blackPen = net.New("System.Drawing.Pen", net.New("System.Drawing.Color").Black, 10);
//Нарисовать дугу
bufferSurface.DrawArc(blackPen, 65, 95, 102, 75, 0, 180);
//Записать в формате Jpg
buffer.Save("c:\Smile.jpg");
Организация простейшего Http-сервера напрямую из 1С. Следующий пример кода 1С прослушивает порт 8080 и формирует html в ответ на запрос:
ЗагрузитьВнешнююКомпоненту("C:\Program Files\Elisy .Net Bridge SDK\Elisy.NetBridge.dll");
AddIn = Новый("AddIn.ElisyNetBridge");
net = AddIn.New("Elisy.NetBridge", "Elisy.ElisyNetBridge");
Если НЕ net.GetStatic("System.Net.HttpListener","IsSupported") Тогда
Сообщить("Для использования класса HttpListener нужна ОС Windows XP SP2 или Server 2003.");
Возврат;
КонецЕсли;
listener = net.New("System.Net.HttpListener");
listener.Prefixes.Add("http://*:8080/");
listener.Start();
Сообщить("Прослушивание...");
//Метод GetContext блокирует выполнение программы пока ждет запрос.
context = listener.GetContext();
request = context.Request;
// Получить объект ответа
response = context.Response;
// Создать ответ - HTML-строку
responseString = "1C:Enterprise";
buffer = net.GetStatic("System.Text.Encoding", "UTF8").GetBytes(responseString);
// Получить поток ответа и записать ответ в него.
response.ContentLength64 = buffer.Length;
output = response.OutputStream;
output.Write(buffer,0,buffer.Length);
// Необходимо закрыть выходной поток.
output.Close();
listener.Stop();
Шифрование информации симметричными и ассиметричными методами и электронная подпись. Компонент позволяет из кода 1С выполнять шифрование строк и файлов следующим образом:
//Код для инициализации компонента Elisy .Net Bridge
ЗагрузитьВнешнююКомпоненту("C:\Program Files\Elisy .Net Bridge SDK\Elisy.NetBridge.dll");
ВК = Новый("AddIn.ElisyNetBridge");
ВК.Активировать("76F93484A6ACDAF144",
"00:1A:4D:5C:3E:BC",
"DyAmVOPyNFTaddNK0jA9muTk2fz2V5+wrnZvZhF8Ws/pE52Loqt9u5QMNhrlVuoQJdENKCRgs8+RmWTI4oVYwUdc8b+kyeuRUNWFaxXuoIPSSDWZAi675CgVpIl5uLbcyB7QKD+9cF6CXcBfD8QD9KqzOF/LC+O1oFmB3Roo8Pk=");
net = ВК.New("Elisy.NetBridge", "Elisy.ElisyNetBridge");
//Создание объекта, ослуживающего RSA-алгоритм
rsa = net.New("System.Security.Cryptography.RSACryptoServiceProvider");
//Получаем ключи. Генерируются автоматически при создании объекта RSACryptoServiceProvider и могут быть использованы многократно.
открытыйКлюч = rsa.ToXmlString(Ложь);
Сообщить("Открытый ключ: " + открытыйКлюч);
секретныйКлюч = rsa.ToXmlString(Истина);
Сообщить("Секретный ключ: " + секретныйКлюч);
//Преобразовать данные для шифрования в массив byte
исходнаяСтрока = "Какие-то данные для шифрования.";
Сообщить("Строка для шифрования: " + исходнаяСтрока);
данныеДляШифрования = net.GetStatic("System.Text.Encoding", "UTF8").GetBytes(исходнаяСтрока);
////////////////
// Шифрование //
////////////////
//Применить открытый ключ
rsa.FromXmlString(открытыйКлюч);
//Получить зашифрованный массив байт.
зашифрованоМассив = rsa.Encrypt(данныеДляШифрования, false);
зашифрованоСтрока = net.CallStatic("System.Convert", "ToBase64String", зашифрованоМассив);
Сообщить("Зашифрованные данные: " + зашифрованоСтрока);
/////////////////
// Расшифровка //
/////////////////
//Применить секретный ключ
rsa.FromXmlString(секретныйКлюч);
//Расшифровать
расшифрованныеДанные = rsa.Decrypt(зашифрованоМассив, false);
расшифрованнаяСтрока = net.GetStatic("System.Text.Encoding", "UTF8").GetString(расшифрованныеДанные);
Сообщить("Расшифрованная строка: " + расшифрованнаяСтрока);
/////////////////////////////////
// Вычисление цифровой подписи //
/////////////////////////////////
//Применить секретный ключ
rsa.FromXmlString(секретныйКлюч);
//Вычислить подпись
цифроваяПодпись = rsa.SignData(данныеДляШифрования, net.New("System.Security.Cryptography.SHA1CryptoServiceProvider"));
цифроваяПодписьСтрока = net.CallStatic("System.Convert", "ToBase64String", цифроваяПодпись);
Сообщить("Цифровая подпись: " + цифроваяПодписьСтрока);
///////////////////////////////
// Проверка цифровой подписи //
///////////////////////////////
//Применить секретный ключ
rsa.FromXmlString(открытыйКлюч);
//Проверить цифровую подпись
Если rsa.VerifyData(данныеДляШифрования, net.New("System.Security.Cryptography.SHA1CryptoServiceProvider"), цифроваяПодпись) Тогда
Сообщить("Цифровая подпись валидная");
Иначе
Сообщить("Цифровая подпись невалидная");
КонецЕсли
Описание свойств и методов Elisy .Net Bridge
Внешний компонент Elisy .Net Bridge
Внешний компонент Elisy .Net Bridge реализует следующие методы и свойства.
Подключить его к 1С:Предприятие вы можете следующим образом:
ПодключитьВнешнююКомпоненту("AddIn.ElisyNetBridge");
AddIn = Новый("AddIn.ElisyNetBridge");
или
ЗагрузитьВнешнююКомпоненту("C:\Program Files\Elisy .Net Bridge\Elisy.NetBridge.dll");
AddIn = Новый("AddIn.ElisyNetBridge");
- New/Новый
Синтаксис:
New(ИмяСборки, ИмяКласса)
Параметры:
ИмяСборки (Строка) - Полное имя .Net-сборки, по которому ее можно идентифицировать в GAC;
ИмяКласса (Строка) - Полное имя класса в сборке с учетом пространства имен;
Возвращает:
COM-объект - обертка над .Net-объектом, транслирующая все свойства и методы .Net-объекта
Описание:
Метод создает .Net-объект и обертку (COM-объект), позволяющую обращаться к исходному .Net-объекту. При вызове необходимо указать полное имя сборки. Исключение составляет только сборка Elisy.NetBridge, которую достаточно указать как "Elisy.NetBridge". Не позволяет передавать параметры в конструктор класса. Для вызова конструктора класса с параметрами необходимо использовать метод New класса Elisy.ElisyNetBridge.
Пример:
net = AddIn.New("Elisy.NetBridge", "Elisy.ElisyNetBridge");
- NewFrom/НовыйИз
Синтаксис:
NewFrom(ПутьКСборке, ИмяКласса)
Параметры:
ПутьКСборке (Строка) - Полный путь к файлу dll .Net-сборки;
ИмяКласса (Строка) - Полное имя класса в сборке с учетом пространства имен;
Возвращает:
COM-объект - обертка над .Net-объектом, транслирующая все свойства и методы .Net-объекта
Описание: метод создает .Net-объект и обертку (COM-объект), позволяющую обращаться к исходному .Net-объекту.
- Activate/Активировать
Синтаксис:
Activate(СерийныйНомер, MACАдрес, КлючАктивации)
Параметры:
СерийныйНомер (Строка) - серийный номер, который выдается продукту при продаже;
MACАдрес (Строка) - Уникальный MAC-адрес сетевой платы компьютера;
КлючАктивации (Строка) - подпись, подтвержающая правомерность использования компонента;
Возвращает:
Булево - значение, показывающее успешно ли прошла активация
Описание:
Позволяет активировать компонент по уникальнмому адресу MAC сетевой платы компьютера.
Пример:
AddIn.Активировать("XXXXXXXXXXXXXXXXXX",
"00:1A:4D:5C:3E:BC",
"DyAmVOPyNFTaddNK0jA9m");
- ActivateByCompany/АктивироватьПоОрганизации
Синтаксис:
ActivateByCompany(СерийныйНомер, НазваниеОрганизации, КлючАктивации)
Параметры:
СерийныйНомер (Строка) - серийный номер, который выдается продукту при продаже;
НазваниеОрганизации (Строка) - Название организации в справочнике "Организации";
КлючАктивации (Строка) - подпись, подтвержающая правомерность использования компонента;
Возвращает:
Булево - значение, показывающее успешно ли прошла активация
Описание:
Позволяет активировать компонент для всей организации.
Пример:
AddIn.ActivateByCompany("XXXXXXXXXXXXXXXXXX", "ООО ""Корпорация""",
"Zx5Ts0nYDuB9yXLtIjd");
- ActivateByVendor/АктивироватьПоПоставщику
Синтаксис:
ActivateByVendor(СерийныйНомер, НазваниеПоставщика, КлючАктивации)
Параметры:
СерийныйНомер (Строка) - серийный номер, который выдается продукту при продаже;
НазваниеПоставщика (Строка) - название поставщика, указанное в конфигурации;
КлючАктивации (Строка) - подпись, подтвержающая правомерность использования компонента;
Возвращает:
Булево - значение, показывающее успешно ли прошла активация
Описание:
Позволяет активировать компонент для всех конфигураций поставщика.
Пример:
AddIn.ActivateByVendor("XXXXXXXXXXXXXXXXXX", "Elisy Software Design",
"Zx5Ts0nYDuB9yXLtIjdinE");
- IsActivated/Активирован
Описание:
Свойство показывает, активирован ли компонент Elisy .Net Bridge. Возвращает Истина, если активирован.
Класс Elisy.ElisyNetBridge
Вспомогательный .Net-класс, позволяющий использовать специфические возможности .Net Framework, такие как: вызов статических методов, получение значений статических свойств и др.
Следующий код позволяет создать объект типа Elisy.ElisyNetBridge для последующего обращения к нему:
ПодключитьВнешнююКомпоненту("AddIn.ElisyNetBridge");
ВК = Новый("AddIn.ElisyNetBridge");
net = ВК.New("Elisy.NetBridge", "Elisy.ElisyNetBridge");
или
ЗагрузитьВнешнююКомпоненту("C:\Program Files\Elisy .Net Bridge\Elisy.NetBridge.dll");
ВК = Новый("AddIn.ElisyNetBridge");
net = ВК.New("Elisy.NetBridge", "Elisy.ElisyNetBridge");
- New
Синтаксис:
New(ИмяТипа, параметр1, параметр2, ..., параметрN)
Параметры:
ИмяТипа (строка) - полное имя типа;
параметр1, параметр2, ..., параметрN (произвольный тип) - параметры, которые передаются в конструктор;
Возвращает:
Объект типа ИмяТипа
Описание:
Метод создает .Net-объект, передавая в его конструктор произвольные параметры и возвращает COM-объект-обертку, которую можно дальше использовать в 1C:Предприятие. Сборка, к которой принадлежит тип должна быть предварительно загружена (например, вызовом LoadAssembly).
Пример:
hwnd = net.New("System.IntPtr", 131724);
color = net.New("System.Drawing.Color").Yellow;
specialFolder = net.New("System.Environment+SpecialFolder").DesktopDirectory;
client = net.New("System.Web.Services.Protocols.SoapHttpClientProtocol");
- GetStatic
Синтаксис:
GetStatic(ИмяТипа, ИмяСвойства)
Параметры:
ИмяТипа (Строка) - полное имя типа;
ИмяСвойства (Строка) - имя статического свойства;
Возвращает:
Произвольный тип - значение статического свойства.
Описание:
Метод позволяет обратиться к статическому свойству произвольного типа и вернуть его значение.
Пример:
zeroPtr = net.GetStatic("System.IntPtr", "Zero");
- SetStatic
Синтаксис:
SetStatic(ИмяТипа, ИмяСвойства, Значение)
Параметры:
ИмяТипа (Строка) - полное имя типа;
ИмяСвойства (Строка) - имя статического свойства;
Значение (Произвольный тип) - новое значение свойства;
Описание:
Метод позволяет установить значение статического свойства.
- CallStatic
Синтаксис:
CallStatic(ИмяТипа, ИмяМетода, параметр1, параметр2, ..., параметрN)
Параметры:
ИмяТипа (Строка) - полное имя типа;
ИмяМетода (Строка) - имя статического метода;
параметр1, параметр2, ..., параметрN (Произвольные типы) - параметры, передаваемые в метод;
Возвращает:
Произвольное значение - результат обращения к методу.
Описание:
Метод позволяет обратиться к статическому методу, передавая в него произвольные параметры.
Пример:
tempVar = net.CallStatic("System.Environment", "GetEnvironmentVariable", "TEMP");
- LoadAssembly
Синтаксис:
LoadAssembly(ИмяСборки)
Параметры:
ИмяСборки (Строка) - полное имя сборки для поиска в GAC.
Возвращает:
System.Reflection.Assembly - загруженная сборка
Описание:
Метод позволяет загрузить сборку из GAC для последующего использования его типов.
Пример:
net.LoadAssembly("System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
net.LoadAssembly("PresentationFramework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35");
net.LoadAssembly("PresentationCore, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35");
- LoadAssemblyFrom
Синтаксис:
LoadAssemblyFrom(ПутьКСборке)
Параметры:
ПутьКСборке (Строка) - полный путь к сборке;
Возвращает:
System.Reflection.Assembly - загруженная сборка
Описание:
Метод позволяет загрузить сборку из файла dll для последующего использования его типов.
- Version
Описание:
Свойство возвращает версию (System.Version) текущей сборки Elisy.NetBridge.
Класс Elisy.NetBridge.Environment
- Version
Описание:
Статическое свойство возвращает версию (System.Version) 1С:Предприятие.
- Connection
Описание:
Статическое свойство возвращает значение параметра pConnection, передаваемое в метод Init внешнего компонента. Пример:
connection = net.GetStatic("Elisy.NetBridge.Environment", "Connection");
- GetAppDispatch
Описание:
Статическое свойство возвращает COM-объект на глобальный контекст 1C:Предприятие.
Copyright © 2009-2010 Elisy Software Design