Введение
Данная обработка является относительно простым примером и одновременно шаблоном для разработки подобных многопоточных обработок. Разрабатывалось для того чтобы каждый, не вдаваясь в подбробности, смог сделать свою обработку по образу и подобию.
Будет работать только в конфигурациях, где интегрирована БСП, только в управляемых формах и только в клиент-серверном варианте
Важно! Если у вас сервер 1С и компьютер на котором вы запускаете 1С это разные машины, то обработку надо установить во внешние обработки.
Принцип многопоточной обработки
- Получаем массив ВСЕХ объектов для обработки;
- Разбиваем этот массив на порции(Массивы) согласно входящим параметрам;
- Для каждой порции запускаем свое фоновое задание, которое будет выполнять экспортный метод ОбработатьОбъекты();
- Фоновые задания отправляют сообщения фиксированного формата;
- Ждем завершения выполнения фоновых заданий;
- Проверяем статусы запущенных фоновых заданий, читаем сообщения;
- Отправляем свои сообщения основному потоку;
- В самом конце складываем итоговый результат работы всех ФЗ в АдресРезультата.
Что в примере
В качестве примера обработка, которая выбирает все записи из справочника Контрагенты и обрабатывает их наименования. После обработки каждого элемента транзакция откатывается, в результате ничего не меняется в базе данных
В динамике это выглядит примерно так
Как сделать свою обработку на основе этой
Порядок такой
- Копируем эту обработку. В метаданных меняем её имя и синоним;
- Добавляем реквизиты в обработку
Форма
- Разместить на форме параметры выборки объектов / процедуры для формирования готового списка объектов для обработки. В примере это ЗаполнитьДаннымиДляТеста();
- В функции ПараметрыОбработки() складываем в одноименную структуру все параметры, что потребуются для обработки объектов;
- В процедуре ОбработатьРезультатВыполнения() - можно выполнять дополнительные действия с результатом выполнения обработки.
Модуль
- В функции Объекты() определить алгоритм получения ВСЕХ объектов для обработки. Здесь два варианта:
- Просто транслировать то что передано с формы в параметр ДанныеДляОбработки;
- Заполнить на сервере по входящим параметрам;
- Функция РазбитьНаПорции() содержит два алгоритма разбиения коллекции объектов на порции. Я оставил рабочим алгоритм "Чередование", т.к. мне кажется он более приближен к последовательной обработке. Вы можете описать здесь свой;
- В процедуре ВыполнитьМногопоточно() в самом конце складываем итоговый результат работы, если результат складывает НЕ в ТЗ то дорабатываем эту процедуру. В противном случае, здесь ничего не трогаем;
- В процедуре ОбработатьОбъекты() описываем свой алгоритм обработки в области Обработка_Объекта.
Как отлаживать обработку
Поскольку есть особенности связанные с клиент-серверным вариантом работы, то в случае, если Сервер 1С:Предприятие расположен на другом компьютере, то единственным выходом будет разместить эту обработку (на этапе отладки) в сетевой папке, доступной серверу 1С:Предприятие.
Так же на форме расположены вспомогательные команды, служащие исключительно для отладки
- Выполнить без фоновых заданий – запускает управляющую процедуру в основном потоке. Пригодится для отладки ВыполнитьМногопоточно(), Объекты(), РазбитьНаПорции();
- Обработать объекты не в фоне – служит для отладки ОбработатьОбъекты()
Тестировалось на платформах 8.3.18.1957, 8.3.21
Конфигурации: КА 2.5.7.402, УХ 3.0
Материалы по теме
- Многопоточная обработка данных
- Многопоточная обработка данных на примере перепроведения документов
- Универсальный шаблон многопоточной обработки (на примере проверки работы Web-сервисов)
- Параллельная обработка (в несколько потоков - сеансов
- Многопоточная обработка документов БП3.0, КА2, (ERP с небольшим ограничением). Ускоряет основные процессы учета: проведение документов и другие массовые процедуры методом многопоточности
- Простая параллельная обработка данных
- Многопоточный режим выполнения процедуры с помощью методов БСП - примеры разработки