Ведется логирование работы фоновых, перезапуск в случае ошибки, ограничение по общему количеству потоков и по количеству потоков конкретного задания.
Для контроля работы предусмотрен монитор фоновых заданий, в который выводятся статусы выполнения.
Назначение подсистемы проще всего объяснить на примере расчета себестоимости. Представьте: 100.000 позиций номенклатуры. По каждой нужно расчитать себестоимость, при этом расчет по одной позиции никак не зависит от результатов расчета по другой. Вырисовываются следующие варианты:
- Запустить последовательную обработку и 7 процессоров сервера будут курить бамбук, пока один считает себестоимость.
- Запустить параллельную обработку и долго и упорно пилить сценарии балансировки, перезапуска при ошибках и т.п.
Здесь то и приходит на помощь Менеджер фоновых заданий. В рамках разработки расчета себестоимости нам придется написать две экспортные функции в общем модуле:
- ПолучитьНоменклатуруДляРасчетаСебестоимости() — эта функция должна возвращать массив структур с ключами Разделитель (строка36) и Синоним (строка100). В поле Разделитель мы помещаем формальное значение, в рамках которого будем потом выполнять задания. В нашем случае это будет УИД номенклатуры, приведенный к строке. В поле Синоним требуется поместить синоним разделителя, который будет выводиться в пользовательский интерфейс. В нашем случае это может быть наименование номенклатуры.
- ВыполнитьРасчетСебестоимостиПоНоменклатуре(Разделитель, ДополнительныеПараметры) — эта процедура должна выполнять расчет себестоимости. На вход ей подаются: Разделитель (строка36) — формальное значение, в рамках которого выполняется разделение, в нашем случае УИД номенклатуры и ДополнительныеПараметры — структура, ключ и значение которой мы задаем в пользовательском интерфейсе.
Далее необходимо в пользовательском интерфейсе создать фоновое задание, настроить расписания (оно может быть не одно, т.е. по четвергам можно запускать в 03:00, а по субботам в 04:00), задать ограничение по количеству потоков, действия при ошибке и написать имена процедур. Далее, Менеджер фоновых заданий будет запускать расчет себестоимости в соответствии с указанными настройками.
Естественно, возможности менеджера не ограничиваются приведенным примером. Можно управлять обменами данных, запусками алгоритмов, формированием отчетов и т.п. Главное выдерживать основной принцип: Определение формального разделителя -> Запуск обработки по значению разделителя.
Если в вашем конкретном случае вы не можете выявить один разделитель, а обработку требуется проводить по паре (тройке, четверке…) параметров (например номеналутра-склад) — можно применить следующий подход:
- Создаете свой регистр сведений в котором склад и номенклатура — измерения, разделитель — ресурс
- В функции получения разделителей определяете те пары номенклатура — склад по которым вы хотите вести обработку и запишите эти пары в регистр, формируя при этом новые иентификаторы. Эти новые идентификаторы (строковые представления) возвращайте Менеджеру.
- В процедуре выполнения принимайте на вход идентификатор, ищите его в регистре — получаете пару номенклатура — склад
При этом, возникает вопрос как не отправить дважды один и тот же идентификатор, как при этом гарантировать его получение менеджером и как понять когда идентификатор больше не нужен и можно почистить регистр. Для этого требуется написать две процедуры и указать их полные имена в соответствующих реквизитах фонового задания:
- ПриПолученииРазделителя(Разделитель) — Менеджер вызовет эту процедуру с соответствующим значением разделителя, когда разделитель будет гарантировано им получен. В этой процедуре можно установить на соответствующую запись регистра флаг «больше не отправлять».
- ПриУспешномВыполнении(Разделитель) — Менеджер вызовет эту процедуру с соответствующим значением разделителя, когда обработка этого разделителя будет завершена. В этой процедуре можно удалить запись из нашего регистра.
Менеджер фоновых заданий можно так же использовать без разделителя, если по каким-то причинам вы хотите управлять однопоточной фонофой обработкой с помощью этого менеджера.
Менеджер поставляется в виде поставки конфигурации, код открыт. В общем модуле ФоновыеЗаданияСервер после комментария «/// тестовые функции» приведены примеры написания процедур для работы с Менеджером. При внедрении в относительно свежие типовые модуль ОбщегоНазначенияКлиент не включать в объединение; при внедрении в старые типовые или самописные — смотреть по месту.
Правильно ли я понимаю, что это тот же МенеджерЗаданий, только другой?
Полезная программка
(1) Да, есть что-то общее
(0) А почему бы не вынести исполняемый фоновыми заданиями код в справочник, дабы не обновлять каждый раз конфигурацию при появлении новых алгоритмов, требующихся выполнять в фоновом режиме (например, как это реализовано в типовых конфигурациях — возможность запуска обработок из справочника «Дополнительные отчеты и обработки» в фоновом режиме)?
p.s. Допустим мне требуется выполнить какой-то разовый алгоритм и я хочу запустить его на выполнение по расписанию ночью — в этом случае «карячить» конфу ради этого будет совсем не айс, если такая возможность вообще имеется.
(4) Берете этот код, либо, приведенный мной по ссылке выше, впиливаете туда эту возможность, делитесь с обществом. Профит.
(5) К сожалению, нет свободного времени для допиливания, хотелось бы иметь в наличии готовое, понятное и гибкое решение 🙂
(6) Ну вот так всегда. Как решение иметь — так все хотят, а как сделать, так времени нет. Можно подумать, что у товарища топикстартера времени вагон на предусматривание всех возникающих хотелок заранее.
Человек сделал для себя, выложил — пользуйтесь. А вы ему «а почему не вынести?» Да можно вынести, в чем вопрос, вот только полагаю, ему это не надо было.
(7) Я просто подбросил идею для развития разработки, без каких-либо претензий к автору, возможно у него есть в планах дальнейшая ее модернизация. А по поводу готового решения я это к тому, что если сделать его более гибким, то желающих скачать его будет намного больше.
Нам очень нравится. Скажите а под обычные формы есть?
Очень надо.
Есть идея совместить вашу обработку с асинхронной записью регистров в документе «Расчет себестоимости».
(9)
под обычные нету, но если захотите допилить — в принципе работы не много
Была бы очень признательна. Выложите пожалуйста под обычную форму.
(11)
я имел ввиду захотите своими силами допилить 🙂