Назначение подсистемы проще всего объяснить на примере расчета себестоимости. Представьте: 100.000 позиций номенклатуры. По каждой нужно расчитать себестоимость, при этом расчет по одной позиции никак не зависит от результатов расчета по другой. Вырисовываются следующие варианты:
- Запустить последовательную обработку и 7 процессоров сервера будут курить бамбук, пока один считает себестоимость.
- Запустить параллельную обработку и долго и упорно пилить сценарии балансировки, перезапуска при ошибках и т.п.
Здесь то и приходит на помощь Менеджер фоновых заданий. В рамках разработки расчета себестоимости нам придется написать две экспортные функции в общем модуле:
- ПолучитьНоменклатуруДляРасчетаСебестоимости() - эта функция должна возвращать массив структур с ключами Разделитель (строка36) и Синоним (строка100). В поле Разделитель мы помещаем формальное значение, в рамках которого будем потом выполнять задания. В нашем случае это будет УИД номенклатуры, приведенный к строке. В поле Синоним требуется поместить синоним разделителя, который будет выводиться в пользовательский интерфейс. В нашем случае это может быть наименование номенклатуры.
- ВыполнитьРасчетСебестоимостиПоНоменклатуре(Разделитель, ДополнительныеПараметры) - эта процедура должна выполнять расчет себестоимости. На вход ей подаются: Разделитель (строка36) - формальное значение, в рамках которого выполняется разделение, в нашем случае УИД номенклатуры и ДополнительныеПараметры - структура, ключ и значение которой мы задаем в пользовательском интерфейсе.
Далее необходимо в пользовательском интерфейсе создать фоновое задание, настроить расписания (оно может быть не одно, т.е. по четвергам можно запускать в 03:00, а по субботам в 04:00), задать ограничение по количеству потоков, действия при ошибке и написать имена процедур. Далее, Менеджер фоновых заданий будет запускать расчет себестоимости в соответствии с указанными настройками.
Естественно, возможности менеджера не ограничиваются приведенным примером. Можно управлять обменами данных, запусками алгоритмов, формированием отчетов и т.п. Главное выдерживать основной принцип: Определение формального разделителя -> Запуск обработки по значению разделителя.
Если в вашем конкретном случае вы не можете выявить один разделитель, а обработку требуется проводить по паре (тройке, четверке...) параметров (например номеналутра-склад) - можно применить следующий подход:
- Создаете свой регистр сведений в котором склад и номенклатура - измерения, разделитель - ресурс
- В функции получения разделителей определяете те пары номенклатура - склад по которым вы хотите вести обработку и запишите эти пары в регистр, формируя при этом новые иентификаторы. Эти новые идентификаторы (строковые представления) возвращайте Менеджеру.
- В процедуре выполнения принимайте на вход идентификатор, ищите его в регистре - получаете пару номенклатура - склад
При этом, возникает вопрос как не отправить дважды один и тот же идентификатор, как при этом гарантировать его получение менеджером и как понять когда идентификатор больше не нужен и можно почистить регистр. Для этого требуется написать две процедуры и указать их полные имена в соответствующих реквизитах фонового задания:
- ПриПолученииРазделителя(Разделитель) - Менеджер вызовет эту процедуру с соответствующим значением разделителя, когда разделитель будет гарантировано им получен. В этой процедуре можно установить на соответствующую запись регистра флаг "больше не отправлять".
- ПриУспешномВыполнении(Разделитель) - Менеджер вызовет эту процедуру с соответствующим значением разделителя, когда обработка этого разделителя будет завершена. В этой процедуре можно удалить запись из нашего регистра.
Менеджер фоновых заданий можно так же использовать без разделителя, если по каким-то причинам вы хотите управлять однопоточной фонофой обработкой с помощью этого менеджера.
Менеджер поставляется в виде поставки конфигурации, код открыт. В общем модуле ФоновыеЗаданияСервер после комментария "/// тестовые функции" приведены примеры написания процедур для работы с Менеджером. При внедрении в относительно свежие типовые модуль ОбщегоНазначенияКлиент не включать в объединение; при внедрении в старые типовые или самописные - смотреть по месту.