Многопоточное выполнение процедуры с помощью ДлительныеОперации

Публикация № 1812197 26.02.23

Разработка - БСП (Библиотека стандартных подсистем)

Многопоточно ДлительныеОперации ДлительныеОперации.ВыполнитьПроцедуруВНесколькоПотоков ДлительныеОперации.ВыполнитьФункциюВНесколькоПотоков ВыполнитьПроцедуруМодуляОбъектаОбработки прогресс распараллеливание фоновые задания БСП

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

Введение

Недавно столкнулся с необходимостью увеличить скорость работы одной внешней обработки. Оказалось, что начиная с версии БСП 3.1.6 появился новый функционал. 

Новые возможности для разработчиков в версии 3.1.6

Базовая функциональность

  • Для ускорения выполнения длительных операций предусмотрена возможность выполнить обработчик длительной операции в несколько потоков. Для этого необходимо:
    • Разделить данные на наборы, где каждый элемент набора будет обработан в отдельном фоновом задании.
    • Из программного интерфейса общего модуля ДлительныеОперации для запуска процедуры длительной операции вызвать функцию ВыполнитьПроцедуруВНесколькоПотоков (или ВыполнитьФункциюВНесколькоПотоков), передав третьим параметром сформированный набор данных. Подробное описание параметров см. в комментарии к этим функциям.
    • Максимально допустимое количество одновременно работающих фоновых заданий может быть задано администратором в разделе Администрирование - Общие настройки - Производительность
    • В файловой информационной базе и при работе в модели сервиса длительные операции всегда выполняются в один поток.
    • Пример см. в демонстрационной конфигурации в форме ЗагрузкаАдресногоКлассификатора регистра сведений АдресныеОбъекты.

В описании функции ВыполнитьПроцедуруВНесколькоПотоков (или ВыполнитьФункциюВНесколькоПотоков, но для удобства не буду разделять) описано, что код который будет выполняться в фоне должен быть в:

  1. В общем модуле ("МойОбщийМодуль.МояПроцедура")
  2. Модуле менеджера объекта ("Отчет.ЗагруженныеДанные.Сформировать")
  3. Модуле обработки ("Обработка.ЗагрузкаДанных.МодульОбъекта.Загрузить")

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

Цели

Перед тем как приступать к реализации, поставим цели, которых хотим достичь в рамках публикации.

  1. Публикация должна ответить читателю на ряд вопросов:
  • Как многопоточно запустить процедуру расположенную в серверном общем модуле?
  • Как с помощью ДлительныеОперации запустить процедуру модуля объекта внешней обработки?
  • Как многопоточно запустить процедуру модуля объекта внешней обработки?
  • Как отобразить прогресс многопоточной операции?
  1. В публикации должны быть продемонстрированы замеры производительности в зависимости от кол-ва потоков, наглядно показан выигрыш в производительности

Цели поставлены, приступим к реализации.

Реализация

Разработка проводилось на демонстрационной базе БСП версии 3.7.1.327. 

Начнем с краткого описания того, что будет делать наша обработка:

  1. Получаем выборку ссылок на N-ое кол-во документов _ДемоПоступлениеТоваров
  2. Разбиваем ее на порции размером N/k, где k - кол-во потоков
  3. Формируем структуры параметров для функции ДлительныеОперации.ВыполнитьПроцедуруВНесколькоПотоков
  4. Запускаем длительную операцию которая поменяет в каждом обрабатываемом документе значение реквизита Комментарий

 

Форма обработки

 

 

Модуль объекта

 

Процедура ниже будет запускаться многопоточно

 
Модуль объекта

 

Модуль формы

 

Первым делом ответим на вопрос "Как в длительной операции запустить процедуру модуля объекта внешней обработки?":

 
Как с помощью ДлительныеОперации запустить процедуру модуля объекта внешней обработки?

 

И реализуем базовую функциональность для отображения прогресса

 
 Прогресс
 

Теперь ответим на вопрос "Как многопоточно запустить процедуру модуля объекта внешней обработки?" и "Как многопоточно запустить процедуру расположенную в серверном общем модуле?": 

 
 Многопоточный запуск
 

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

 

 

Как я понял основной поток передает только информацию о завершении дочерних потоков, а в силу того что данные разбиваются на равные порции, и потоки заканчиваются практически одновременно, прогресс бар в какой-то момент просто скаканет с 0 до 100. Необходимо каким-то образом синхронизировать прогрессы обработки в каждом потоке и выдать пользователю среднее значение. Типового функционала который в полной мере будет делать то, что описано я не нашел. Но в рамках многопоточного выполнения длительной операции есть несколько моментов, которые могут помочь реализовать собственный функционал:

1. В процедуру  ПрогрессВыполнения попадает структура длительной операции (см. ДлительныеОперацииКлиент.ПараметрыОжидания) и что важно - в ключе ИдентификаторЗадания этой структуры, содержится именно идентификатор основной длительной операции.

2. Есть функция СерверныеОповещения.СерверныеОповещенияДляКлиента благодаря, которой можно получить все сообщения о прогрессе из потоков, по идентификатору основного потока . А имея эти оповещения остается правильно их обработать.

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

 
Улучшенный прогресс

 

Полный код модуля формы

 

 
 Полный код модуля формы

 

Замеры производительности

 

Были произведены замеры производительности в зависимости от кол-ва потоков. Результаты для разного кол-ва обрабатываемых документов на графиках

  

  

 

 

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

 

Выводы

 

В публикации:

  • Приведен шаблон для запуска многопоточной операции для различных вариантов размещения многопоточной операции, в том числе в модуле объекта внешней обработки, встроенной в справочник Дополнительные отчеты и обработки;
  • Представлен вариант корректного отображения прогресса многопоточной операции;
  • Приведены замеры, демонстрирующие целесообразность использования нового механизма для увеличения производительности.

 

P.S.

 

  • Еще публикации по теме:

Многопоточный режим выполнения процедуры с помощью методов БСП - примеры разработки

Гарантированно рабочий пример использования длительных операций на БСП с отображением прогресса. [Часть 1]

Многопоточность как способ ускорения некоторых процедур

Как ускорить 1С – Многопоточная обработка данных

  • Многопоточность работает только в клиент-серверном варианте работы
  • Обратите внимание на константу Кол ичествоПотоковДлительныхОпераций, по умолчанию значение 0 и больше 3 потоков запущено не будет. (см. ДлительныеОперации.ДопустимоеКоличествоПотоков)
  • Весь код по теме представлен в публикации, в приложенной обработке реализован тестовый стенд для этой статьи с замерами времени, построением по ним графика и тп

 

 

 

Скачать файлы

Наименование Файл Версия Размер
Многопоточное выполнение процедуры

.epf 15,65Kb
8
.epf 15,65Kb 8 Скачать

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

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Sergant 51 27.02.23 11:40 Сейчас в теме
Запуск потока в голанг - go ИмяФункции().
А теперь живите с этим. :)
SquizzyMan; +1 2 Ответить
6. alex_sayan 27.02.23 15:43 Сейчас в теме
(1) в голанге многопоточно шло из коробки. А сами потоки очень легковесные. Тут как бы и сравнивать даже некорректно
7. Sergant 51 27.02.23 15:45 Сейчас в теме
(6) Как бы сравнивать корректно, некорректно - утюги с пирогами. 1С унылый малопоточный тормоз.
LsrGroup; +1 Ответить
20. JohnyDeath 300 03.03.23 15:07 Сейчас в теме
(7) вы, наверное, и на форум ГО-разработчиков заходите в тему, где они создают таблицы БД с индексами и формы списков и объектов к ним, контроль целостности и т.п. а потом добавляете комментарий:
"В 1с достаточно добавить Справочник в метаданные. Живите теперь с этим!"
;)
21. Sergant 51 03.03.23 15:27 Сейчас в теме
(20) А также они не имеют такого классного конструктора запросов или СКД. И поверьте - явашники и гошники, бывшие 1Совыцы, очень сильно страдают.
14. more 15 01.03.23 10:29 Сейчас в теме
(1)А не похоже ли это на человека, который сравнивает велосипед с бульдозером? типа "Велосипед транспорт и ехать на нем можно и через подземный переход на нем можно, а бульдозер ничего из этого не умеет. Вот и живите с этим. :)"
Может быть вы сможете написать ERP на вашем голанг и мы посмотрим как это получится? Ну а что, вдруг будет лучше - и весь мир перейдет на вашу ERP, Станете богатым человеком. Я придерживаюсь такого мнения - есть конструктивная идея - пишем разработчику продукта (в нашем случае 1С). Есть новый функционал в 1С, ознакомились - сказали спасибо, и пошли дальше (работать, зарабатывать, внедрять один из лучших бизнес продуктов на нашем рынке)
Olenevod; JohnyDeath; sa1m0nn; serg_gres; nyam-nyam; +5 Ответить
15. Sergant 51 01.03.23 11:23 Сейчас в теме
Могу лишь повторить - 1С унылый малопоточный тормоз (признать неприятно некоторым). Go язык - быстродействие и многопоточность это его ДНК. Сравнивать могу, как может сравнить экскаваторщик на чем ему быстрее будет добраться домой на обед - на велосипеде или на экскаваторе). Мои слова не отменяют великолепие 1С в части быстрой разработки бизнес приложений.
16. Sergant 51 01.03.23 19:23 Сейчас в теме
После таких кто говорит про некорректность сравнения потом другие переписывают весь код или уходят к другим вендорам. Salesforce: Why we ditched Python for Google's Go language in Einstein Analytics.
23. siamagic 13.03.23 11:53 Сейчас в теме
(1)Для внешнее обработки 2 строчки на клиенте, 4 на сервере. Если убрать вызов с клиента и сильно захотеть то будет две строки на сервере.
Живи с этим.
2. ImHunter 273 27.02.23 12:31 Сейчас в теме
(1) ФоновыеЗадания.Выполнить("ИмяМетода") - не сильно сложнее.
Автор таки по-сложнее кейс реализует.
корум; SnubbyAston; +2 1 Ответить
4. Sergant 51 27.02.23 14:03 Сейчас в теме
(2) Так и знал что это скажут.
А перед вызовом сколько кода написано? На уровне днк языка или общих модулей :)
О тот как через сообщения пользователя 1С кидает уведомления о прогрессе выполнения задания - я молчу. Меня чуть не стошнило.

Работаем товарищи. Все что не может платформа 1С - Будем делать мы!
3. KUAvanesov 27.02.23 13:20 Сейчас в теме
(1) ну там еще синхронизация через каналы, мьютексы итп. Не так уж и просто все.
Но то что GO запустит 100500 горутин и не помрет а 1с 8-10 и больше не стоит - это факт).

PS все же хорошо, что 1с в бсп реализует то, что раньше приходилось писать самостоятельно, значит прислушиваются, присматриваются к коду, который пишут на 1с. Я вот уже привык использовать длительные операции, с отладкой удобно же сделали через "/РежимОтладки".
19. serg_gres 150 02.03.23 12:54 Сейчас в теме
(3)
Но то что GO запустит 100500 горутин и не помрет а 1с 8-10 и больше не стоит - это факт).


Хоть 100500, хоть миллиард, а если действия, которые производятся в фоне связаны с БД,
то 100500 потоков на GO не будут быстрее, чем 1С с ее 10-ю потоками.

Я надеюсь никто ведь не думает, что 100500 потоков GO одномоментно и мгновенно
способны произвести записи в таблицу SQL ?

Если в фоне нужно производить какие-то, например, вычисления в памяти,
то 1С однозначно будет проигрывать, потому что вся ее инфраструктура тяжеловесна
(это и динамическая типизация, и запуск полноценного сеанса в потоке и т.д. и т.п.).
Но таких задач в среде 1С не особенно то часто и бывает,
поэтому то, что сейчас реализовано в 1С - в максимальной степени отвечает сфере применения платформы.
И в этой среде конкуренты не то что лучше, они хуже 1С по совокупности параметров.
5. ImHunter 273 27.02.23 14:10 Сейчас в теме
(4) Нутк и сравнивать горутины с фоновыми заданиями 1С - мягко говоря, некорректно. Да, легкого аналога горутин в 1С нет.
8. alexey_kurdyukov 95 27.02.23 18:02 Сейчас в теме
А почему два потока в три раза быстрее одного? Я ожидал прирост где-то в 1.8.
starik-2005; echo77; +2 Ответить
10. starik-2005 2829 28.02.23 15:42 Сейчас в теме
(8)
А почему два потока в три раза быстрее одного?
Я вообще ожидал в 18 раз, но математика - не мое )))
egoriy111; +1 Ответить
11. alexey_kurdyukov 95 28.02.23 15:44 Сейчас в теме
(10) да почему в три раза-то, должно быть какое-то объяснение!
12. egoriy111 68 28.02.23 20:12 Сейчас в теме
(11)
на данном конкретном примере

Из возможных причин почему 3, хотя я тоже ожидал в районе двух: хороший сервак, с 12-ти ядерным процессором, на сервере работало в момент тестов 1,5 пользователя включая меня. Как именно там распределилась нагрузка - не знаю. Но есть куда копать
9. echo77 1725 27.02.23 19:50 Сейчас в теме
13. alexey_kurdyukov 95 01.03.23 03:13 Сейчас в теме
Можете повторить замеры, добавив выполнение работы синхронно, в том же потоке, без заданий?
egoriy111; +1 Ответить
17. egoriy111 68 01.03.23 20:48 Сейчас в теме
(13) Спасибо за идею, почему то такая очевидная вещь в голову не пришла) Действительно, правильнее сравнивать выполнение без фона, с 2мя и большим кол-вом потоков. Я запустил код для 1000 документов без фона и получил время выполнения 1.32 мин, это уже ближе к тому что ожидалось. Сделаю замеры для других и поправлю графики
18. ImHunter 273 02.03.23 10:05 Сейчас в теме
(14) Больше похоже на сравнение электросамоката с электропогрузчиком. Да, технически, можно что-то посравнивать. Но, практически, в таком сравнении нет никакого смысла.
22. soldatof 07.03.23 11:47 Сейчас в теме
А как же ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКомандуВФоне ? Кажется еще с БСП 3.1.4 есть.
24. Quantum81 6 12.04.23 11:23 Сейчас в теме
Огонь!
Стеб с GO считаю оправданным, т.к. уже пора все это выносить в платформу, а не колхозить на базе фоновых. Имхо.
Оставьте свое сообщение

См. также

Отправка счетов и актов за период из 1С:Бухгалтерии 3.0 программно с помощью функций БСП

БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 1С:Бухгалтерия 3.0 Россия Абонемент ($m)

Задача: обработкой сформировать печатные формы счетов и актов за период в 1С:Бухгалтерия 3.0, сохранить в папку на диске и отправить на электронную почту клиенту. Основная сложность этой задачи найти нужную функцию БСП, которая отвечает за формирование табличного документа печатной формы, и функцию, которая прикручивает к ней печать и подпись.

1 стартмани

23.05.2022    1586    lenastep    4    

5

Отчет на СКД с использованием форм из БСП. Варианты передачи списка значений в параметр СКД

БСП (Библиотека стандартных подсистем) СКД Платформа 1С v8.3 Система компоновки данных Конфигурации 1cv8 Россия Абонемент ($m)

Показаны способы передачи списка значений в значение по умолчанию параметра СКД типового отчета из БСП, с возможностью последующей модификации пользователем.

1 стартмани

20.04.2022    5232    eugene-p    8    

28

Решение ошибок "Нет кнопки Создать на основании" или "Задвоились пункты в меню Создать на основании"

БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 Абонемент ($m)

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

2 стартмани

30.08.2021    4143    Bor_ka    2    

14

Пример создания документа с движениями в ERP 2.5.7

БСП (Библиотека стандартных подсистем) Механизмы типовых конфигураций Платформа 1С v8.3 1С:ERP Управление предприятием 2 Россия Управленческий учет Абонемент ($m)

Пример создания документа с движениями в ERP 2.5.7, а также включение документа в основные подсистемы, а именно по управлению доступом, датам запрета изменения, контролю остатков, использованию характеристик и серий и прочее.

1 стартмани

10.08.2021    7767    maraty    12    

87

БСП. Подключаемые команды. Команды заполнения

БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Зарплата и Управление Персоналом 3.x Россия Абонемент ($m)

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

1 стартмани

11.05.2021    16096    kondrp    14    

89

Подсистема сложносочиненного версионирования

БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Статья описывает мою личную боль при работе в Управление холдингом, редакция 3.0, и может не совпадать с вашими ощущениями. Прощу учитывать, что это лишь мысленный эксперимент. В качестве эксперимента поставил себе задачу: "Как отслеживать изменения, для объектов, которые состоят из нескольких других объектов?".

1 стартмани

04.05.2021    1123    johnnyshut23    0    

5

История данных и БСП

БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

История данных от платформы и Версионирование объектов от БСП. Как мигрировать историю из подсистемы БСП и начать использовать функции платформы уже сейчас.

1 стартмани

09.06.2020    9483    zeegin    17    

57

Графики работы из БСП

БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Не очень давно на канале 1С:БСП была опубликована заметка по использованию Графиков работы и Календарных графиков.

1 стартмани

23.05.2019    5431    fenixnow    0    

13

Табличная часть из дополнительных реквизитов с обработкой событий в расширении

БСП (Библиотека стандартных подсистем) Механизмы типовых конфигураций Управляемые формы Конфигурации 1cv8 Абонемент ($m)

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

1 стартмани

13.05.2019    17326    mvxyz    18    

19

Пример настройки шаблонов и реализации печати отчетов в документ MS Word используя функциональную часть "Библиотеки Стандартных Подсистем 1С" (БСП)

БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Россия Абонемент ($m)

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

1 стартмани

23.04.2019    12413    olegpkc    13    

32

Использование подсистемы БСП "Заполнение объектов"

БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Абонемент ($m)

Применение механизмов БСП для добавления новых команд заполнения к формам различных объектов. Использование расширений конфигурации для доработки. Шаблоны для реализации собственных команд заполнения.

1 стартмани

23.11.2018    33664    ids79    29    

175

БСП: Дополнительная обработка (Регламенты) + Расширения, примеры от сложного к универсальному

БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Продолжение статьи «БСП: Дополнительная обработка (Регламенты), примеры от простого к сложному». Пойдем от финального примера той статьи и сделаем несколько шагов навстречу к универсальному решению.

2 стартмани

21.05.2018    22197    dsdred    17    

78

БСП: Дополнительная обработка (Регламенты), примеры от простого к сложному

БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Очень много попадается странных решений, которые можно решить через БСП:Дополнительные отчеты и обработки. Я бы вообще БСП из-за этой подсистемы переименовал в «Большое Спасибо Программистам». Поработаем с подсистемой в части написания регламентных заданий.

1 стартмани

10.05.2018    68068    dsdred    49    

322

Начало внедрения БСП в новую конфигурацию

БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Начало внедрения БСП 2.4.4.80. Первые "проблемы" и пути их решения. !!! UPD !!! Как подсказывают более умные коллеги в комментариях: необходимо использовать чистую конфигурацию БСП, которую можно найти в каталоге шаблонов конфигураций!!!

1 стартмани

24.11.2017    23734    Kim1C    18    

16

Использование механизма редактирования макетов БСП для внешних обработок

БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 1С:Бухгалтерия 3.0 Россия Абонемент ($m)

Небольшие изыскания по применению механизма редактирования внешних печатных форм для своих внешних обработок.

1 стартмани

24.11.2017    15989    Boneman    10    

44

Внешняя печатная форма с использованием БСП и вызовом клиентского метода

БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

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

1 стартмани

02.11.2017    30498    Andrew189100    15    

14

Как ускорить 1С – Многопоточная обработка данных

HighLoad оптимизация Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Чем будет для Вас полезна эта статья: • Вы изучите варианты ускорения операций обработки данных • Научитесь запускать в «1С:Предприятие 8» несколько потоков • Узнаете об ограничениях многопоточного режима в 1С

1 стартмани

17.10.2014    65434    36    Насипов Фарит    1    

133