Когда регламентное задание не то, чем оно кажется. УНФ 1.6

Когда программисты используют объекты не для того, чего они предназначены «природой», у других программистов может возникнуть шок и не понимание.

Создал простое правило рабочего процесса:

Меняю состояние заказа, ничего не происходит. Правило не отрабатывает.

Думаю — ага, нужно проверить регламентное задание » Обработка правил рабочих процессов», может оно не включено. Смотрю — и точно, такого регламентного задания нет. И создать его вручную нельзя — нет такого задания в списке доступных для работы.

Самое удивительное, что в копии базы, где я ранее отлаживал, это задание есть.

Ну что же, расчехляю код-хаммер и пишу код по созданию этого задания:

РЗ = РегламентныеЗадания.СоздатьРегламентноеЗадание(Метаданные.РегламентныеЗадания.ОбработкаПравилРабочихПроцессов);
РЗ.Использование = ложь;
РЗ.Записать();

Задание создается, назначаю ему расписание:

Запускаю — ничего не происходит, почта не отправляется. Что же это такое думаю? Само регламентное задание выполняется с ошибкой, причем это архитектурная ошибка, а не Run-time:

И тут до меня доходит, что правило рабочего процесса не включено. Включаю его, но при попытке изменить состояние заказа теперь получаю ошибку:

28.07.2021 18:32:39
Индекс находится за границами массива
{Документ.ЗаказПокупателя.Форма.ФормаДокумента.Форма(3210)}:    Записать(ПараметрыЗаписи);

по причине:
Ошибка при выполнении обработчика - 'ПриЗаписи'
по причине:
Индекс находится за границами массива
{ОбщийМодуль.РабочиеПроцессы.Модуль(138)

Смотрю код и понимаю, что нужно очистить регламентные задания, вот тут то до меня и дошло, что программисты УНФ использовали регламентные задания не по назначению.

Пришлось написать код по удалению заданий:

СписокЗаданий = РегламентныеЗаданияСервер.НайтиЗадания(Новый Структура("Метаданные", Метаданные.РегламентныеЗадания.ОбработкаПравилРабочихПроцессов));
Для Каждого Задание ИЗ СписокЗаданий Цикл
	Сообщить(Задание);
	Задание.Удалить();
КонецЦикла;

После этого все заработало.

А ведь если бы я не ошибся с галочкой включенного правила, то не пошел бы по этому пути и не узнал бы об этом.

В УНФ такие задания похоже, используются широко. Вот пример регламентного задания, где обработчики оставили метод пустым:

А вот для регламентного задания «Обработка правил рабочих процессов» сделали метод, который заранее не рабочий, если выполнять из регламентного задания, потому что содержит один метод:

В общем, архитектура УНФ так хитро составлена, что можно ошибиться даже знатоку. Будьте бдительны!

Недостатком в 1С в данном случае является возможность недокументированного использования регламентных заданий, которая вводит в заблуждение.

Среда: УНФ 1.6.20.189.

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

Добавить комментарий

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