# TaskManagerFor1C Библиотека TaskManagerFor1C предназначена для создания асинхронных и параллельных алгоритмов с гарантированным выполнением в среде 1С Предприятия на базе фоновых заданий. Файлы поставки доступны на [закладке с релизами](https://github.com/wizi4d/TaskManagerFor1C/releases). ## Цели TaskManagerFor1C: - Повышение производительности программных продуктов за счет добавления параллелелизма в программный код; - Повышение продуктивности разработчиков за счет упрощения работы по управлению заданиями. ## Область применения - Использование параллельных вычислений в автоматизации бизнес процессов; - Параллельное выполнение запросов в долгих отчетах/обработках; - Процессы загрузки/выгрузки данных; - Организация нагрузочного тестирования. ## Принцип работы ![Принцип работы](http://habrastorage.org/files/5a9/1b4/cbd/5a91b4cbd08a427e939c578a228404ab.jpg) ## Настройка Для настройки нужно использовать обработку "Управление менеджером заданий". ![Управление менеджером заданий](http://habrastorage.org/files/d04/5c7/e46/d045c7e46e23479a9bb25ccbc9b996fc.JPG "Настройки менеджера заданий") Доступные настройки: - Ограничение на количество исполнителей - для балансировки нагрузки на сервер 1С. Принимает значение от 0 до 9999. При значении 0 задания в работу браться не будут. - Глубина хранения истории (дни) - если указано значение отличное от 0, тогда подсистема сама будет чистить информацию по старым выполненным заданиям оставляя последние N дней указанных в настройке. Запуск подсистемы, остановка и очистка очереди выполняется верхними, говорящими за себя кнопками. В качестве индикатора работы подсистемы выступает флаг `Менеджер запущен`. При нажатии на кнопку с шестеренкой (рядом с кнопкой `Все действия`) открываются настройки методов-обработчиков: - Максимальное количество попыток выполнения - при достижении лимита на количество попыток выполнения задание будет автоматически отменяться; - Пауза перед новой попыткой выполнения - время отсрочки повторного запуска в секундах. В качестве отправной точки отсчета используется время начала неудачной попытки выполнения. Если НачалоВыполнения + ПаузаПередНовойПопыткой > текущего времени, то задание ставится на паузу. Когда НачалоВыполнения + ПаузаПередНовойПопыткой становится <= текущему времени, задание с паузы снимается; - Максимальное количество исполнителей - персональное ограничение метода-обработчика на количество исполнителей; - Приоритет метода-обработчика - задания с максимальным приоритетом всегда выдаются из очереди первыми. ## Жизненный цикл задания ![Жизненный цикл задания](http://habrastorage.org/files/ed3/7ea/ad2/ed37eaad2354433dae857376e8eef7a7.jpg) ## Программный интерфейс #### ДобавитьЗадание(ИмяМетода, Параметры) Добавляет новое задание в очередь. На задания в очереди распространяется ограничение на количество одновременно работающих исполнителей. Параметры: ИмяМетода - точка входа для выполнения задания. Сигнатура метода должна быть с одним параметром, например, МетодЗадания(Параметры). Параметры - структура содержащая необходимые входные данные, для выполнения задания. При добавлении расширяется свойством "КлючЗадания", значением которого будет идентификатор задания в очереди. Возвращает: Идентификатор задания. #### ДобавитьЗаданиеВнеОчереди(ИмяМетода, Параметры) Запускает асинхронное выполнение задания минуя очередь. >*На такие задания ограничение на количество исполнителей НЕ распространяется, НО квота используется* Параметры: ИмяМетода - точка входа для выполнения задания. Сигнатура метода должна быть с одним параметром, например, МетодЗадания(Параметры). Параметры - структура содержащая необходимые входные данные, для выполнения задания. При добавлении расширяется свойством "КлючЗадания", значением которого будет идентификатор задания в очереди. Возвращает: Идентификатор задания. #### ПолучитьСостояниеЗадания(КлючЗадания) Позволяет получить текущее состояние задания. Параметры: КлючЗадания - идентификатор задания. Возвращает: Состояние задания. #### ОжидатьСостояниеЗадания(КлючЗадания, ОжидаемоеСостояние, Таймаут = 5) Усыпляет текущий поток до установления указанного состояния у задания либо до истечения указанного времени. Параметры: КлючЗадания - идентификатор задания. ОжидаемоеСостояние - состояние, которого хотим дождаться. Таймаут - максимальное время ожидания, сек. Возвращает: Истина, если состояния дождались иначе Ложь. #### ОжидатьИзмененияСостояния(КлючЗадания, ТекущееСостояние, Таймаут = 5) Усыпляет текущий поток до изменения состояния у задания с указанного на любое другое либо до истечения указанного времени. Параметры: КлючЗадания - идентификатор задания. ТекущееСостояние - состояние с которого хотим уйти. Таймаут - максимальное время ожидания, сек. Возвращает: Истина, если состояния дождались иначе Ложь. #### ДождатьсяВыполнения(КлючиЗаданий, Таймаут = 5) Усыпляет текущий поток до выполнения указанного списка заданий либо до истечения указанного времени. Параметры: КлючиЗаданий - массив с идентификаторами заданий. ТекущееСостояние - состояние с которого хотим уйти. Таймаут - максимальное время ожидания, сек. Возвращает: Истина, если состояния дождались иначе Ложь. #### ОтменитьЗадание(КлючЗадания) Отменяет задание, если оно находится в состоянии Ожидает. Параметры: КлючЗадания - идентификатор задания. #### ОтменитьВсеЗаданияВОчереди() Отменяет все задания в состоянии Ожидает и НаПаузе. #### СократитьИсториюВыполненияЗаданий( ТребуемаяГлубинаИсторииВДнях) Очищает информацию по старым выполненным заданиям оставляя последнее указанное количество дней. Предназначен для "ручного" управления историей выполнения заданий. Параметры: ТребуемаяГлубинаИсторииВДнях - количество дней истории, которые необходимо оставить.