Всем привет.
Поскольку в интернете нет (либо я не нашел/плохо искал) нигде полноценного описания создания регламентных задач на расширении (только на нем, без всяких внешних обработок), то решил поделиться своим опытом создания механизма для типовых конфигураций от начала до конца.
Структура хранения данных следующая:
1. В качестве объекта конфигурации, где мы будем плодить виды регламентных задач, выбрано одноименное перечисление, в котором у нас будут храниться виды регламентных заданий с их названиями
2. Для хранения настроек данного регламентного задания мы возьмем одноименный регистр сведений
Измерением выступает регламентное задание - ссылка на наше перечисление
Ресурсами: Использование (булево) - переключатель который отвечает за собственно работу регламентного задания
Расписание (ХранилищеЗначений) - информация о расписании выполнения регламентного задания (необязательно)
Идентификатор (Уникальный идентификатор) - Здесь сидит идентификатор самой регламентной задачи, которая была сгенерирована в момент записи в данном регистре. Вот этот реквизит по хорошему самый ВАЖНЫЙ здесь
3. Теперь собственно самое интересное: как уже выяснили выше, при записи в данном регистре у нас должно появляться новое регламентное задание. Для того чтоб это произошло, необходимо немного пописать, или хотя бы скопипастить
Процедура ПередЗаписью(Отказ, Замещение)
Для каждого Запись ИЗ ЭтотОбъект Цикл
Задание = РегламентныеЗаданияСервер.Задание(Запись.Идентификатор);
Если Задание = Неопределено Тогда
ПараметрыЗадания = Новый Структура;
ПараметрыЗадания.Вставить("Метаданные", Метаданные.РегламентныеЗадания.ЗапускДополнительныхОбработок);
ПараметрыЗадания.Вставить("Использование", Запись.Использование);
ПараметрыЗадания.Вставить("Наименование", Запись.РегламентноеЗадание);
ПараметрыЗадания.Вставить("Ключ", Запись.Идентификатор);
МассивПараметров = Новый Массив;
МассивПараметров.Добавить(Справочники.ДополнительныеОтчетыИОбработки.ПустаяСсылка());
МассивПараметров.Добавить(Запись.РегламентноеЗадание);
ПараметрыЗадания.Вставить("Параметры", МассивПараметров);
ПараметрыЗадания.Вставить("Расписание", Запись.Расписание.Получить());
Задание = РегламентныеЗаданияСервер.ДобавитьЗадание(ПараметрыЗадания);
Запись.Идентификатор = Задание.УникальныйИдентификатор;
Иначе
ПараметрыЗадания = Новый Структура;
ПараметрыЗадания.Вставить("Метаданные", Метаданные.РегламентныеЗадания.ЗапускДополнительныхОбработок);
ПараметрыЗадания.Вставить("Использование", Запись.Использование);
ПараметрыЗадания.Вставить("Наименование", Запись.РегламентноеЗадание);
ПараметрыЗадания.Вставить("Ключ", Запись.Идентификатор);
МассивПараметров = Новый Массив;
МассивПараметров.Добавить(Справочники.ДополнительныеОтчетыИОбработки.ПустаяСсылка());
МассивПараметров.Добавить(Запись.РегламентноеЗадание);
ПараметрыЗадания.Вставить("Параметры", МассивПараметров);
ПараметрыЗадания.Вставить("Расписание", Запись.Расписание.Получить());
РегламентныеЗаданияСервер.ИзменитьЗадание(Запись.Идентификатор, ПараметрыЗадания);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Прочитав код, вы наверняка догадались, что мы прикручиваемся к стандартному регламентному заданию "ЗапускДополнительныхОбработок", так как по смыслу оно ближе всех к нашей задаче из всей БСП. А также увидели, что здесь у нас создается регламентное задание, из которого Идентификатор присваивается нашему регистру для того, чтобы при дальнейшей перезаписи у нас изменялось созданное регламентное задание, а не генерировалось новое.
5. Следующим шагом нам надо в расширении подменить типовую процедуру, которая вызывается при запуске нашей регламентной задачи, для этого в модуле ДополнительныеОтчетыИОбработки с помощью расширения подменяем процедуру ВыполнитьОбработкуПоРегламентномуЗаданию:
&Вместо("ВыполнитьОбработкуПоРегламентномуЗаданию")
Процедура Лот_ВыполнитьОбработкуПоРегламентномуЗаданию(ВнешняяОбработка, ИдентификаторКоманды)
Если ТипЗнч(ИдентификаторКоманды) = Тип("ПеречислениеСсылка.ЛР_РегламентныеЗаданияРасширения") Тогда
Если ИдентификаторКоманды = Перечисления.ЛР_РегламентныеЗаданияРасширения.РегламентноеЗадание1 тогда
ЛР_РегламентныеЗадания.ВыполнитьРегламентнуюЗадачу1Расширения();
КонецЕсли;
Иначе
ПродолжитьВызов(ВнешняяОбработка, ИдентификаторКоманды);
КонецЕсли;
КонецПроцедуры
Каждый раз, соответственно, дополняя очередную регламентную задачу в перечислении, здесь необходимо тоже будет добавить ссылку на свою процедуру.
6. Для удобства я использовал отдельную подсистему в расширении, чтоб вывести туда кнопку для настройки регламентных задач:
На форме записи регистра можно сразу управлять расписанием выполнения задачи в пользовательском режиме. Как сделать диалог расписания, расписывать здесь уже не буду, так как наверняка есть множество тем на этот счет, не является обязательным для работоспособности, да и не относится это к теме
На выходе соответственно мы можем управлять нашим регламентным заданием в стандартной обработке:
Разработка велась на УТ11.5 (БСП 3.1.3.548), но думаю что подойдет для любой актуальной базы на БСП
В приложенном файле вы увидите рабочий вариант расширения с регламентной задачей из статьи, который (или с которым) можно накатить, в том числе, на свое расширение, сохранив себе от полудня времени и нервов, в зависимости от Вашей квалификации.
Спасибо за внимание! И надеюсь, что в скором времени мы увидим полноценный типовой функционал регламентных задач в расширениях, без всяких обходных путей =)
upd: В версии 1.1.5.1 расширения
- при копировании записи в регистре ЛР_ПараметрыРегламентныхЗаданий не обнулялся идентификатор регламентного задания, в связи с чем новая настройка была связана со старой регламентной задачей - исправлено
- при удалении записи из регистра ЛР_ПараметрыРегламентныхЗаданий не удалялась запись из регламентных заданий информационной базы - исправлено