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



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

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

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

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

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

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

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

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

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

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

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

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

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

12 Comments

  1. Evil Beaver

    Правильно ли я понимаю, что это тот же МенеджерЗаданий, только другой?

    https://github.com/wizi4d/TaskManagerFor1C

    Reply ↓
  2. user700035_6550355

    Полезная программка

    Reply ↓
  3. m-rv

    (1) Да, есть что-то общее

    Reply ↓
  4. Bassgood

    (0) А почему бы не вынести исполняемый фоновыми заданиями код в справочник, дабы не обновлять каждый раз конфигурацию при появлении новых алгоритмов, требующихся выполнять в фоновом режиме (например, как это реализовано в типовых конфигурациях — возможность запуска обработок из справочника «Дополнительные отчеты и обработки» в фоновом режиме)?

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

    Reply ↓
  5. Evil Beaver

    (4) Берете этот код, либо, приведенный мной по ссылке выше, впиливаете туда эту возможность, делитесь с обществом. Профит.

    Reply ↓
  6. Bassgood

    (5) К сожалению, нет свободного времени для допиливания, хотелось бы иметь в наличии готовое, понятное и гибкое решение 🙂

    Reply ↓
  7. Evil Beaver

    (6) Ну вот так всегда. Как решение иметь — так все хотят, а как сделать, так времени нет. Можно подумать, что у товарища топикстартера времени вагон на предусматривание всех возникающих хотелок заранее.

    Человек сделал для себя, выложил — пользуйтесь. А вы ему «а почему не вынести?» Да можно вынести, в чем вопрос, вот только полагаю, ему это не надо было.

    Reply ↓
  8. Bassgood

    (7) Я просто подбросил идею для развития разработки, без каких-либо претензий к автору, возможно у него есть в планах дальнейшая ее модернизация. А по поводу готового решения я это к тому, что если сделать его более гибким, то желающих скачать его будет намного больше.

    Reply ↓
  9. abadonna83

    Нам очень нравится. Скажите а под обычные формы есть?

    Очень надо.

    Есть идея совместить вашу обработку с асинхронной записью регистров в документе «Расчет себестоимости».

    Reply ↓
  10. m-rv

    (9)

    под обычные нету, но если захотите допилить — в принципе работы не много

    Reply ↓
  11. abadonna83

    Была бы очень признательна. Выложите пожалуйста под обычную форму.

    Reply ↓
  12. m-rv

    (11)

    я имел ввиду захотите своими силами допилить 🙂

    Reply ↓

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *