Многопоточность в 1С:Предприятие 8.x

16 января 2013

Предисловие

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

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

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

Описание функций

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

Определим общий функционал, который необходим для примера нескольких потоков обработки данных. Создадим общую форму "Многопоточность", в которой по команде "ЗапуститьНесколькоПотоков" будет запускаться три фоновых задачи:

  1. Заполнение справочника "Товары" пятью тысячами элементов.
  2. Заполнение справочника "Комплектующие" пятью тысячами элементов.
  3. Запись в регистр сведений "СлучайноеЧисло" в ресурс "Число" некоторого случайного значения в диапазоне от 0 до 10.

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

Основная форма для демонстрации многопоточности

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

В конфигураторе

Опишем в общих чертах используемые объекты метаданных. Во-первых, это справочники "Товары" и "Комплектующие". Используемые справочники

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

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

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

Программный код для создания фонового задания

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

Функции для поиска выполняемых фоновых заданий по ключу

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

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

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

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

После инициализации фонового задания выполняется алгоритм заполнения справочника "Комплектующие", приведенный на следующем скриншоте.

Процедура заполнения справочника "Комплектующие"

Программный код очень простой: создается 5000 элементов в цикле, где каждому новому элементу в наименование добавляется номер в порядке создания. Если элемент с таким наименованием уже существует, то запись не производится.

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

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

Завершение работы фонового задания

Обо всех классах, свойствах и методах для работы с фоновыми заданиями Вы можете посмотреть в синтаксис-помощники и по ссылке.

Сейчас перейдем к рассмотрению работы примера в пользовательском режиме.

Что увидит пользователь?

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

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

При этом пользователь может продолжать работать с программой не ожидая завершения операций.

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

ФОРМИРОВАНИЕ ОТЧЕТОВ

 

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

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

За формирование отчета в фоновом режиме отвечает параметр "РежимКомпоновкиРезультата" в методе "СкомпоноватьРезультат" для расширения управляемой формы отчета. Запустить в фоновом режиме формирование отчета вне управляемой формы мне не удалось.

Вывод

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

Их применение не ограничивается отчетами и обработками. Их можно использовать и в других объектах системы, например в подборе номенклатуры, чтобы во время поиска товара в базе пользователь смог продолжать параллельную работу с 1С:Предприятие 8.x.


comments powered by Disqus