Предлагаю вашему вниманию пример “Рассылка почты”, написанный для 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)