Имя: Пароль:
1C
 
Многопоточность и многозадачность в 1C
0 Elisy
 
06.11.09
08:40
http://www.richmedia.us/post/2009/11/02/1c-multithreading-and-callback-functions.aspx

Начиная с третьей версии Elisy .Net Bridge добавляет многопоточность во все популярные версии 1С:Предериятие. Конечно не родными командами 1С, а средствами .Net framework, но многопоточность - настоящая. Пример обработки к статье прилагается.

Представленная здесь статья открывает новые горизонты в 1С-программировании. Например, решает проблему параллельной работы и получения большого числа писем встроенным клиентом 1С.

Остаются еще вопросы, связанные с использованием методики, например: не затрещит ли по швам сама 1С от такой нагрузки? Одинаково ли будут вести себя все версии 1С 7.7/8.0/8.1/8.2, на которые рассчитан компонент .Net Bridge? Достаточно ли традиционных средств .Net framework для организации многозадачности или есть особенности использования пары 1С и .Net? На все эти вопросы со временем найдутся ответы.
1 Voffka
 
06.11.09
08:45
ПиАр?
2 Lama12
 
06.11.09
08:49
(0)Не понял... а что мешает стандартными методами организовать многопоточность?
3 Elisy
 
06.11.09
09:04
(1)Да
4 Pashkaa
 
06.11.09
09:06
(2) Пример в студию
5 Vitello
 
06.11.09
09:06
(4)Через фоновые задания.
6 Elisy
 
06.11.09
09:06
(2)(5)Фоновых заданий нет в 1С 7.7. А фоновые задания из 8ки по-разному работают с файловым и клиент-серверным режимами работы.
7 Lama12
 
06.11.09
09:11
(5)+1,или просто запустить вторую сессию передав ей параметры и организовав взаимодействие (синхронизацию, передачу параметров и т.д.) через константы или любые другие объекты.
Вариант и для 7.7 подойдет.
У меня по такому принципу работала загрузка сразу из нескольких баз в одну. Все запускалось с одной сессии.
8 Pashkaa
 
06.11.09
09:11
(5) вот тебе и ответ в (6)

Попробуй как напиши обработку, прикрути туда фоновые задания, распараллель всё это и в итоге выведи на форму обработки какой нить результат например.

Это будет таким извратом.
9 Pashkaa
 
06.11.09
09:12
(7) Дак у многих так загрузка работает по OLE но это простите не многозадачность, когда ты запускаешь 5 сеансов что бы распараллелить обработку данных
10 Lama12
 
06.11.09
09:13
(9)Блин... а что мешает также обрабатывать данные?
11 Kraft
 
06.11.09
09:18
(0) автар, почитай, что такое многопоточность
12 Холст
 
06.11.09
09:28
вброс на вентилятор засчитан... а где пример работы на 1С 7.7 то?
13 Pashkaa
 
06.11.09
09:28
(11) wiki Многопото?чность — свойство платформы (например, операционной системы, JVM и т. д.) или приложения, состоящее в том, что процесс, порождённый в операционной системе, может состоять из нескольких потоков, выполняющихся «параллельно», то есть без предписанного порядка во времени. При выполнении некоторых задач такое разделение может достичь более эффективного использования ресурсов вычислительной машины.
14 Pashkaa
 
06.11.09
09:31
(10) Представь что для вывода отчета тебе надо выполнить 10 запросов и содрать воедино результат.

Теоретически сейчас бы ты делал это запустив 1 + 9 экземпляров платформы, выполнил бы запрос по OLE собрал бы в одном месте результат, закрыл бы остальные платформы и вывел бы результат. Я так понимаю (0) предполагает выполнение подобных задач параллельно в одной базе используя .Net
15 Elisy
 
06.11.09
09:36
(14)Совершенно верно. В .Net 4.0, говорят, это еще проще будет сделать. Там появится динамический тип.
16 Pashkaa
 
06.11.09
09:41
(15) вот только бы пример более жизненный привести, а не таймер в обработке и то что при этом платформа не блокируется.

Например, запуск одновременно заполнения запроса и Процедуры Состояние("Прошло " + Строка(КоличествоСекунд) + "сек с момента запуска выполнения запроса"); где КоличествоСекунд увеличивается.

Выполнялось бы параллельно два потока.
17 Elisy
 
06.11.09
09:50
(16) Полностью согласен. Со временем появятся такие примеры, думаю.
18 xReason
 
06.11.09
12:17
(0) Компонента платная?
19 luns
 
06.11.09
12:28
20 Злобный Фей
 
06.11.09
12:29
Какой-то унылый пиар
21 luns
 
06.11.09
12:31
А вот здесь пример применения: http://infostart.ru/public/16782/
22 Elisy
 
06.11.09
12:35
(18)Для разработчиков бесплатная. Платная для конечных пользователей.
23 Aswed
 
06.11.09
12:40
А когда будет наконец работать многопоточность в обычной платформе?
Никто не слышал?
24 Злобный Фей
 
06.11.09
12:41
(23) А что, обещали?
25 golden-pack
 
06.11.09
12:41
(Elisy = Pashkaa = НЕ ЛОЖЬ ?
26 trdm
 
06.11.09
12:43
сайт какой-то аляповый.
не смотрел число из-за дизайна. В злазах мельтешит.
27 Elisy
 
06.11.09
12:54
(25) Думаю, что нет
28 golden-pack
 
06.11.09
12:57
(27) Мне показаось что один пользователь отвечает на заранее подготовленные вопросы другого
29 H A D G E H O G s
 
06.11.09
13:07
(27) Мда -уж.
Ну и?
Метод компоненты вызывает таймер, который в отдельном потоке дергает экспортную процедуру формы.

Что такого сенсациального?
30 Vitello
 
06.11.09
13:10
А мне вот интересно, синхронизированная запись\чтение переменных там поддерживается?
31 Elisy
 
06.11.09
13:15
(26) :) Выбери вариант оформления, мы тебе на ночь включим:
http://www.richmedia.us/?theme=angel
http://www.richmedia.us/?theme=arthemia
http://www.richmedia.us/?theme=BlogSmith
http://www.richmedia.us/?theme=BrightSide
32 H A D G E H O G s
 
06.11.09
13:18
Когда сможете получить дескрипторы элементов управления - тогда возвращайтесь.
Пока - лесом.

З.Ы. Лучше уж вызывать не экспортную процедуру формы, а генерировать ВнешнееСобытие().
Там хоть буфер событий есть.
Не пропадет :-)

З.Ы.Ы. Чем ваша поделка отличается от ПодключитьОбработчикОжидания() ??
33 Elisy
 
06.11.09
13:19
(28)Просто, показалось. Pashkaa задавал нормальные закономерные вопросы. Надеюсь, что я на них ответил.
34 szhukov
 
06.11.09
13:21
(0) Это может пригодиться для какой-то очень специфической задачи, где
использование самой 1С может стоять под сомнением вообще.
Собираю данные в 1С со стороннего оборудования On-line, использую фоновые задания
- никаких проблем (полноценная многопоточность).(1С v8.1)

Если эта компонента для 7-ки... тогда да, может быть и есть смысл.

А так ИМХО бесполезная трата времени.
35 Elisy
 
06.11.09
13:22
(30)Глубоко не исслкдовался вопрос. Предполагаю, что возможны несколько подходов. Какой лучше, нужно конкретно разбираться.
1. В сгенерированном C#-классе это может быть lock. Не обязательно на "ЭтаФорма" (ThisForm), а на другое свойство.
2. Новое свойство сгенерированного C#-класса или переменная 1С с типом System.Threading.AutoResetEvent/ManualResetEvent. В этом случае оно/она доступна и C#-классу и 1С коду для анализа.
3. Использование в 1С-коде вызовов:
net.CallStatic("System.Threading.Monitor", "Enter", обработчик.ThisForm);
//Какой-то код
net.CallStatic("System.Threading.Monitor", "Exit", обработчик.ThisForm);
4. Вспомогательный объект .Net BackgroundWorker может быть полезным в большинстве сценариев.
36 fisher
 
06.11.09
13:24
Какие новые горизонты?
Список реальных задач, плиз.
Очень интересно.
37 H A D G E H O G s
 
06.11.09
13:26
(35)
З.Ы.Ы. Чем ваша поделка отличается от ПодключитьОбработчикОжидания() ??

Тем, что пинок идет из внешней компоненты, а не из ОбработчикаОжидания.
Ну и дискретность меньше секунды может быть.
Так?
38 fisher
 
06.11.09
13:27
(37) Обработчик ожидания в том же потоке отрабатывает.
40 Pashkaa
 
06.11.09
13:34
(37) разве можно запустить в одном сеансе обработчик и при его срабатывании делать что либо еще в 1С?! По-моему можно только пойти покурить пока выполняется тяжёлая задача при срабатывании обработчика.

(39) точно время надо потратить на доработку решения и на показ людям её полезности, а не так что я сделал такую штуку скачайте её.

Пример с таймером крайне не удачный. У коллег сложилось мнение что его можно заменить обычным ОбработчикомОжидания.
41 Elisy
 
06.11.09
13:36
(32)(37) Вообще-то таймер - это частный случай для простоты понимания принципа работы. Реальный эффект даст использование Thread и BackgroundWorker классов.
42 Pashkaa
 
06.11.09
13:39
(41) братан ни все специалисты по .NET говори языком 1С и приводи примеры на прикладных задачах 1С. Кто такие классы наверно многие учили, а вот что такое Thread и BackgroundWorker хрен его знает.
43 fisher
 
06.11.09
13:46
Во-во. Как раз примеров на прикладных задачах 1С и не хватает. Боюсь и не хватит. Сдаётся мне, что рынок для этого продукта настолько мал, что невооруженным глазом его сложно разглядеть.
44 szhukov
 
06.11.09
13:47
(40) Читайте (34) Работает реально задача фоново, никого не ждет, снимает данные и фоново формирует документы.
45 H A D G E H O G s
 
06.11.09
13:49
ТОварисчь.
Знаешь.
Я скорее всего смогу свайять конфу, в которой все отчеты (пусть будут только отчеты) смогут выполняться параллельно.
Без ФонововыхЗаданий.
На файловом варианте.
Но.
Весь код будет зашит в ВК.
Ибо никак.
Если еще на выполнение запроса - мы просто можем тупо передать текст в ВК и параметры, то код обработки результата - надо писать в самой ВК.
46 H A D G E H O G s
 
06.11.09
13:50
(45) Поэтому бесперспективняк.
47 TheNewOne
 
06.11.09
13:53
(0) идея, конечно, интересная.. но применения я лично не вижу.
1)7ка-то вообще работает с этим? или это все теоретически и не пробовалось? если 7ка не работает - то аргументов против фоновых заданий почти нет.
2)Многопоточноть получается вне 1С. Т.е. одновременно можно запустить несколько C# потоков, поток 1С останется одним. Какие есть сложные задачи.. ну вот авторасчет ширин колонок в здоровом табличном документа.. расчет себестоимости.. Сомневаюсь, что такие вещи можно паралелить в c# коде.
3)Распаралеливание выполнения запросов - это бред. я ни разу не видел, чтобы где-то выполнялось подряд несколько независимых запросов. Либо запросы используют результат друг друга, либо это один большой запрос.
4)Если уж писать на сях, то почему бы не сделать внешнюю компоненту и уж там многопоточить сколько хочешь. Callback?. сто лет назад уже в окно 1С сочетание клавиш посылал.
5)Код с таймером конечно неудачный, но боюсь другого не придумать.
6)Чтобы за это еще кто-то платил.. Если бы мне платили за использование этого продукта, я бы еще подумал.
48 H A D G E H O G s
 
06.11.09
13:54
(47) <<Callback?. сто лет назад уже в окно 1С сочетание клавиш посылал. >>

Мдааа
49 H A D G E H O G s
 
06.11.09
13:54
Прикольный call-back
50 Pashkaa
 
06.11.09
13:56
(44) я скачал глянуть еще не успел. Реализация там может и изящная, но вот там как я понимаю распараллелили два потока, рабочий сеанс и + один фоновый где так же может выполняться лишь одна фоновая задача. Это не выход из ситуации. А если пользователю надо не 2 отчета сформировать разом а пачку.

Как выход из ряда ситуаций согласен подойдет решение (34).

Но просится поддержка многопоточности и многоядерности самой платформой в пользовательском режиме.
51 Elisy
 
06.11.09
13:56
(36) В программировании считается хорошим тоном открывать второй поток для задач, выполняющихся более 3х секунд, чтобы интерфейс пользователя откликался. Много таких задач в 1С?
52 H A D G E H O G s
 
06.11.09
13:58
(51) Вон оно че!
Пользователь не переживет непрорисованного окна?
53 Pashkaa
 
06.11.09
13:58
Задач много.

Пример покажи более жизненный.

Возьми любой типовой отчет, сохрани его во внешнюю обработку, пределай с использованием твоих наработок и скажи нам в какой типовой конфе его запустить, что бы при этом интерфейс пользователя оставался полностью ему доступен для работы с другими задачами
54 Elisy
 
06.11.09
13:59
(39) Я бы тоже так подумал, если бы компонент предыдущих версий более 200 раз не скачали. В другие направления силы вкладываются тоже.
55 Pashkaa
 
06.11.09
14:00
вдогонку к (53) при этом что бы не было ни каких фоновых процессов 1с кроме единственного запущенного.
56 RealSaint
 
06.11.09
14:06
(0) Я мало-мало не понял, на сайте нужно регистрироваться, чтобы скачать компоненту?
57 Elisy
 
06.11.09
14:07
(47) Компонент создавался для подключения .Net framework к 1С. Многопоточность - это частный случай его применения дополнительно к шифрованию информации, работе с графикой, регулярным выражениям и т.д. То, что он предлагает принципиально новый подход к многозадачности - однозначно. Приживется или нет - покажет время.
58 Elisy
 
06.11.09
14:10
(53)(55) Спасибо. Изучу отзывы здесь и на инфостарте, переделаю пример под реальные требования.
59 H A D G E H O G s
 
06.11.09
14:11
(57) <<работе с графикой>>
Ето как?
60 Elisy
 
06.11.09
14:13
(56) Да, нужно регистрация на форуме http://www.1centerprise.com/forums/. Это тестовая версия, которая выложена не для широкого применения. Предыдущие релизы можно скачать свободно, например, на Инфостарте.
61 Elisy
 
06.11.09
14:16
(59) Вот так:
AttachAddIn("AddIn.ElisyNetBridge");
AddIn = New("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);

buffer.Save("d:\Smile.jpg");
62 Rebelx
 
06.11.09
14:19
а как насчет выполнения запросов в несколько потоков? а в транзакции?
63 H A D G E H O G s
 
06.11.09
14:20
(61) Знаешь, когда я писал Нетленку - я думал - сделаю так-же.
Тупо дам конструктор из WinAPI и пусть творят.
Потом подумал и сказал - нет, не стоит.
Знаешь, почему?

А потому, что товарисчь, способный осилить (61) достаточно легко осилит и написание ВК для 1С.
64 luns
 
06.11.09
14:47
(63) +
Нам бы попроще... типа: НарисоватьКрасиво(Что,Где,Цвет = Сиреневенький)
65 TheNewOne
 
06.11.09
14:50
(57) тогда наверное и надо вести в этом ключе тему, типа "хотите писать на шарпе прямо из 1С? а вот вам тогда:..".  а то "многопоточность"..
И тогда еще надо придумать, зачем писать на шарпе именно из 1С. Мне это опять же в голову не лезет - в студии на шарпе писать удобнее, если уж приперло.
(48)(49) прикольный, ага. в 2001 году дело было.
66 Elisy
 
07.11.09
07:30
(63) У всех разные подходы. Код (61) попадает под родные 1С механизмы: обновление конфигураций, сравнение модулей, значения объектов видятся отладчиком и на каждую строку кода можно поставить точку останова.
Отладка ВК происходит намного тяжелее и дольше. ВК не несет в себе гибкости, а пользователи ВК полностью зависят от разработчика ВК. На каждую задачу требуется своя ВК.
67 Elisy
 
07.11.09
07:41
(64) Такие ВК уже написаны. У нас другой подход - дать максимально возможную функциональность .Net framework. Тогда получится следующее: например, XAML или Json еще в других ВК обработках не освоили, а наши пользователи могут передовыми технологиями пользоваться уже в текущей версии .Net bridge. А таких применений огромная масса.
(65)Обсуждения в таком ключе велись уже, например: Добавление поддержки .Net к 1С:Предприятие
Сейчас планы: дать практические примеры использования ВК .Net Bridge. А их даже для текущего релиза можно придумать массу, было бы время.
68 ShoGUN
 
07.11.09
08:12
(67) Почему аккаунт на форуме требует подтверждения регистрации админом? О_о Только что зарегистрировался, а скачать не могу... Сделайте нормальную регистрацию!
69 Elisy
 
07.11.09
08:26
(68)Потому что 2 дня идет огромный поток спама на форум. Ваша регистрация подтверждена.
70 ShoGUN
 
07.11.09
08:29
(69) Ясно. Спасибо.
71 Elisy
 
10.11.09
12:13
Кому интересна тема - выложил здесь (http://infostart.ru/public/download.php?file=60484) пример отчета "Анализ цен" из УТ 10.3, построенного на классе BackgroundWorker. Пока не понятно, почему при его работе блокируется интерфейс пользователя 1С. Хотя в отличие от оригинального "Анализа цен" оконные сообщения Windows накапливаются и обрабатываются после формирования отчета.
72 Elisy
 
10.11.09
12:16
Пока такое поведение можно объяснить высказываниями (38)(45)(47)
73 Demiurg
 
10.11.09
16:13
при все уважении, лучше бы ты выложил все тоже самое, но сделанное на фоновых процессах 1С,
ато новички на тебя будут смотреть и думать что это правильно
74 Elisy
 
17.11.09
06:24
(73) Спасибо за уважение, мне не интересно делать то, что описали до меня. Фоновые процессы 1С для новичков описаны уже, например, на: Книга знаний: v8: Асинхронные вычисления без «заморозки» формы (на фоновых заданиях)
75 Elisy
 
18.11.09
06:47
Еще к теме: пример рабочей обработки асинхронного вызова веб-сервисов в 1С 8.1
http://www.richmedia.us/file.axd?file=2009%2f11%2fAsynchronousWebServices.epf
77 v77
 
18.11.09
09:05
А почему в списке топиков показывает 76 сообщений, а когда заходишь, то 75?
78 hhhh
 
18.11.09
09:19
(77) какого-то бедолагу забанили