Пример подключения 1С:Предприятие 8.2 к .Net Framework 4

by Elisy 23. March 2011 11:32

Предлагаю вашему вниманию пример “Рассылка почты”, написанный для 1С:Предприятие 8.2 и демонстрирующий новые возможности .Net framework 4: DLR и PLINQ.

Пример комплексный и демонстрирует следующие моменты:

  • Подключение Elisy .Net Bridge на стороне сервера 8.2,
  • Компиляцию «на лету» исходного кода C# 4.0,
  • Работу 1C:Предприятие 8.2 с .Net framework 4,
  • Передачу 1С-объектов внутрь .Net framework,
  • Упрощенное обращение к 1С-объектам из .Net framework,
  • Вызов 1С-методов из .Net framework,
  • Простую организацию параллельных вычислений;

Особенность подключения .Net Bridge в 1С 8.2 по сравнению с 1С 8.1 заключается в том, что подключение необходимо выполнять по-разному для сервера и для клиента. В связи с отсутствием возможности в 1С 8.2 на стороне сервера подключать COM ВК, .Net Bridge 4 доработан и оформлен в виде COM-объекта. При этом подключение на сервере осуществляется вызовом:

net = Новый COMОбъект("Elisy.NetBridge4");

В пример заложена возможность компиляции «на лету» исходного кода C# новой версии 4.0. Такая компиляция позволяет использовать всю мощь языка C#, включая объектно-ориентированное программирование, лямбда-выражения, обработку событий и прочее. Логика компиляции «на лету» зашита в метод формы СкомпилироватьИсходныйКодСервер. Сам исходный код хранится в макете внешней обработки ИсходныйКод.

Из всего множества новых возможностей .Net 4.0 есть 2 нововведения, о которых хочется рассказать в первую очередь. Это DLR (Dynamic Language Runtime) и PLINQ (Parallel Extensions).

DLR позволяет принять в .Net-метод любой объект 1С и элегантно обращаться к его свойствам и методам следующим образом (см. макет ИсходныйКод):

public void SendAll(dynamic model, dynamic form)
{
    int count = model.Клиенты.Количество();
    ...

1С вызовет этот метод из обработчика ВыполнитьРассылкуСервер, передав 2 своих 1С-объекта, следующим образом:

sender.SendAll(Объект, ЭтаФорма);

PLINQ позволяет просто (часто в один вызов метода AsParallel()) организовать параллельные вычисления. Делается в примере это таким образом (см. макет ИсходныйКод):

public void SendAll(dynamic model, dynamic form)
{
    int count = model.Клиенты.Количество();
    var indexes = Enumerable.Range(0, count);

    //Параллельная обработка через .Net
    indexes.AsParallel().ForAll((i) => ProcessRow(model, i));
    ...

При этом метод ProcessRow будет вызываться параллельно на всех имеющихся в наличии ядрах/процессорах.

Замечание: предложенную задачу по отправке почты не следует рассматривать как удачный пример организации параллельных вычислений, так как прирост производительности составляет всего 5-10%. (Для сравнения организация параллельных вычислений в задаче Бесплатный компонент Elisy.CfInspector для чтения CF-формата. Parallel LINQ (PLINQ) дает убыстрение до 50-60 процентов на 4 ядрах). Низкий показатель связан с особенностью работы класса SmtpClient, который отправку писем осуществляет последовательно, даже если создаются разные экземпляры в разных потоках. В примере фактически распараллеливается работа по подготовке писем к отправке.

Пример «Рассылка почты» можно взять за основу для своих задач, позаимствовав структуру и выборочно переписав его части. Полезен он будет также для реализации аналогичных задач, например, по более быстрой отправке SMS-сообщений/факсов или по одновременному скачиванию файлов с нескольких FTP/HTTP-серверов.

Организация же параллельных вычислений – очень интересная малоизученная тема для 1С:Предприятие. Первые попытки работать с параллельными вычислениями через .Net были предприняты здесь: Многопоточность 1C и обратная связь из .Net Framework. Желающие могут поэкспериментировать, так как пример не дает ответов на вопросы: Допускает ли 1С 8.2 параллельную работу со своими процедурами и функциями? Будет ли отправка писем средставми 1С функциональнее и быстрее работать, чем реализация на .Net framework?

РассылкаПочты.epf (11.73 kb)

Tags: , , , ,

1C.Net

Comments are closed

Richmedia.us

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

1 2 3 4 5 6 7 8

RecentComments

Comment RSS