Почему регламентное задание 1С не применяет новое расписание из конфигуратора и выполняется непрерывно?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Причина непрерывного циклического перезапуска задания

Разберем типичную ситуацию: в расписании было установлено повторение каждые 120 секунд, а сама процедура фонового задания выполняется от 3 до 5 минут. В таком случае задание перезапускается сразу же после окончания своей работы с интервалом буквально в одну секунду. Выясним причину такого поведения планировщика.

В настройках расписания существуют два принципиально разных параметра повторения внутри дня:

  1. Повторять через (свойство ПериодПовтораВТечениеДня) — интервал отсчитывается строго от момента начала выполнения предыдущего фонового задания. Если регламентная процедура выполняется 5 минут (300 секунд), а интервал задан в 120 секунд, то к моменту завершения сеанса контрольное время следующего запуска уже наступило в прошлом. Планировщик сервера 1С немедленно инициирует новый фоновый сеанс без какой-либо паузы.
  2. Повторять с паузой (свойство ПаузаПовтора) — интервал отсчитывается строго от момента завершения выполнения предыдущего фонового задания. Если для длительных процедур требуется гарантированный перерыв между выполнениями, необходимо использовать именно этот параметр.

Почему изменения расписания в конфигураторе игнорируются базой данных

Главная архитектурная особенность заключается в том, что регламентное задание в дереве метаданных конфигуратора и регламентное задание как рабочий объект информационной базы — это разные сущности. Значения параметров, заданные разработчиком в конфигураторе (включая флаг использования и расписание), выступают исключительно в роли значений по умолчанию.

Механизм платформы устроен следующим образом:

  1. Когда новое предопределенное регламентное задание впервые сохраняется и применяется к базе данных, платформа создает соответствующую запись в системных таблицах СУБД. В этот момент первоначальное расписание переносится из метаданных в базу.
  2. При всех последующих сохранениях конфигурации платформа намеренно игнорирует любые изменения расписания в конфигураторе. Это сделано для того, чтобы при очередном обновлении конфигурации не перезаписывать рабочие настройки, которые системный администратор или пользователи могли изменить в режиме 1С:Предприятие.
  3. Расписание и активность заданий хранятся непосредственно в таблицах базы данных, а не в оперативной памяти службы кластера. По этой причине перезапуск службы сервера 1С не приводит к сбросу настроек на значения из дерева метаданных.

Способ 1. Использование типовых средств администрирования или консоли заданий

Если конфигурация создана на базе Библиотеки стандартных подсистем (БСП), в ней уже присутствует готовый инструмент для управления расписаниями без необходимости поиска внешних обработок. Разберем порядок действий:

  1. Запустим режим 1С:Предприятие под пользователем с полными административными правами.
  2. Перейдем в раздел Администрирование, выберем пункт Обслуживание, а затем откроем панель Регламентные и фоновые задания.
  3. В открывшемся списке найдем нужное регламентное задание, откроем его карточку и отредактируем расписание, задав корректный период повтора или паузу. При сохранении изменения запишутся непосредственно в информационную базу.
  4. Если используется конфигурация без БСП, аналогичную операцию можно выполнить с помощью специализированной внешней обработки — консоли регламентных заданий, запущенной в соответствующем режиме интерфейса (обычные или управляемые формы).

Способ 2. Программное обновление расписания из метаданных

Когда требуется программно вернуть регламентному заданию то расписание, которое разработчик настроил в конфигураторе, воспользуемся объектом РегламентныеЗадания. Напишем код для внешней обработки или процедуры обновления базы данных:


МетаданныеЗадания = Метаданные.РегламентныеЗадания.ИмяВашегоРегламентногоЗадания;
Задание = РегламентныеЗадания.НайтиПредопределенное(МетаданныеЗадания);

Если Задание <> Неопределено Тогда
    Задание.Расписание = МетаданныеЗадания.Расписание;
    Задание.Записать();
КонецЕсли;

Посмотрим на логику работы данного фрагмента: функция НайтиПредопределенное находит рабочий экземпляр задания в базе данных по объекту описания метаданных, после чего свойству Расписание присваивается расписание из конфигурации и вызывается метод Записать(). Новое расписание вступает в силу мгновенно.

Способ 3. Пересоздание предопределенного задания через конфигуратор

Если доступ к режиму предприятия для выполнения кода или интерактивной настройки ограничен, можно принудительно заставить платформу пересоздать запись в базе данных:

  1. В конфигураторе откроем свойства проблемного регламентного задания и снимем флаг Предопределенное.
  2. Выполним обновление конфигурации базы данных (нажмем клавишу F7). Платформа удалит связанную предопределенную запись из системной таблицы базы.
  3. Вновь установим флаг Предопределенное, проверим корректность настроенного расписания и повторно обновим конфигурацию базы данных.
  4. Платформа создаст в базе данных абсолютно новый предопределенный объект и первично запишет в него актуальное расписание из метаданных.
← На главную