Многопоточность

Публикация № 1211860

Администрирование - Производительность и оптимизация (HighLoad)

Увеличиваем скорость загрузки данных в 20 раз. Как следует использовать многопоточность и готовый модуль для внедрения.

Добрый день, коллеги.

Небольшая статейка и готовое решение для внедрения в свою конфигурацию.

Введение

Вот, сколько я проработал и не разу всерьез не задумывался о многопоточности, пока не начал работу над проектом "Классификатор адресов Украины". При работе в рамках этого проекта столкнулся с необходимость загрузки большого объема данных в конфигурацию, а точнее - необходимо было создать множество элементов в разных справочниках, счет шел на 10-ки а то и 100-ни тысяч элементов...

И как бы меня стало очень сильно "напрягать" продолжительная загрузка данных в рамках тестирования. Ну, что же теперь? Решил поискать в "интернетах", и к сожалению, нашел только старые статьи(но по большому счету ничего с тех времен не изменилось). Да и готового, качественного решения не нашел, пришлось писать самому. И к моему удивлению, скорость загрузки я смог увеличить в 20 раз, благодаря элементарному коду... Какой же глупый я был)

НО ускорения в 20 раз я добился только на сервере, на своей печатной машинке, ускорение было всего 2 раза, при использовании 2 потоков, использовать больше не рекомендую, т.к. особого эффекта от этого не будет. Результат тестов прилагаю.

Ну, как говорится, "погнали".

Внедрение

1. Создаем общий модуль(серверный), называем его "Многопоточность".

2. Копируем в него ниже изложенный код:


#Область ПрограммныйИнтерфейс

// Запускается выполнение указанной процедуры в много поточном режиме 
//
// Параметры:
//  ИмяПроцедуры - Строка - имя экспортной процедуры общего модуля или модуля менеджера объекта, 
//                          которую необходимо выполнить в фоне (ЭкспортнаяПроцедура).
//                          Например, "МойОбщийМодуль.МояПроцедура", "Документы.МойДокумент.МояПроцедура".
//                          У процедуры должен быть один формальный параметр:
//                          * ПараметрыЭкспортнойПроцедуры - Произвольный - произвольные параметры ПараметрыЭкспортнойПроцедуры;
//  СписокДанных - Массив - массив данных, которые будут разделены на части и переданы процедуру,
//                          которая указа в параметре "ИмяПроцедуры".
//  КоличествоПотоков - Число - количество потоков на которое необходимо разделить обработку СпискаДанных,
//                              значение по умолчанию равно 2.
//  Ожидание - Булево - признак указывающий на необходимость ожидания выполнения всех фоновых заданий,
//                      Истина - ожидать пока выполнятся все задания и потом возвращать управление в вызываемый код,
//                      Ложь - возвращать управление в вызываемый код сразу после создания всех заданий.
//
// Возвращаемое значение:
//  <Отсутствует> - 
//
// Варианты вызова:
//  Запустить(ИмяПроцедуры, СписокДанных) - 
//
Функция Запустить(Знач ИмяПроцедуры, Знач СписокДанных, Знач КоличествоПотоков = Неопределено, Знач Ожидание = Истина) Экспорт

	// Отладка.
	//ИмяПроцедуры = "";
	//СписокДанных = Новый Массив;
	
	// Расчеты основных параметров для распределения потоков.
	КоличествоДанных = СписокДанных.Количество();
	КоличествоПотоков = РассчитатьКоличествоПотоков(КоличествоДанных, КоличествоПотоков);
	РазмерПорции = РассчитатьРазмерПорции(КоличествоДанных, КоличествоПотоков);
	
	//
	СписокФоновыхЗаданий = Новый Массив;
	
	// Создание порций данных и запуск выполнения в фоне "ЭкспортнаяПроцедура".
	Данные = Новый Массив;
	Для Каждого Элемент Из СписокДанных Цикл
		
		// Добавление данных в порцию.
		Данные.Добавить(Элемент);
		
		// Проверка размера порции и при достижении рассчитаного размера,
		// запуск выполнения в фоне "ЭкспортнаяПроцедура".
		Если Данные.Количество() = РазмерПорции Тогда
			ЗапуститьВФоне(ИмяПроцедуры, Данные, СписокФоновыхЗаданий);	
		КонецЕсли;
		
	КонецЦикла;

	// Проверка остатка данных,
	// при необходимости выполнение "ЭкспортнаяПроцедура" с остатком данных,
	// количество которых меньше рассчитаного размера порции.
	Если Данные.Количество() > 0 Тогда
		ЗапуститьВФоне(ИмяПроцедуры, Данные, СписокФоновыхЗаданий);		
	КонецЕсли;
	
	// Ожидание при необходимости и задержка передачи управления в вызываемый код.
	Если Ожидание Тогда
		ФоновыеЗадания.ОжидатьЗавершенияВыполнения(СписокФоновыхЗаданий);
	КонецЕсли;
	
КонецФункции // Запустить()

#КонецОбласти

#Область СлужебныйПрограммныйИнтерфейс

Функция ЗапуститьВФоне(ИмяПроцедуры, СписокДанных, СписокФоновыхЗаданий)
	
	Параметры = Новый Массив;
	Параметры.Добавить(СписокДанных);

	СписокФоновыхЗаданий.Добавить(
		ФоновыеЗадания.Выполнить(ИмяПроцедуры, Параметры));

	СписокДанных.Очистить();
	
КонецФункции // ЗапуститьВФоне()

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Функция РассчитатьРазмерПорции(КоличествоДанных, КоличествоПотоков)

	Возврат Цел(КоличествоДанных / КоличествоПотоков);
	
КонецФункции // РассчитатьРазмерПорции()

Функция РассчитатьКоличествоПотоков(КоличествоДанных, КоличествоПотоков)

	Возврат ?(КоличествоПотоков <> Неопределено, КоличествоПотоков, 2)
	
КонецФункции // РассчитатьКоличествоПотоков()

#КонецОбласти

В коде прописал комментарии, так, что думаю, при внимательном чтении проблем возникнуть не должно.

3. Начинаем наслаждаться и использовать.

 

Использование

Теперь в любом серверном методе вам необходимо всего лишь вызвать функцию Запустить нашего созданного общего модуля Многопоточность.

Пример вызова:

Многопоточность.Запустить("КлассификаторАдресовУкраины.ЗагрузитьРайоныКОАТУУ", СписокРайонов, 10);

где:

  • КлассификаторАдресовУкраины - это общий модуль(серверный)
  • ЗагрузитьРайоныКОАТУУ - это экспортная процедура модуля КлассификаторАдресовУкраины
  • СписокРайонов - массив данных, а в массиве у меня лично элементы с типом - Структура
  • 10 - количество потоков.

Пример реализации процедуры, которою будем вызывать:

Процедура ЗагрузитьРегионыКОАТУУ(СписокДанных) Экспорт
	
	Для Каждого Элемент Из СписокДанных Цикл
		
		// траляля
		
	КонецЦикла;	    

КонецПроцедуры // ЗагрузитьРегионыКОАТУУ

В этой процедуре в параметр попадает часть(кусок) данных из тех данных которые мы передали в функцию Многопоточность.Запустить()

 

Заключение

Вот собственно и все, надеюсь, все доступно объяснил, у кого есть предложения по улучшению - предлагайте. Буду рад!)

З.Ы. Использую функции, а не процедуры, т.к. планирую что-то доработать, а что, еще не придумал)))

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. tech_supp19 18.03.20 08:32 Сейчас в теме
А почему не использовали готовые модули "Длительные операции" из БСП?
portwein; potoyalo; mvxyz; Evg-Lylyk; lk255; +5 Ответить
2. kaliuzhnyi 18.03.20 09:41 Сейчас в теме
(1)
Я там не увидел многопоточности. А вы видели?
3. tech_supp19 18.03.20 09:58 Сейчас в теме
(2) Конечно. Так же как и в этой публикации я вижу фоновые задания, как бы Вы их не назвали.
portwein; lk255; +2 Ответить
6. kaliuzhnyi 18.03.20 10:19 Сейчас в теме
(3)
Ну если вы не видите разницы между одним фоновым заданием и двумя фоновыми заданиями которые выполняются параллельно. То мне сложно что-то объяснить.
И да, вы можете использовать ДлительныеОперации, только перед этим не забудьте разбить ваши данные на части.
portwein; user1035175; +2 1 Ответить
10. tech_supp19 18.03.20 10:45 Сейчас в теме
(6) Мне ничего не мешает запускать несколько операций с разными параметрами.
11. kaliuzhnyi 18.03.20 10:57 Сейчас в теме
(10) Так никто-же не заставляет использовать...
Только тогда вам все эти циклы и разбития данных на части необходимо писать в своей форме и/или модуле, и тогда ваш код превратится в свалку, а чтобы не было свалки нужно создать отдельный модуль(о чем и написано в статье) и в этом модуле прописать практически все то-же что и у меня выложено...
А когда вам необходимо будет загрузить подряд 5 справочников(область, район, город, улица, дом) и при этом именно ПОДРЯД, т.к. каждый справочник подченен другому... Я бы посмотрел на ваш код где подряд 5 массив с разбиением данных и 10 раз запуск Длительных операций, тогда ваш код станет просто непригодным к использованию.
К тому же не стоит забывать о разных конфигурациях, где код загажен до такой степи, что плакать хочется, в том числе есть конфигурации где некоторые умники полезли править типовые механизмы, также есть самописные, и если вам приходится приходится работать только с типовыми и не "правленными" конфигурациями то вам повезло очень сильно.
А этот модуль рассчитан на то, чтобы его закинуть в любую конфигурацию, и работать сразу.
frkbvfnjh; Fox-trot; +2 Ответить
13. VmvLer 18.03.20 11:03 Сейчас в теме
(11) "О боже, как же я прекрасен")
torbeev; starik-2005; Sei Souma; o.nikolaev; user1371486; Lyolik; tech_supp19; +7 Ответить
14. kaliuzhnyi 18.03.20 11:32 Сейчас в теме
(13) Наверное по с равнению с вами да... Мне случайно не с вашим кодом приходится работать который написан задним местом?
16. VmvLer 18.03.20 11:36 Сейчас в теме
(14) вы всегда переходите на личности когда сталкиваетесь с критикой или вас просто плохо учили вести диалог?)
torbeev; Lyolik; CyberCerber; +3 Ответить
24. kaliuzhnyi 18.03.20 13:03 Сейчас в теме
(16) Так вы же первый перешли на личности...
izidakg; user843241; the1; +3 Ответить
26. kaliuzhnyi 18.03.20 13:04 Сейчас в теме
(16) Я всего лишь пытался донести практическую пользу от выложенного модуля.
41. tech_supp19 23.03.20 09:59 Сейчас в теме
(11)
Только тогда вам все эти циклы и разбития данных на части необходимо писать в своей форме


Логичнее это вынести в отдельный модуль - обертку над длительными операциями (которые есть во всех актуальных конфигурациях). В котором будет разбивка параметров и запуск необходимого числа фоновых заданий.
4. Eskimos 26 18.03.20 10:05 Сейчас в теме
Вот этот массив:
Данные = Новый Массив;

Я бы очищал после каждого вызова:
 ЗапуститьВФоне(ИмяПроцедуры, Данные, СписокФоновыхЗаданий);
pm74; vano-ekt; kaliuzhnyi; +3 Ответить
7. kaliuzhnyi 18.03.20 10:21 Сейчас в теме
37. riposte 330 21.03.20 07:32 Сейчас в теме
Автор, конечно, тот еще молодец, но,
не стоит забывать о разных конфигурациях, где код загажен до такой степи, что плакать хочется, в том числе есть конфигурации где некоторые умники полезли править типовые механизмы
...
А этот модуль рассчитан на то, чтобы его закинуть в любую конфигурацию, и работать сразу.

Хорошо, давай посмотрим.
	КоличествоДанных = СписокДанных.Количество();
	КоличествоПотоков = РассчитатьКоличествоПотоков(КоличествоДанных, КоличествоПотоков);
	РазмерПорции = Цел(КоличествоДанных / КоличествоПотоков);

	Данные = Новый Массив;
	Для Каждого Элемент Из СписокДанных Цикл
		
		// Добавление данных в порцию.
		Данные.Добавить(Элемент);
		
		// Проверка размера порции и при достижении рассчитаного размера,
		// запуск выполнения в фоне "ЭкспортнаяПроцедура".
		Если Данные.Количество() = РазмерПорции Тогда
			ЗапуститьВФоне(ИмяПроцедуры, Данные, СписокФоновыхЗаданий);
	                Данные = Новый Массив; // Забыли очистить данные? Или очищаем в ЗапуститьВФоне?
		КонецЕсли;
		
	КонецЦикла;
Показать

А что делать с остатком деления?

P.S. Если исполняемый код обхода массива был таким, как в публикации, при замере времени выполнения, а Данные не очищались - прирост "в 20 раз" как бы становится понятен. Было обработана 1\20 часть данных, потому и в 20 раз быстрее :3
Прикрепленные файлы:
ВнешняяОбработка1.epf
38. kaliuzhnyi 21.03.20 20:05 Сейчас в теме
(37)
А что делать с остатком деления?

Смотрите внимательнее!
40. riposte 330 21.03.20 20:40 Сейчас в теме
39. kaliuzhnyi 21.03.20 20:07 Сейчас в теме
(37)
// Забыли очистить данные? Или очищаем в ЗапуститьВФоне?

Еще раз посмотрите внимательнее!
5. vano-ekt 850 18.03.20 10:19 Сейчас в теме
8. kaliuzhnyi 18.03.20 10:26 Сейчас в теме
(5) Принцип тот же. Но в той статье нужно думать)) и подгонять под себя. А я выложил просто готовый модуль который готов к использованию.
9. RocKeR_13 935 18.03.20 10:32 Сейчас в теме
(8)
Но в той статье нужно думать))

Напомнило недавнюю фразу кандидата на должность стажера
А что, тут еще книжки нужно читать?
12. VmvLer 18.03.20 11:00 Сейчас в теме
велик конеш.
да и для таких задач как классификаторы где данные можно четко разделить на порции иногда
проще запустить несколько сеансов чем связываться с капризами фоновых, которые падают как
дебютантки на балах поле первого бокала.

многопоточность в учетных задачах 1С, на данный момент, миф.
15. kaliuzhnyi 18.03.20 11:34 Сейчас в теме
(12) А есть другие варианты?)
Ну, миф не миф, а у меня время загрузки сократилась в десятки раз. А главное результат.
&rew; davdykin; +2 Ответить
17. VmvLer 18.03.20 11:40 Сейчас в теме
(15) Расчеты себестоимости в УТ, ЕРП и прочие "окабаневшие" процессы запускают десятки фоновых якобы в целях многопочтности, а толку?

загрузка классификатора - это не учетная задача, а нормативная.
заполнить какую-то таблицу строгими данными без блокировок, контроля и т.д., ерунда короч.
посему какое там ускорение - пабарабану, задача то разовая по сути.

не вижу смысла далее вести диалог, вы правы в своих заблуждениях)
18. dinopopyys 125 18.03.20 12:33 Сейчас в теме
ну в целом да, своего рода многопоточность. Автор молодец.
Другое дело зачем она в 1с? - очень мало применения.
kaliuzhnyi; +1 2 Ответить
21. Nikola23 592 18.03.20 12:54 Сейчас в теме
(18)
Загрузка данных из внешних источников
Обработка запросов веб-сервера
Постобработка данных
Удаление помеченных объектов
Закрытие месяца. В последних версиях платформы решение систем линейных уравнение сделали многопоточным (или обещали сделать)
Проведение по регистрам, если они не связаны особой бизнес-логикой

Комментаторы, дополнят список
starik-2005; +1 Ответить
19. user1371486 18.03.20 12:43 Сейчас в теме
Читая такие статьи, все больше убеждаюсь, что ИС окончательно скатывается в помойку. Скоро найти нормальную инфу будет не реально. остались статьи о жизни, проектном управлении, да вот такие вот шедевры. Скоро начнутся статьи, как один массив разделить на несколько.
user1311038; azhilichev; vladimirmatancev; CyberCerber; Evg-Lylyk; DarkAn; +6 4 Ответить
29. kaliuzhnyi 18.03.20 13:14 Сейчас в теме
(19)
А вы много знаете способов разделить массив на несколько? А какой будет эффективнее?
32. user1371486 18.03.20 15:06 Сейчас в теме
(29) Вам, голубчик, уже и без того в комментах напихали. Ибо оптимальный способ разделения массива на части Вы, увы, не осилите.
33. kaliuzhnyi 18.03.20 21:47 Сейчас в теме
(29) Из-за таких как вы голубчик, потом страдают заказчики...
И потом приходится переделывать ваш г*но код приходится, где разделение массива происходит через задний проход.
36. user1371486 19.03.20 09:27 Сейчас в теме
(33) Переход на личности засчитан.
Далее. Мои заказчики страдают? А вдруг я работаю госпожой в БДСМ-салоне, и они приходят ко мне именно пострадать. Через какой проход - не суть важно. Я же не публикую это на ИС: смотрите, как ускоряется код после N ударов плеткой программисту.

P.S.
В следующий раз правильно выбирайте номер поста в ответ. А то ведь оно заразно - сегодня номер поста не тот, завтра не ту переменную на вход в функцию подсунете.
AlexeyPapanov; user1311038; +2 Ответить
20. buganov 173 18.03.20 12:53 Сейчас в теме
Вот же о многопоточности в 1С. Отлично расписано.И я бы даже сказал, что данная статья просто повторяет статью Бурмистрова.
https:// /articles/как-ускорить-1с-многопоточность/
22. Nikola23 592 18.03.20 12:58 Сейчас в теме
(20) ссылка не работает.

Репосты и ремиксы - это наша реальность.

Ничего страшного, если автор переоформит повторно ранее написанное.
Кто-то поймет по его описанию, кто-то поймет тему по статье 7ми летней давности.

Ну а нытики с комментариями "раньше было лучше" всегда есть, были и будут.

Даже Аристотель в своих писал "молодежь уже не та".
25. buganov 173 18.03.20 13:04 Сейчас в теме
(22) да не ною я. Репосты и ремиксы ценны тем, что дополняют оригинальную статью, а не просто копипастят.
Вот ссылка.
https://xn----1-bedvffifm4g.xn--p1ai/articles/%D0%BA%D0%B0%D0%BA-%D1%83%D1%81%D0%BA%D0%BE%D1%80%D0%B8%D1%82%D1%8C-1%D1%81-%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BF%D0%BE%D1%82%D0%BE%D1%87­%D0%BD%D0%BE%D1%81%D1%82%D1%8C/
28. kaliuzhnyi 18.03.20 13:12 Сейчас в теме
(25) кстати эту статью я не нашел, наверное плохо искал.
Ремиксы и репосты полностью с вами согласен. Кто-то поймет другою статью а кто-то эту.
У меня так часть бывает... Даже код может быть одинаковый но автор мне объяснил по другому и я сразу понял что к чему...
23. buganov 173 18.03.20 13:02 Сейчас в теме
Кстати, странно, что при двух потоках аж в 20 раз увеличилась скорость. Откуда такой прирост, если данные дробятся "как бог на душу положит" или перед передачей в процедуру Вы уже разбиваете? Если готовые данные передаете, то тем более не вижу смысла дробить еще раз.
Поясню. Допустим, у нас есть таблица данных из, скажем из миллиона строк, которые нужно впихнуть быстро в, например, регистр сведений.
Эта таблица отлично бьется в разрезе каких-то полей, например, по полю Склад. Пусть складов в таблице 10, значит будет 10 потоков, больше не стоит, можно сильно нагрузить сервера. И это был бы наиболее верный алгоритм.
В связи с этим, правильней, я считаю, оставлять дробление данных на руки разработчика, который просто передаст в длительную операцию запись, а потом просто подождет завершения всех потоков
27. kaliuzhnyi 18.03.20 13:08 Сейчас в теме
(23) На сервере скорость увеличилась примерно в раза, если использовать 2 потока. На картинках посмотрите. Время указано в секундах. В двадцать раз скорость загрузки увеличилась когда я "жахнул" 20 потоков)))
31. DarkAn 986 18.03.20 14:33 Сейчас в теме
(0) уж не знаю как Вы искали информацию по многопоточности, но на том же ИС их более, чем достаточно
Ваша реализация, показанная в данной статье, САМАЯ простая. Она не учитывает множество нюансов по работе с потоками.

В далеком 2017 году я уже писал (https://infostart.ru/public/626117/ 52 комментарий)

https://infostart.ru/public/182139/
Это самый простой способ распараллелить, и не самый оптимальный. Его основные минусы:
* Необходимо обдумывать как разбить обрабатываемый массив на части (порции) (В предоставленной статье порция - это склад).
*
ФоновыеЗадания.ОжидатьЗавершения(МассивЗаданий);
тут узкое место в том, что пока ПАЧКА фоновых заданий не отработает полностью новое не запуститься. Если в первую выборку попадет один гигантский склад и 9 маленьких, но при этом в общей выборке их предположи 11, то последний 11 склад будет ждать завершения всего блока, ходя 9 потоков по сути будут давно свободны.
* Не реализована обратная связь между потоками и клиентом, хотя допил не большой,
* И САМОЕ ГЛАВНОЕ, если в потоке произойдет ЛЮБАЯ ошибка, хоть ожидание захвата таблицы, он просто прекратит свою жизнь, и Вам ни как об этом не сообщит


Ваше решение имеет еще ряд недоработок, в частности:
* я скажу что мне надо 5 потоков, а будет запущено 6, т.к. в 6 попадет "хвост" данных
* а что будет если размер порции будет < 1?
* а есть ли смысл запускать в потоках если данных в подаваемой выборке мало?
* и т.д.

Если Вам будет интересно, можете ознакомиться с моей публикацией на тему многопоточности (https://infostart.ru/public/778905/), возможно найдете идеи для своего проекта.
vladimirmatancev; user1371486; dime2; kaliuzhnyi; kiruha; +5 Ответить
34. kaliuzhnyi 18.03.20 22:03 Сейчас в теме
(31)
я скажу что мне надо 5 потоков, а будет запущено 6, т.к. в 6 попадет "хвост" данных

спасибо, исправлю.
а что будет если размер порции будет < 1?

маловероятно если думать перед использованием сего механизма. но спасибо, доработаю.
а есть ли смысл запускать в потоках если данных в подаваемой выборке мало

а тут уже решает разработчик который запускает эту процедуру.

вашу статью обязательно прочту, она на первый взгляд хорошо изложена)

но допустим статья которую вы привели - https://infostart.ru/public/626117/ , довольно сложная в понимании, к таким статьям необходимо переходить после того будут понятны элементарные вещи, которые собственно я и описал...
30. frkbvfnjh 606 18.03.20 14:32 Сейчас в теме
З.Ы. Использую функции, а не процедуры, т.к. планирую что-то доработать, а что, еще не придумал)))

На мой взгляд, процедуры вообще зло, все должно быть функциями, пусть даже они будут возвращать "Неопределено", в частности боль начинается когда не можешь выполнить процедуру во время отладки, просто потому, что она процедура.
CyberCerber; +1 Ответить
42. AlX0id 30.03.20 08:12 Сейчас в теме
(30)
И более того - каждая функция должна возвращать информацию об успешности/неуспешности выполнения )
Ну это как по мне.
35. _ASZ_ 123 19.03.20 08:05 Сейчас в теме
Простой код, решение задачи "в лоб"...
А если один или несколько из потоков будут завершены аварийно или "убиты" на кластере? Удобно ли отлаживать код, обернутый в такие конструкции? Есть и более зрелые решения.
Evg-Lylyk; dsdred; user1371486; +3 Ответить
43. user612295_death4321 05.04.20 09:23 Сейчас в теме
Если продумать на перед, что выполняемые фоновые порции не попадут на конкурентную запись (не просядет железка, не будет блокировок 1С или СУБД), то это вполне рабочий вариант с ускорением выполнения операций.

Подобным способом увеличили скорость проведения документов реализации, прирост в скорости проведения получился в ускорении в 4-5 раз, по сравнению с последовательным проведением документов по 1му, и теперь склад не при каких обстоятельствах не готов возвращаться к старому механизму. Правда УППшечку пришлось перед этим очень плотно готовить, переписать механизм допроведения документов + перевести базу в RCSI, выпилить весь говнокод с обращениями через точку к полям ссылочного типа и все, вуаля, все счастливы.
44. starik-2005 2324 01.03.21 11:56 Сейчас в теме
А я вот плюс влепил статье, ибо она говорит о том, что современные компы (даже ноуты) имеют несколько ядер, на каждом, обычно, по парочке потоков.

Я в свое время писал две статьи про многопоток - про саму многопоточность и про мьютексы на 1С, без которых многопоточность местами страдает, ибо внешние компоненты не потокобезопасны (да, 1С - это ржавое желтое унылое г-но, ибо не могут программисты толково написать на сях потокобезопасный код - учитесь, желтые "сишники": https://ru.wikipedia.org/wiki/Thread-safety, но, боюсь, там еще старая школа рулит, которая про потоки плохо знает и соответствующие тесты писать не умеет)

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

ЗЫ: Скорость даже на ноуте, если нет кеширования в БД, растет пропорционально количеству потоков, ибо при отсутствии кеширования система утилизирует множественные ожидания на I/O.

ЗЫЗЫ: если есть сложные учетные задачи, то есть масса способов их распараллелить. Многопоточность в лоб - это не лучший вариант для таких задач, а вот распараллеливание записи изменений и кеширование исторических данных - это может очень серьезно повысить производительность любой задачи, пишущей множество транзакций.
Оставьте свое сообщение

См. также

Использование классов .Net в 1С для новичков Промо

Практика программирования Разработка внешних компонент Универсальные функции v7.7 v8 Бесплатно (free)

Руководство для новичков. Написав статью http://infostart.ru/public/238584/, я понял, что многие не понимают того, что написано. Поэтому в этой статье постараюсь более подробно остановиться на азах и без кода на вражеском языке (C#)

27.01.2016    80729    Serginio    113    

Полезные примеры СКД, ч.2

Практика программирования v8 v8::СКД Бесплатно (free)

Еще несколько примеров решения задач в СКД.

06.04.2021    5663    Neti    7    

Обзор полезных методов БСП 3.1.4

Практика программирования БСП (Библиотека стандартных подсистем) v8 1cv8.cf Бесплатно (free)

Библиотека стандартных подсистем (далее - БСП) является частью любой типовой конфигурации, поэтому умение применять готовые процедуры и функции повышает качество разработки и избавляет от написания лишнего кода. К сожалению, не у всех есть время и упорство овладеть всей документацией, поэтому я собрал воедино наиболее популярный функционал.

25.03.2021    22004    rayastar    49    

Звуковое управление в 1С 8.3

Практика программирования v8 1cv8.cf Бесплатно (free)

В данной статье описано создание библиотеки для звукового управления (выполнение команд голосом) для платформы 1С 8.3. Задача была поставлена так, чтобы модуль функционировал непосредственно на клиенте 1С, осуществляя управление формами, и взаимодействовал с интерфейсом.

16.03.2021    3998    velemir    31    

Использование программных перечислений, ч.1: строковые константы Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Часто ли у вас возникает необходимость в коде выполнять сравнение на строку?

10.12.2016    39278    unichkin    74    

Serverless (Faas) в 1С. Создание и вызов Yandex Cloud Functions

Универсальные функции Практика программирования v8 Бесплатно (free)

"Я не могу просто взять и скопировать код с гитхаба", "у нас 1С микросервисами окружена", "возможностей мало" - частые фразы 1С разработчиков. которым не хватает возможностей платформы в современном мире. Faas, конечно, история не новая, но нас сдерживало 152ФЗ и задержки по пингам. Для того, чтобы действительно использовать в 1С код, к примеру, на Python, надо было приложить усилия. Теперь всё намного проще - берём и используем.

28.12.2020    5924    comol    31    

Базовые вещи БСП, которые облегчат жизнь программисту 1С

Практика программирования БСП (Библиотека стандартных подсистем) v8 1cv8.cf Россия Бесплатно (free)

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

30.08.2020    14926    quazare    34    

Описание почти всех событий технологического журнала

Технологический журнал v8 Бесплатно (free)

Краткое описание событий технологического журнала с примерами. Все для быстрого старта.

19.08.2020    19763    YPermitin    34    

Вспомогательные инструкции в коде 1С Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Помогаем редактору кода 1С помогать нам писать и анализировать код.

15.10.2018    33542    tormozit    105    

Форма выбора (подбор) в управляемых формах

Практика программирования v8 v8::УФ 1cv8.cf Россия Бесплатно (free)

Разбор небольших примеров того, как правильно открывать форму выбора (подбора) в управляемых формах, не прибегая к модальным окнам.

08.05.2020    51518    user5300    18    

Эти занимательные временные таблицы

Производительность и оптимизация (HighLoad) Администрирование СУБД v8 Бесплатно (free)

Кое-что интересное о временных таблицах и работе платформы 1С с ними.

06.04.2020    14533    YPermitin    0    

Программная работа с настройками СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Нюансы программной работы с настройками системы компоновки данных в отчетах и динамических списках. Обзор всех видов настроек компоновки. Что в каких случаях правильно применять. В качестве примера рассмотрена работа с отборами и группировками.

27.01.2020    49696    ids79    26    

Оформление и рефакторинг сложных логических выражений Промо

Практика программирования v8 Россия Бесплатно (free)

В сложных логических выражениях нередко самому автору спустя какое-то время тяжело разобраться, не говоря уже о других программистах. Предлагаемая методика позволяет повысить наглядность таких выражений путем оформления в виде И-ИЛИ дерева и одновременно выполнять их рефакторинг.

20.09.2012    80537    tormozit    131    

[СКД] Программное создание схемы компоновки данных

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Сделаем отчет на СКД полностью программно, без использования макета "схема компоновки данных".

15.01.2020    35542    John_d    22    

Последовательности событий при проведении документа 1С. Шпаргалка + про формы + про расширения

Практика программирования v8 Россия Бесплатно (free)

Собрал информацию о событиях/подписках/расширениях в одном месте.

30.12.2019    28104    kuzyara    38    

30 задач. Странных и не очень

Практика программирования v8 Бесплатно (free)

30 задач на знание языка программирования 1С и некоторого поведения платформы. Маленьких. Странных и не очень.

02.12.2019    20709    YPermitin    61    

Запись значения в поле ввода/формы со срабатыванием события ПриИзменении Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Иногда возникает необходимость после записи значения в какое либо поле ввода/формы вызвать для него обработчик события ПриИзменении, а о вызове самого события приходится только мечтать. В этой статье приводится программный способ вызова этого события.

11.07.2007    51558    tormozit    51    

Как передать IP адрес, который вызвал HTTP запрос в 1C (для веб-сервера Apache)

Практика программирования v8 Бесплатно (free)

Столкнулся с задачей получения IP адреса, который вызывает http сервис 1С. Итак, решение:

22.11.2019    10996    Sibars    19    

Обслуживание баз данных. Не так просто, как кажется

Производительность и оптимизация (HighLoad) Администрирование СУБД v8 1cv8.cf Бесплатно (free)

Считаете, что обслуживание индексов и статистик дело простое? Что ж, это не всегда так.

14.10.2019    20475    YPermitin    31    

Полезные процедуры и функции для программиста

Практика программирования Универсальные функции v8 1cv8.cf Россия Бесплатно (free)

Все мы пишем программный код и часто используем процедуры, облегчающие его написание. Ниже приведена выборка таких полезных процедур и функций.

07.10.2019    35574    HostHost    41    

Как сделать из &НаКлиентеНаСервереБезКонтекста почти &НаКлиентеНаСервере Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Как сделать метод формы, доступный на клиенте и на сервере одновременно, и сохранить при этом удобство разработки

10.09.2017    48273    tormozit    74    

Таблица значений. Нюансы

Практика программирования v8 Бесплатно (free)

Обзор некоторых аспектов использования общеизвестного инструмента 1С.

01.10.2019    45618    Yashazz    50    

[Шпаргалка] Программное создание элементов формы

Практика программирования Работа с интерфейсом v8 1cv8.cf Бесплатно (free)

Программное создание практически всех популярных элементов формы.

06.09.2019    80484    rpgshnik    70    

Агрегатные функции СКД, о которых мало кто знает

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Пользуетесь ли Вы всеми возможными агрегатными функциями, которые предоставляет система компоновки данных? Если Вы используете только: СУММА, КОЛИЧЕСТВО, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, то эта статья для Вас.

05.09.2019    65843    ids79    55    

Выгрузка документа по условию Промо

Практика программирования Разработка v8 Бесплатно (free)

Что делать, если документы нужно выгружать не все подряд, а по какому-то фильтру: статусу, дате, набору условий... А что если он соответствовал этим условиям, а потом перестал? А если потом опять начал? Такие ситуации заставили попотеть не одного программиста.

25.04.2019    16858    m-rv    3    

Регистры бухгалтерии. Общая информация

Практика программирования Математика и алгоритмы v8 v8::БУ БУ Бесплатно (free)

Общая информация о внутреннем устройстве регистров бухгалтерии.

05.09.2019    38131    YPermitin    25    

Три костыля. Сказ про фокусы в коде

Практика программирования v8 Бесплатно (free)

Три интересных (или странных) костыля в коде, которые могут помочь в повседневных и не очень задачах.

03.09.2019    28162    YPermitin    81    

Отслеживание выполнения фонового задания

Практика программирования Универсальные функции Разработка v8 1cv8.cf Бесплатно (free)

Запуск фонового задания из модуля внешней обработки. Отслеживание выполнения задания в виде прогресса, расположенного на форме.

17.08.2019    39950    ids79    19    

Как прикрутить ГУИД к регистру сведений Промо

Практика программирования Перенос данных из 1C8 в 1C8 Разработка v8 Бесплатно (free)

... и немного теории обмена данными. В частности, разберем боль всех, кто пишет небанальные обмены данными: как набору записей регистра сведений назначить гуид и далее использовать его в обмене для идентификации этого набора.

16.04.2019    21558    m-rv    17    

Функции СКД: ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Подробное описание и использование внутренних функций системы компоновки данных: Вычислить, ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив, ВычислитьВыражениеСГруппировкойТаблицаЗначений.

08.08.2019    125144    ids79    73    

Фоновое выполнение кода в 1С - это просто

Практика программирования v8 1cv8.cf Бесплатно (free)

Как легко запускать выполнение в фоне, не прибегая к долгому описанию фоновых процедур.

02.08.2019    50861    avalakh    26    

Разбираемся с параметрами редактирования СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Связь по типу, Параметры выбора, Связи параметров выбора

31.07.2019    34360    json    15    

Как сделать запрос на изменение данных Промо

Практика программирования v8 v8::Запросы 1cv8.cf Бесплатно (free)

В статье приведены особенности внутренней архитектуры и примеры работы с расширением языка запросов 1С.

01.06.2018    33933    m-rv    22    

СКД - наборы данных и связи между ними, создание собственной иерархии, вложенные отчеты

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Набор данных объект. Использование в схеме компоновки нескольких наборов данных. Различные варианты связи наборов: объединение, соединение. Использование иерархии в отчетах на СКД. Создание собственной иерархии, иерархия детальных записей. Использование вложенных схем в отчетах на СКД.

26.07.2019    88681    ids79    14    

СКД - использование расширений языка запросов, секция ХАРАКТЕРИСТИКИ

Инструментарий разработчика Практика программирования v8 v8::СКД Бесплатно (free)

Автоматическое и не автоматическое заполнение полей компоновки данных. Использование расширений языка запросов для СКД «{…}», секция ВЫБРАТЬ, секция ГДЕ, параметры виртуальных таблиц. Автоматизированное использование дополнительных данных в запросе: секция ХАРАКТЕРИСТИКИ.

17.07.2019    43201    ids79    27    

Регистры сведений. За кулисами

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Небольшие заметки по внутреннему устройству регистров сведений.

09.07.2019    30711    YPermitin    14    

Метод формирования движений в типовых регистрах нетиповыми регистраторами Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Вариант решения задач с проведением по типовым регистрам нетиповыми регистраторами. Зачем - чтобы при сравнении конфигурации не обращать внимание на свойства регистров и исключить вероятность допущения горькой оплошности при обновлении информационных баз, заменив типы регистраторов основной конфигурации типами конфигурации поставщика. Для программных продуктов, имеющих в своем составе метаданных документ "Корректировка регистров"("Корректировка записей регистров").

05.12.2017    29361    itriot11    34    

"Меньше копипаста!", или как Вася универсальную процедуру писал

Практика программирования Разработка v8 v8::СКД 1cv8.cf Бесплатно (free)

Программист Вася разбирает подход создания универсальных методов на примере программного вывода СКД.

04.07.2019    20911    SeiOkami    52    

Работа с настройками системы компоновки данных

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Варианты отчетов, работа с настройками вариантов: структура группировок, поля отчета, отборы, сортировка, условное оформление, другие настройки, настройки отображения диаграмм.

02.07.2019    69746    ids79    17    

Создание отчетов с помощью СКД - основные понятия и элементы

Практика программирования Математика и алгоритмы v8 v8::СКД Бесплатно (free)

Основные принципы работы СКД. Понятия схемы компоновки и макета компоновки. Описание основных элементов схемы компоновки: наборы данных, поля, вычисляемые поля, ресурсы, параметры.

25.06.2019    66835    ids79    27    

Автоматические и управляемые блокировки применительно к типовым конфигурациям 1С Промо

Математика и алгоритмы Практика программирования v8 v8::blocking 1cv8.cf Бесплатно (free)

Основные принципы работы с режимами автоматических и управляемых блокировок в 1С Предприятие 8. Теория и применение в типовых конфигурациях: БП, УТ, ЕРП

10.11.2018    40425    ids79    44    

Многопоточное ускорение однопользовательских нагрузок в 1С + Microsoft SQL Server 2017

Практика программирования Производительность и оптимизация (HighLoad) v8 v8::Запросы Бесплатно (free)

Взаимодействие с Microsoft SQL Server нередко вызывает трудности у 1С-ников, а потому интересны любые моменты, связанные с его использованием. О своем опыте работы с новым SQL Server 2017 участникам конференции Infostart-2018 рассказал директор ООО «Аналитика софт» Дмитрий Дудин.

11.06.2019    28424    dmurk    148    

Регистры накопления. Структура хранения в базе данных

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Структура хранения регистров накопления в базе данных для платформы 1С:Предприятие 8.x. Первая часть в серии публикаций.

16.05.2019    55420    YPermitin    30    

5 простых шагов и 15 минут на разворачивание инструмента мониторинга проблем производительности базы 1С

Производительность и оптимизация (HighLoad) v8 Бесплатно (free)

В этой статье мы разберем механизм использования конфигурации "Анализ технологического журнала" на практике, и всего через 15 минут работы вы получите функциональный, удобный инструмент мониторинга проблем производительности базы 1С.

18.04.2019    33762    ivanov660    77    

О расширениях замолвите слово...

Практика программирования Разработка v8 Бесплатно (free)

О чём стоит задуматься при принятии решения о создании расширения конфигурации…

07.04.2019    39988    ellavs    130    

Git-репозитории для 1С-кода (опыт использования при небольших проектах)

Практика программирования v8 Бесплатно (free)

Инструкции по взаимодействию с Git-репозиторием, которые писались для тех наших программистов, которые вообще никогда не работали с Git (руководства в духе "Как получить код из git-репозитория?", "Как отправить код в git-репозиторий")...

28.03.2019    29846    ellavs    90    

Трюки с внешними источниками данных

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Некоторые трюки для преодоления ограничений внешних источников данных.

14.03.2019    37270    YPermitin    53    

Разработка и сценарное тестирование с Vanessa-ADD. Отчетность Allure. Автоматизация запуска сценариев

Практика программирования Vanessa Automation v8 Россия Бесплатно (free)

Формируем отчетность о результатах выполнения сценариев. Автоматизируем запуск.

26.02.2019    25920    Vladimir Litvinenko    28    

Возможности типовых шаблонов ограничения доступа на уровне записей (RLS)

Практика программирования БСП (Библиотека стандартных подсистем) Роли и права v8 v8::Права Бесплатно (free)

Краткий обзор применения типовых шаблонов ограничения доступа на уровне записей в конфигурациях, созданных на базе БСП: #ПоЗначениям, #ПоНаборамЗначений, #ПоЗначениямРасширенный, #ПоЗначениямИНаборамРасширенный

03.02.2019    54667    ids79    11