При работе с платформой 1С:Предприятие 8.3 в клиент-серверном режиме администраторы и разработчики иногда сталкиваются с аномальным поведением планировщика: регламентное задание, настроенное на однократный запуск в сутки, начинает выполняться непрерывно (каждую секунду), как только наступает время старта по расписанию. Примечательно, что та же база в файловом варианте работает корректно. Разберем подробно причины этого поведения и способы решения проблемы.
Когда мы работаем в файловом режиме, за запуск заданий отвечает клиентское приложение. В клиент-серверном варианте (SQL) управление берет на себя Менеджер заданий внутри кластера серверов 1С. Основная причина бесконечных повторов заключается в том, что сервер после завершения задания не может корректно зафиксировать факт его выполнения или считает, что время следующего запуска уже наступило. Проанализируем основные технические факторы, вызывающие этот сбой.
Это самая распространенная причина. Если системное время на сервере приложений 1С опережает время на сервере баз данных (SQL) хотя бы на несколько секунд, возникает конфликт логики. Рассмотрим механику: сервер 1С запускает задание, оно отрабатывает, и сервер записывает время завершения. Однако SQL-сервер, имея «отстающее» время, может проинтерпретировать запись так, будто задание еще не запускалось в текущем цикле планировщика. В результате планировщик инициирует немедленный повторный запуск.
Что необходимо сделать:
Иногда флаг завершения задания не фиксируется из-за сбоев в кэше самого кластера (папка snccntxt). Обычная перезагрузка службы rphost может не помочь. Разберем по шагам процедуру «глубокой» очистки:
C:\Program Files\1cv8\srvinfo).reg_1541).snccntxt. Это очистит сеансовые данные и контекст заданий.1CV8Reg.lst, чтобы принудительно заставить систему пересоздать служебные таблицы.Бывают случаи, когда в метаданных конфигурации существует одно задание, а в системных таблицах базы данных (внутренние таблицы планировщика 1С) образуются дублирующиеся записи. Рассмотрим, как это исправить программно.
Нам необходимо полностью удалить объект задания и создать его заново, чтобы идентификаторы в базе данных обновились. Посмотрим на пример кода, который можно использовать во внешней обработке:
Выборка = РегламентныеЗадания.ПолучитьРегламентныеЗадания(Новый Структура("Метаданные", Метаданные.РегламентныеЗадания.МоеЗадание));
Для Каждого Задание Из Выборка Цикл
Задание.Удалить();
КонецЦикла;
После удаления задания следует зайти в пользовательский режим и создать его заново через «Консоль регламентных заданий» или программно, задав новое расписание. Это заставит систему создать чистую запись в таблице ScheduledJobs на уровне СУБД.
Выясним, не меняется ли расписание внутри самого выполняемого кода. Если в модуле, который вызывает регламентное задание, присутствует код, изменяющий объект РегламентноеЗадание, это может сбрасывать статус выполнения. Рассмотрим ситуацию: программа завершает работу, но в конце «на всякий случай» перезаписывает свое расписание. Для сервера 1С это выглядит как изменение настроек, требующее немедленного пересмотра очереди запуска.
Проанализируем также использование фоновых заданий. Если основное задание просто порождает ФоновоеЗадание и завершается слишком быстро (менее чем за 1 секунду), планировщик может решить, что запуск был ошибочным или несостоявшимся, и попробует запустить его снова.
Существует эмпирический способ решения, помогающий при странных сбоях планировщика, связанных с границами суток. Попробуем установить время начала задания в режиме приложения на 11:59:59 или 23:59:59. Это иногда помогает «протолкнуть» зависшую очередь заданий. Перед этим действием обязательно очистите кэш на компьютере, с которого вносите изменения в расписание, так как настройки могут кэшироваться локально в AppData.
Если вышеуказанные методы не помогают, стоит обратить внимание на следующие аспекты:
1С:Предприятие._Session.Start и _Session.Finish. Если время начала нового сеанса меньше или равно времени окончания предыдущего, это подтверждает теорию о рассинхронизации времени.Используя предложенные методы, мы сможем стабилизировать работу планировщика и избавить сервер от избыточной нагрузки, вызванной бесконечным повторением задач.