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\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\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("d:\Smile.jpg");
Организация простейшего Http-сервера напрямую из 1С. Следующий пример кода 1С прослушивает
порт 8080 и формирует html в ответ на запрос:
- ЗагрузитьВнешнююКомпоненту("C:\Program Files\Elisy .Net Bridge\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 = "Ответ от HttpListener";
- 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\Elisy.NetBridge.dll");
- ВК = Новый("AddIn.ElisyNetBridge");
- ВК.Активировать("76F93484A6ACDAF144",
- "00:1A:4D:5C:3E:BC",
- "DyAmVOPyNFTaddNK0jA9muTk2fz2V5+wrnZvZhF8Ws/pE52Loqt9u5QMNhrlVuoQJdENKCRgs8+RmWT
I4oVYwUdc8b+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
Синтаксис:
Параметры:
ИмяСборки (Строка) - полное имя сборки для поиска в 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:Предприятие.