Неочевидная особенность фоновых заданий

15.10.24

Разработка - Механизмы платформы 1С

Некоторые наблюдения по поводу использования свойства Ключ объекта ФоновоеЗадание.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Поддержать автора
.cf 117,02Kb
0
0 Скачать (1 SM) Купить за 1 850 руб.

Про что статья

Среди объектов 1С есть РегламентноеЗадание и ФоновоеЗадание.

Регламентное задание, позволяющее выполнять определенную функциональность по расписанию.

Фоновое задание служит для выполнения асинхронных операций.

Фоновое задание может быть создано двумя путями:

  • В результате работы Регламентного задания (запущено по расписанию);
  • Программно методом ФоновыеЗадания.Выполнить().

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

Вот про это свойство и пойдет речь в данной статье.

 

Как работает свойство Ключ

Исходя из описания в синтаксис-помощнике можно сделать вывод, что невозможно создать два фоновых задания с одинаковым именем метода, и одинаковым (не пустым) ключом.

Действительно, если в клиент-серверной базе 1С написать код:

ФоновыеЗадания.Выполнить("СерверныйМодуль.ИмяМетода", , "Ключ", "КакоетоНаименование");
ФоновыеЗадания.Выполнить("СерверныйМодуль.ИмяМетода", , "Ключ", "КакоетоНаименование");

то, на второй строке будет сгенерировано исключение: Задание с таким значением ключа уже выполняется.  

 

 

Кстати, в файловой базе на платформе 8.3.25.1336 - прекрасно работает :-)

 

Запущено два одинаковых фоновых задания в файловой базе

 

А что если в базе данных есть Регламентное задание с тем же именем метода и свойством ключа, которое уже запустило фоновое задание с таким же именем метода и ключом?

Я предполагал, что, коль скоро, регламентное задание запустило фоновое задание с именем метода "СерверныйМодуль.ИмяМетода" и ключом "Ключ", то при программном запуске такого же фонового задания будет сгенерировано исключение

ФоновыеЗадания.Выполнить("СерверныйМодуль.ИмяМетода", , "Ключ", "КакоетоНаименование");

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

В синтаксис-помощнике про ключ регламентного задания написано вот что:

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

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

 

 

Выводы

В 1С:Предприятие свойство Ключ регламентного задания и фонового задания имеют различное назначение.

Свойство ключ регламентного задания служит для контроля запуска фонового задания по свойствам: РегламентноеЗадание.Метаданные + ИмяМетода + Ключ

Свойство ключ фонового задания служит для контроля запуска по свойства: ИмяМетода + Ключ

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

Проверялось на платформах: 8.3.24.1548, 8.3.25.1336

 

Публикации по теме:

См. также

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

23.06.2024    7498    bayselonarrend    20    

154

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    5962    dsdred    16    

80

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    17782    YA_418728146    26    

71

Механизмы платформы 1С Программист Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    23782    SeiOkami    48    

135

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    14772    YA_418728146    7    

166
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. echo77 1906 15.10.24 10:10 Сейчас в теме
Конфигурация чтобы "покрутить" самому в серверной базе
Прикрепленные файлы:
PUBID_2210894-Тест ключа задания.cf
8. Kinestetik 24 16.10.24 08:04 Сейчас в теме
2. RustIG 1747 15.10.24 11:13 Сейчас в теме
(0) Зачем запускать фоновое задание? Если можно запустить регламентное задание - а фоновое запустится на его основании самостоятельно....может и с ключами система 1с сама разберется?! что-то заблочит, что-то запустит....
3. echo77 1906 15.10.24 11:40 Сейчас в теме
(2)
1. Как запустить Регламентное задание?
2. Задача состоит в том, чтобы выполнить один метод, дождаться его выполнения и выполнить второй метод. И чтобы в процессе выполнения другой пользователь не мог запустить выполнение того же самого.
4. RustIG 1747 15.10.24 23:37 Сейчас в теме
5. RustIG 1747 15.10.24 23:46 Сейчас в теме
(3) выполнить метод , дождаться и выполнить второй метод - возможно у асинх есть уже определенные методы... Но если по старинке, то можно использовать вспомогательный регистр сведений, в нем писать (открывать транзакцию), после завершения метода писать другое значение ( для выполнения второго метода). Сам второй метод я так понял параллельно запущен с первым методом, но постоянно проверяет значение РС и делает Возврат, пока значение не изменится.
9. dhurricane 16.10.24 14:33 Сейчас в теме
(5) Ну вот чтобы так не костылять и не разбираться потом с псевдозависшими фоновыми операциями, а также с паузами между итерациями опроса состояния и хотелось бы использовать платформенный механизм управления фоновыми заданиями. Который, как оказалось, работает не так, как хотелось бы.
11. RustIG 1747 16.10.24 14:45 Сейчас в теме
(9) я вот не понял, что не так с фоновыми?
фоновые изначально созданы для всех пользователей - запускают все подряд - никто не ждет других.
что в этом не так?

просто задача имеется такая, что уже фоновыми заданиями не решить.
13. RustIG 1747 16.10.24 14:54 Сейчас в теме
(9) я умаю, что сначала надо организовать очередь, а регл . задание - единственное - будет выхватывать из очереди нужное кол-во объектов и обрабатывать их.

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

далее одно регл. задание каждые 15 минут забирает 4 письма из регистра сведений и отправляет контрагентам....

как бы по другому я и не думал делать - например, при записи счета создавать фоновое задание, которое будет ждать пока другие счета не разошлются ....
6. RustIG 1747 15.10.24 23:48 Сейчас в теме
(3) чтобы Пользователь не запустил, а пусть запускает, только в его функции будет проверяться тот же РС на предмет Ответсвенного, и делаться Возврат до тех пор , пока транзакцию не завершит Первый пользователь
7. TMV 14 16.10.24 04:26 Сейчас в теме
Вообще все выглядит довольно логично. Контроль в обоих случаях выполняется по комбинации свойств:
РегламентноеЗадание.Метаданные + ИмяМетода + Ключ
, где для ФЗ первое свойство пустое.
Xershi; Созинов; echo77; EvgeniyOlxovskiy; Foxtrot1388; +5 Ответить
10. dhurricane 16.10.24 14:37 Сейчас в теме
(7) Жаль лишь, что в этом случае нет возможности "вручную" запустить регламентное задание. Так бы хоть какая-то возможность была убедиться, что свое фоновое и фоновое от регл. задания не пересекутся, когда такая задача стоит.
12. RustIG 1747 16.10.24 14:46 Сейчас в теме
(7) откуда такая инфа?
и что это дает для понимания?
14. Созинов 16.10.24 18:51 Сейчас в теме
(12) выше автор выложил конфу, если запустить разные типы заданий - в отладчике можно посмотреть чем отличаются.

https://its.1c.ru/db/v8325doc#bookmark:dev:TI000000792 - описание на ИТС регламентных и фоновых заданий
Автору спасибо, хорошая напоминалка получилась.
RustIG; echo77; +2 Ответить
15. Xershi 1555 17.10.24 02:36 Сейчас в теме
(14) ну автор конечно открыл Америку. Но интересует другой вопрос. Что будет если вызвать фоновое 2 и более раз с пустым ключом? Автор уверяет, что на 8.3.25 даже с ключом можно запустить.
Наверное речь сейчас идёт о том как вообще работают регламентные задания.
Берем конфигуратор и создаём регламентное задание с расписанием указываем ключ. Далее в предприятии создаётся фоновое задание с параметрами регламентного задания и прописывается в нем те самые ключ и метаданные. И потом 1с дёргает расписание фонового задания и смотрит. Ага расписание 1 секунда, а задание выполняется за 10 секунд. Значит на 2 секунду запускать не будем повторно. Запустится только через 10 секунд и так по кругу.
С фоновыми получается такая же песня. Для чего выполнить повторно сценарий, если старый не отработал. Так и должно работать.
Выходит автор обнаружил не документированный функционал?
Автор ещё не уточнил, а запускал ли он фоновое задание под одним пользователем сеансом 1с или разными. Регламентное задание же запускает агент сервера 1с.
Так что тема для ещё одной статьи.
16. tormozit 7230 17.10.24 07:19 Сейчас в теме
Как то сложно наформулировано. Достаточно было написать, что уникальность контроллируется по следующей комбинации свойств фоновоного задания:
РегламентноеЗадание.Метаданные + ИмяМетода + Ключ

По поводу "Запущено два одинаковых фоновых задания в файловой базе" скорее всего недоработка платформы. Об этом нужно сообщать в тех. поддержку v8@1c.ru . И потому преподносить это лучше с указанием версии платформы и именно с точки зрения, что это вероятно будет исправлено в следующих версиях платформы.
nightowl5; Igor_Ryaboff; NoRazum; Xershi; +4 Ответить
17. Dima_d 22.10.24 15:01 Сейчас в теме
Только пару дней назад столкнулся с похожей проблемой. Есть обмен с внешней системой, который идет через запуск рег. задания. Но есть возможность юзерам, запускать его и руками, (это больше для теста, а не для реальной работы, но юзеры зачем то стараются жать эту кнопку периодически, хотя предупреждений о последствиях). Так вот при запуске 2 параллельных обменов, бывает что информация дублируется во внешней системе. Я решил что переделаю запуск ручного обмена на запуск фонового задания и был уверен что использование ключа при запуске все решит, но не тут то было. Когда рег задание запускала фоновое, то мое новое фоновое с таким же ключом запускалось без проблем.

Тогда перед запуском своего фон задания, решил искать вручную запушенное фоновое рег задание.

Filter = New Structure;
	
	Filter.Insert("Key", "ANY_KEY");
	Filter.Insert("State",      BackgroundJobState.Active);
	CurrentBackgroundJobs = BackgroundJobs.GetBackgroundJobs(Filter);


что тоже не прокатило, тк если зайти в список рег заданий и запустить его вручную, то ключ у фон задания не будет как у рег задания из которого запускаешь, а там будет какой то ГУИД.
Короче пришлось делать так

	Filter = New Structure;
	
	Filter.Insert("MethodName", "EXCHANGE");
	Filter.Insert("State",      BackgroundJobState.Active);
	CurrentBackgroundJobs = BackgroundJobs.GetBackgroundJobs(Filter);


Те ищу запуск фонового задания, которое запустило рез задание, по имени метода.

Ну а далее запускаю свое фон задание с ключом, что отсекает возможность запустить такое же фоновое, в другом сеансе.

Соответственно при запуске рег. задания, так же проверяю что не идет обмен запушенный руками.
Оставьте свое сообщение