.Net Framework Elisy .Net Bridge 1CENTERPRISE.COM
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С:Предприятие
  1. private SeriesCollection getVolumeData()
  2. {
  3.     SeriesCollection SC = new SeriesCollection();
  4.     Random myR = new Random(1);
  5.     for(int i = 0; i < 1; i++)
  6.     {
  7.         Series s = new Series();
  8.         s.Name = "Volume";
  9.         double startPrice = 50;
  10.         DateTime startDT = new DateTime(2000,1,1);
  11.         for(int b = 0; b < 75; b++)
  12.         {
  13.             Element e = new Element();
  14.             e.XDateTime = startDT;
  15.             startDT = startDT.AddDays(1);
  16.             e.YValue = myR.Next(100);
  17.             s.Elements.Add(e);
  18.         }
  19.         SC.Add(s);
  20.     }
  21.     return(SC);
  22. }
  1. Function getVolumeData()
  2.     SC = net.New("dotnetCHARTING.WinForms.SeriesCollection");
  3.     myR = net.New("System.Random", 1);
  4.     for a = 0 to 0 do
  5.         s = net.New("dotnetCHARTING.WinForms.Series");
  6.         s.Name = "Volume";
  7.         startPrice = 50;
  8.         startDT = net.New("System.DateTime", 2000, 1, 1);
  9.         for b = 0 to 74 do
  10.             e = net.New("dotnetCHARTING.WinForms.Element");
  11.             e.XDateTime = startDT;
  12.             startDT = startDT + 1*60*60*24;
  13.             e.YValue = myR.Next(100);
  14.             s.Elements.Add(e);
  15.         enddo;
  16.         SC.Add(s);
  17.     enddo;
  18.     return SC;
  19. EndFunction

Взаимодействие с 1С:Предприятие

Внешний компонент Elisy .Net Brdige написан в соответствие с "Технологией создания внешних компонент". Реализует интерфейсы: IInitDone, ILanguageExtender. Инициализация компонента из 1С происходит стандартным образом:

  1. ПодключитьВнешнююКомпоненту("AddIn.ElisyNetBridge");
  2. AddIn = Новый("AddIn.ElisyNetBridge");

или

  1. ЗагрузитьВнешнююКомпоненту("C:\Program Files\Elisy .Net Bridge\Elisy.NetBridge.dll");
  2. AddIn = Новый("AddIn.ElisyNetBridge");

ВК реализует свои методы New/Новый – создать объект .Net из GAC, NewFrom/НовыйИз – создать объект .Net из файла, Activate/Активировать – ввести информацию о лицензии. А также 1 свойство Активирован/IsActivated – выдающее информацию об активации. Например, можно создать .Net-объект следующим образом:

  1. 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. Обращение к нему возможно общим образом:

  1. net = AddIn.New("Elisy.NetBridge", "Elisy.ElisyNetBridge");

Класс Elisy.NetBridge реализует методы CallStatic, GetStatic, SetStatic. Например, становится возможным следующий вызов:

  1. image = net.CallStatic("System.Drawing.Image", "FromFile", "d:\SampleImage.jpg");

Примеры использования

Работа с регулярными выражениями, например, для получения из текста URL и E-mail'ов. Следующий пример проверяет корректность e-mail адресов:

  1. //Подключение внешнего компонента
  2. ЗагрузитьВнешнююКомпоненту("C:\Program Files\Elisy .Net Bridge\Elisy.NetBridge.dll");
  3. AddIn = Новый("AddIn.ElisyNetBridge");
  4. net = AddIn.New("Elisy.NetBridge", "Elisy.ElisyNetBridge");
  5. //Создать массив строк для проверки
  6. address = Новый Массив();
  7. address.Add("jay@southridgevideo.com");
  8. address.Add("barry@adatum.com");
  9. address.Add("treyresearch.net");
  10. address.Add("karen@proseware.com");
  11. //Создать шаблон регулярного выражения
  12. emailregex = net.New("System.Text.RegularExpressions.Regex", "(?<user>[^@]+)@(?<host>.+)");
  13. For i=0 To address.Count()-1 Do
  14.     //Проверить на соответствие шаблону
  15.     m = emailregex.Match(address[i]);
  16.     Сообщить(address[i]);
  17.     If m.Success Then
  18.         //В случае успеха
  19.         Сообщить(" User=" + m.Groups.get_Item("user").Value);
  20.         Сообщить(" Host=" + m.Groups.get_Item("host").Value);
  21.     Else
  22.         Сообщить(" (invalid email address)");
  23.     EndIf
  24. EndDo;

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

  1. ЗагрузитьВнешнююКомпоненту("C:\Program Files\Elisy .Net Bridge\Elisy.NetBridge.dll");
  2. AddIn = Новый("AddIn.ElisyNetBridge");
  3. net = AddIn.New("Elisy.NetBridge", "Elisy.ElisyNetBridge");
  4. //Код показывает, как нарисовать простое изображение и записать его в файл
  5. drawing = net.LoadAssembly("System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");
  6. buffer = net.New("System.Drawing.Bitmap", 350, 350);
  7. bufferSurface = net.CallStatic("System.Drawing.Graphics", "FromImage", buffer);
  8. //Желтой кистью
  9. yellowBrush = net.New("System.Drawing.SolidBrush", net.New("System.Drawing.Color").Yellow);
  10. //Нарисовать круг
  11. bufferSurface.FillEllipse(yellowBrush, 25, 25, 187, 187);
  12. //Черной кистью
  13. blackBrush = net.New("System.Drawing.SolidBrush", net.New("System.Drawing.Color").Black);
  14. //Нарисовать эллипсы
  15. bufferSurface.FillEllipse(blackBrush, 70, 75, 22, 17);
  16. bufferSurface.FillEllipse(blackBrush, 140, 75, 22, 17);
  17. //Черным карандашом
  18. blackPen = net.New("System.Drawing.Pen", net.New("System.Drawing.Color").Black, 10);
  19. //Нарисовать дугу
  20. bufferSurface.DrawArc(blackPen, 65, 95, 102, 75, 0, 180);
  21. //Записать в формате Jpg
  22. buffer.Save("d:\Smile.jpg");

Организация простейшего Http-сервера напрямую из 1С. Следующий пример кода 1С прослушивает порт 8080 и формирует html в ответ на запрос:

  1. ЗагрузитьВнешнююКомпоненту("C:\Program Files\Elisy .Net Bridge\Elisy.NetBridge.dll");
  2. AddIn = Новый("AddIn.ElisyNetBridge");
  3. net = AddIn.New("Elisy.NetBridge", "Elisy.ElisyNetBridge");
  4. Если НЕ net.GetStatic("System.Net.HttpListener","IsSupported") Тогда
  5.     Сообщить("Для использования класса HttpListener нужна ОС Windows XP SP2 или Server 2003.");
  6.     Возврат;
  7. КонецЕсли;
  8. listener = net.New("System.Net.HttpListener");
  9. listener.Prefixes.Add("http://*:8080/");
  10. listener.Start();
  11. Сообщить("Прослушивание...");
  12. //Метод GetContext блокирует выполнение программы пока ждет запрос.
  13. context = listener.GetContext();
  14. request = context.Request;
  15. // Получить объект ответа
  16. response = context.Response;
  17. // Создать ответ - HTML-строку
  18. responseString = "Ответ от HttpListener";
  19. buffer = net.GetStatic("System.Text.Encoding", "UTF8").GetBytes(responseString);
  20. // Получить поток ответа и записать ответ в него.
  21. response.ContentLength64 = buffer.Length;
  22. output = response.OutputStream;
  23. output.Write(buffer,0,buffer.Length);
  24. // Необходимо закрыть выходной поток.
  25. output.Close();
  26. listener.Stop();

Шифрование информации симметричными и ассиметричными методами и электронная подпись. Компонент позволяет из кода 1С выполнять шифрование строк и файлов следующим образом:

  1. //Код для инициализации компонента Elisy .Net Bridge
  2. ЗагрузитьВнешнююКомпоненту("C:\Program Files\Elisy .Net Bridge\Elisy.NetBridge.dll");
  3. ВК = Новый("AddIn.ElisyNetBridge");
  4. ВК.Активировать("76F93484A6ACDAF144",
  5. "00:1A:4D:5C:3E:BC",
  6. "DyAmVOPyNFTaddNK0jA9muTk2fz2V5+wrnZvZhF8Ws/pE52Loqt9u5QMNhrlVuoQJdENKCRgs8+RmWT I4oVYwUdc8b+kyeuRUNWFaxXuoIPSSDWZAi675CgVpIl5uLbcyB7QKD+9cF6CXcBfD8QD9KqzOF/LC+O1oFmB3Roo8Pk=");
  7. net = ВК.New("Elisy.NetBridge", "Elisy.ElisyNetBridge");
  8. //Создание объекта, ослуживающего RSA-алгоритм
  9. rsa = net.New("System.Security.Cryptography.RSACryptoServiceProvider");
  10. //Получаем ключи. Генерируются автоматически при создании объекта RSACryptoServiceProvider и могут быть использованы многократно.
  11. открытыйКлюч = rsa.ToXmlString(Ложь);
  12. Сообщить("Открытый ключ: " + открытыйКлюч);
  13. секретныйКлюч = rsa.ToXmlString(Истина);
  14. Сообщить("Секретный ключ: " + секретныйКлюч);
  15. //Преобразовать данные для шифрования в массив byte
  16. исходнаяСтрока = "Какие-то данные для шифрования.";
  17. Сообщить("Строка для шифрования: " + исходнаяСтрока);
  18. данныеДляШифрования = net.GetStatic("System.Text.Encoding", "UTF8").GetBytes(исходнаяСтрока);
  19. ////////////////
  20. // Шифрование //
  21. ////////////////
  22. //Применить открытый ключ
  23. rsa.FromXmlString(открытыйКлюч);
  24. //Получить зашифрованный массив байт.
  25. зашифрованоМассив = rsa.Encrypt(данныеДляШифрования, false);
  26. зашифрованоСтрока = net.CallStatic("System.Convert", "ToBase64String", зашифрованоМассив);
  27. Сообщить("Зашифрованные данные: " + зашифрованоСтрока);
  28. /////////////////
  29. // Расшифровка //
  30. /////////////////
  31. //Применить секретный ключ
  32. rsa.FromXmlString(секретныйКлюч);
  33. //Расшифровать
  34. расшифрованныеДанные = rsa.Decrypt(зашифрованоМассив, false);
  35. расшифрованнаяСтрока = net.GetStatic("System.Text.Encoding", "UTF8").GetString(расшифрованныеДанные);
  36. Сообщить("Расшифрованная строка: " + расшифрованнаяСтрока);
  37. /////////////////////////////////
  38. // Вычисление цифровой подписи //
  39. /////////////////////////////////
  40. //Применить секретный ключ
  41. rsa.FromXmlString(секретныйКлюч);
  42. //Вычислить подпись
  43. цифроваяПодпись = rsa.SignData(данныеДляШифрования, net.New("System.Security.Cryptography.SHA1CryptoServiceProvider"));
  44. цифроваяПодписьСтрока = net.CallStatic("System.Convert", "ToBase64String", цифроваяПодпись);
  45. Сообщить("Цифровая подпись: " + цифроваяПодписьСтрока);
  46. ///////////////////////////////
  47. // Проверка цифровой подписи //
  48. ///////////////////////////////
  49. //Применить секретный ключ
  50. rsa.FromXmlString(открытыйКлюч);
  51. //Проверить цифровую подпись
  52. Если rsa.VerifyData(данныеДляШифрования, net.New("System.Security.Cryptography.SHA1CryptoServiceProvider"), цифроваяПодпись) Тогда
  53.     Сообщить("Цифровая подпись валидная");
  54. Иначе
  55.     Сообщить("Цифровая подпись невалидная");
  56. КонецЕсли

Описание свойств и методов Elisy .Net Bridge

Внешний компонент Elisy .Net Bridge

Внешний компонент Elisy .Net Bridge реализует следующие методы и свойства.

Подключить его к 1С:Предприятие вы можете следующим образом:

  1. ПодключитьВнешнююКомпоненту("AddIn.ElisyNetBridge");
  2. AddIn = Новый("AddIn.ElisyNetBridge");

или

  1. ЗагрузитьВнешнююКомпоненту("C:\Program Files\Elisy .Net Bridge\Elisy.NetBridge.dll");
  2. AddIn = Новый("AddIn.ElisyNetBridge");
  • New/Новый
    Синтаксис:
    1. New(ИмяСборки, ИмяКласса)

    Параметры:
    ИмяСборки (Строка) - Полное имя .Net-сборки, по которому ее можно идентифицировать в GAC;
    ИмяКласса (Строка) - Полное имя класса в сборке с учетом пространства имен;
    Возвращает:
    COM-объект - обертка над .Net-объектом, транслирующая все свойства и методы .Net-объекта
    Описание:
    Метод создает .Net-объект и обертку (COM-объект), позволяющую обращаться к исходному .Net-объекту. При вызове необходимо указать полное имя сборки. Исключение составляет только сборка Elisy.NetBridge, которую достаточно указать как "Elisy.NetBridge". Не позволяет передавать параметры в конструктор класса. Для вызова конструктора класса с параметрами необходимо использовать метод New класса Elisy.ElisyNetBridge.
    Пример:
    1. net = AddIn.New("Elisy.NetBridge", "Elisy.ElisyNetBridge");
  • NewFrom/НовыйИз
    Синтаксис:
    1. NewFrom(ПутьКСборке, ИмяКласса)

    Параметры:
    ПутьКСборке (Строка) - Полный путь к файлу dll .Net-сборки;
    ИмяКласса (Строка) - Полное имя класса в сборке с учетом пространства имен;
    Возвращает:
    COM-объект - обертка над .Net-объектом, транслирующая все свойства и методы .Net-объекта
    Описание: метод создает .Net-объект и обертку (COM-объект), позволяющую обращаться к исходному .Net-объекту.
  • Activate/Активировать
    Синтаксис:
    1. Activate(СерийныйНомер, MACАдрес, КлючАктивации)

    Параметры:
    СерийныйНомер (Строка) - серийный номер, который выдается продукту при продаже;
    MACАдрес (Строка) - Уникальный MAC-адрес сетевой платы компьютера;
    КлючАктивации (Строка) - подпись, подтвержающая правомерность использования компонента;
    Возвращает:
    Булево - значение, показывающее успешно ли прошла активация
    Описание:
    Позволяет активировать компонент по уникальнмому адресу MAC сетевой платы компьютера.
    Пример:
    1. AddIn.Активировать("XXXXXXXXXXXXXXXXXX",
    2. "00:1A:4D:5C:3E:BC",
    3. "DyAmVOPyNFTaddNK0jA9m");
  • ActivateByCompany/АктивироватьПоОрганизации
    Синтаксис:
    1. ActivateByCompany(СерийныйНомер, НазваниеОрганизации, КлючАктивации)

    Параметры:
    СерийныйНомер (Строка) - серийный номер, который выдается продукту при продаже;
    НазваниеОрганизации (Строка) - Название организации в справочнике "Организации";
    КлючАктивации (Строка) - подпись, подтвержающая правомерность использования компонента;
    Возвращает:
    Булево - значение, показывающее успешно ли прошла активация
    Описание:
    Позволяет активировать компонент для всей организации.
    Пример:
    1. AddIn.ActivateByCompany("XXXXXXXXXXXXXXXXXX", "ООО ""Корпорация""",
    2. "Zx5Ts0nYDuB9yXLtIjd");
  • ActivateByVendor/АктивироватьПоПоставщику
    Синтаксис:
    1. ActivateByVendor(СерийныйНомер, НазваниеПоставщика, КлючАктивации)

    Параметры:
    СерийныйНомер (Строка) - серийный номер, который выдается продукту при продаже;
    НазваниеПоставщика (Строка) - название поставщика, указанное в конфигурации;
    КлючАктивации (Строка) - подпись, подтвержающая правомерность использования компонента;
    Возвращает:
    Булево - значение, показывающее успешно ли прошла активация
    Описание:
    Позволяет активировать компонент для всех конфигураций поставщика.
    Пример:
    1. AddIn.ActivateByVendor("XXXXXXXXXXXXXXXXXX", "Elisy Software Design",
    2. "Zx5Ts0nYDuB9yXLtIjdinE");
  • IsActivated/Активирован
    Описание:
    Свойство показывает, активирован ли компонент Elisy .Net Bridge. Возвращает Истина, если активирован.

Класс Elisy.ElisyNetBridge

Вспомогательный .Net-класс, позволяющий использовать специфические возможности .Net Framework, такие как: вызов статических методов, получение значений статических свойств и др.

Следующий код позволяет создать объект типа Elisy.ElisyNetBridge для последующего обращения к нему:

  1. ПодключитьВнешнююКомпоненту("AddIn.ElisyNetBridge");
  2. ВК = Новый("AddIn.ElisyNetBridge");
  3. net = ВК.New("Elisy.NetBridge", "Elisy.ElisyNetBridge");

или

  1. ЗагрузитьВнешнююКомпоненту("C:\Program Files\Elisy .Net Bridge\Elisy.NetBridge.dll");
  2. ВК = Новый("AddIn.ElisyNetBridge");
  3. net = ВК.New("Elisy.NetBridge", "Elisy.ElisyNetBridge");

  • New
    Синтаксис:
    1. New(ИмяТипа, параметр1, параметр2, ..., параметрN)

    Параметры:
    ИмяТипа (строка) - полное имя типа;
    параметр1, параметр2, ..., параметрN (произвольный тип) - параметры, которые передаются в конструктор;
    Возвращает:
    Объект типа ИмяТипа
    Описание:
    Метод создает .Net-объект, передавая в его конструктор произвольные параметры и возвращает COM-объект-обертку, которую можно дальше использовать в 1C:Предприятие. Сборка, к которой принадлежит тип должна быть предварительно загружена (например, вызовом LoadAssembly).
    Пример:
    1. hwnd = net.New("System.IntPtr", 131724);
    2. color = net.New("System.Drawing.Color").Yellow;
    3. specialFolder = net.New("System.Environment+SpecialFolder").DesktopDirectory;
    4. client = net.New("System.Web.Services.Protocols.SoapHttpClientProtocol");
  • GetStatic
    Синтаксис:
    1. GetStatic(ИмяТипа, ИмяСвойства)

    Параметры:
    ИмяТипа (Строка) - полное имя типа;
    ИмяСвойства (Строка) - имя статического свойства;
    Возвращает:
    Произвольный тип - значение статического свойства.
    Описание:
    Метод позволяет обратиться к статическому свойству произвольного типа и вернуть его значение.
    Пример:
    1. zeroPtr = net.GetStatic("System.IntPtr", "Zero");
  • SetStatic
    Синтаксис:
    1. SetStatic(ИмяТипа, ИмяСвойства, Значение)

    Параметры:
    ИмяТипа (Строка) - полное имя типа;
    ИмяСвойства (Строка) - имя статического свойства;
    Значение (Произвольный тип) - новое значение свойства;
    Описание:
    Метод позволяет установить значение статического свойства.
  • CallStatic
    Синтаксис:
    1. CallStatic(ИмяТипа, ИмяМетода, параметр1, параметр2, ..., параметрN)

    Параметры:
    ИмяТипа (Строка) - полное имя типа;
    ИмяМетода (Строка) - имя статического метода;
    параметр1, параметр2, ..., параметрN (Произвольные типы) - параметры, передаваемые в метод;
    Возвращает:
    Произвольное значение - результат обращения к методу.
    Описание:
    Метод позволяет обратиться к статическому методу, передавая в него произвольные параметры.
    Пример:
    1. tempVar = net.CallStatic("System.Environment", "GetEnvironmentVariable", "TEMP");

  • LoadAssembly
    Синтаксис:
    1. LoadAssembly(ИмяСборки)

    Параметры:
    ИмяСборки (Строка) - полное имя сборки для поиска в GAC.
    Возвращает:
    System.Reflection.Assembly - загруженная сборка
    Описание:
    Метод позволяет загрузить сборку из GAC для последующего использования его типов.
    Пример:
    1. net.LoadAssembly("System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
    2. net.LoadAssembly("PresentationFramework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35");
    3. net.LoadAssembly("PresentationCore, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35");
  • LoadAssemblyFrom
    Синтаксис:
    1. LoadAssemblyFrom(ПутьКСборке)

    Параметры:
    ПутьКСборке (Строка) - полный путь к сборке;
    Возвращает:
    System.Reflection.Assembly - загруженная сборка
    Описание:
    Метод позволяет загрузить сборку из файла dll для последующего использования его типов.
  • Version
    Описание:
    Свойство возвращает версию (System.Version) текущей сборки Elisy.NetBridge.

Класс Elisy.NetBridge.Environment

  • Version
    Описание:
    Статическое свойство возвращает версию (System.Version) 1С:Предприятие.
  • Connection
    Описание:
    Статическое свойство возвращает значение параметра pConnection, передаваемое в метод Init внешнего компонента. Пример:
    1. connection = net.GetStatic("Elisy.NetBridge.Environment", "Connection");
  • GetAppDispatch
    Описание:
    Статическое свойство возвращает COM-объект на глобальный контекст 1C:Предприятие.