Конфигурации: 1C: Предприятие 8
Внешний отчет, обработка для 1С: Предприятие 8.2; Windows
Предлагаю вашему вниманию пример “Рассылка почты”, написанный для 1С:Предприятие 8.2 и демонстрирующий новые возможности .Net framework 4: DLR и PLINQ.
Предлагаю вашему вниманию пример “Рассылка почты”, написанный для 1С:Предприятие 8.2 и демонстрирующий новые возможности .Net framework 4: DLR и PLINQ.
Пример комплексный и демонстрирует следующие моменты:
Особенность подключения .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?
http://www.richmedia.us/post/2011/03/23/Email-sender-1c-enterprise-82.aspx
Поставьте плюс, если вы рекомендуете данную публикацию к прочтению и использованию.
Плюс добавляет публикацию в Мои рекомендации.
[+] Рекомендую
[−] Не тратить время
Если рейтинг упадет до -5, то публикация автоматически скроется.