Многопоточные фоновые задания

Администрирование - Системное

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

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

  1. Запустить последовательную обработку и 7 процессоров сервера будут курить бамбук, пока один считает себестоимость.
  2. Запустить параллельную обработку и долго и упорно пилить сценарии балансировки, перезапуска при ошибках и т.п.

Здесь то и приходит на помощь Менеджер фоновых заданий. В рамках разработки расчета себестоимости нам придется написать две экспортные функции в общем модуле:

  1. ПолучитьНоменклатуруДляРасчетаСебестоимости() - эта функция должна возвращать массив структур с ключами Разделитель (строка36) и Синоним (строка100). В поле Разделитель мы помещаем формальное значение, в рамках которого будем потом выполнять задания. В нашем случае это будет УИД номенклатуры, приведенный к строке. В поле Синоним требуется поместить синоним разделителя, который будет выводиться в пользовательский интерфейс. В нашем случае это может быть наименование номенклатуры.
  2. ВыполнитьРасчетСебестоимостиПоНоменклатуре(Разделитель, ДополнительныеПараметры) - эта процедура должна выполнять расчет себестоимости. На вход ей подаются: Разделитель (строка36) - формальное значение, в рамках которого выполняется разделение, в нашем случае УИД номенклатуры и ДополнительныеПараметры - структура, ключ и значение которой мы задаем в пользовательском интерфейсе.

Далее необходимо в пользовательском интерфейсе создать фоновое задание, настроить расписания (оно может быть не одно, т.е. по четвергам можно запускать в 03:00, а по субботам в 04:00), задать ограничение по количеству потоков, действия при ошибке и написать имена процедур. Далее, Менеджер фоновых заданий будет запускать расчет себестоимости в соответствии с указанными настройками.

Естественно, возможности менеджера не ограничиваются приведенным примером. Можно управлять обменами данных, запусками алгоритмов, формированием отчетов и т.п. Главное выдерживать основной принцип: Определение формального разделителя -> Запуск обработки по значению разделителя.

Если в вашем конкретном случае вы не можете выявить один разделитель, а обработку требуется проводить по паре (тройке, четверке...) параметров (например номеналутра-склад) - можно применить следующий подход:

  1. Создаете свой регистр сведений в котором склад и номенклатура - измерения, разделитель - ресурс
  2. В функции получения разделителей определяете те пары номенклатура - склад по которым вы хотите вести обработку и запишите эти пары в регистр, формируя при этом новые иентификаторы. Эти новые идентификаторы (строковые представления) возвращайте Менеджеру.
  3. В процедуре выполнения принимайте на вход идентификатор, ищите его в регистре - получаете пару номенклатура - склад

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

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

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

Менеджер поставляется в виде поставки конфигурации, код открыт. В общем модуле ФоновыеЗаданияСервер после комментария "/// тестовые функции" приведены примеры написания процедур для работы с Менеджером. При внедрении в относительно свежие типовые модуль ОбщегоНазначенияКлиент не включать в объединение; при внедрении в старые типовые или самописные - смотреть по месту.

Скачать файлы

Наименование Файл Версия Размер
Многопоточные фоновые задания:
.cf 83,51Kb
02.08.17
20
.cf 83,51Kb 20 Скачать

См. также

Комментарии
1. Андрей Овсянкин (Evil Beaver) 5103 02.08.17 12:43 Сейчас в теме
Правильно ли я понимаю, что это тот же МенеджерЗаданий, только другой?

https://github.com/wizi4d/TaskManagerFor1C
3. Роман М (m-rv) 449 02.08.17 13:25 Сейчас в теме
2. Нурбол Темиргалиев (user700035_6550355) 14 02.08.17 12:46 Сейчас в теме
4. Алексей Драчков (Bassgood) 777 02.08.17 13:33 Сейчас в теме
(0) А почему бы не вынести исполняемый фоновыми заданиями код в справочник, дабы не обновлять каждый раз конфигурацию при появлении новых алгоритмов, требующихся выполнять в фоновом режиме (например, как это реализовано в типовых конфигурациях - возможность запуска обработок из справочника "Дополнительные отчеты и обработки" в фоновом режиме)?
p.s. Допустим мне требуется выполнить какой-то разовый алгоритм и я хочу запустить его на выполнение по расписанию ночью - в этом случае "карячить" конфу ради этого будет совсем не айс, если такая возможность вообще имеется.
5. Андрей Овсянкин (Evil Beaver) 5103 02.08.17 15:31 Сейчас в теме
(4) Берете этот код, либо, приведенный мной по ссылке выше, впиливаете туда эту возможность, делитесь с обществом. Профит.
sergelemon; Сурикат; izidakg; +3 Ответить
6. Алексей Драчков (Bassgood) 777 02.08.17 16:25 Сейчас в теме
(5) К сожалению, нет свободного времени для допиливания, хотелось бы иметь в наличии готовое, понятное и гибкое решение :)
7. Андрей Овсянкин (Evil Beaver) 5103 02.08.17 17:59 Сейчас в теме
(6) Ну вот так всегда. Как решение иметь - так все хотят, а как сделать, так времени нет. Можно подумать, что у товарища топикстартера времени вагон на предусматривание всех возникающих хотелок заранее.

Человек сделал для себя, выложил - пользуйтесь. А вы ему "а почему не вынести?" Да можно вынести, в чем вопрос, вот только полагаю, ему это не надо было.
8. Алексей Драчков (Bassgood) 777 02.08.17 18:32 Сейчас в теме
(7) Я просто подбросил идею для развития разработки, без каких-либо претензий к автору, возможно у него есть в планах дальнейшая ее модернизация. А по поводу готового решения я это к тому, что если сделать его более гибким, то желающих скачать его будет намного больше.
9. Abadonna Abadonna (abadonna83) 30 07.09.17 16:20 Сейчас в теме
Нам очень нравится. Скажите а под обычные формы есть?
Очень надо.

Есть идея совместить вашу обработку с асинхронной записью регистров в документе "Расчет себестоимости".
10. Роман М (m-rv) 449 07.09.17 16:56 Сейчас в теме
(9)
под обычные нету, но если захотите допилить - в принципе работы не много
11. Abadonna Abadonna (abadonna83) 30 07.09.17 17:04 Сейчас в теме
Была бы очень признательна. Выложите пожалуйста под обычную форму.
12. Роман М (m-rv) 449 08.09.17 06:49 Сейчас в теме
(11)
я имел ввиду захотите своими силами допилить :)
Оставьте свое сообщение