Как исправить дату последнего запуска регламентных заданий в 1С при сбое времени на сервере?

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

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

В этой статье мы подробно разберем, почему возникает эта проблема, почему ее невозможно решить стандартными программными методами внутри самой 1С, и проанализируем четыре практических способа исправления ситуации в зависимости от архитектуры вашей базы данных (клиент-серверная или файловая).

Почему проблему нельзя решить простой обработкой на встроенном языке?

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

Дату и время последнего выполнения платформа хранит в свойствах объекта регламентного задания: ПоследнееЗадание.Начало или ПоследнееЗадание.Конец. Но дело в том, что во встроенном языке 1С доступ к этим свойствам реализован исключительно для чтения. Записать туда произвольное значение или очистить его программно невозможно. Платформа самостоятельно контролирует эти поля, обновляя их только по факту реального завершения фонового процесса. Именно поэтому стандартные попытки отключить и включить использование задания через код или форму («Выкл» -> «Записать» -> «Вкл» -> «Записать») часто не приносят результата — платформа продолжает считывать старую «будущую» дату запуска из внутренних кэшей или таблиц.


Способ 1. Прямое редактирование SQL-таблицы (для клиент-серверных баз)

Если ваша база работает в клиент-серверном варианте под управлением СУБД (например, MS SQL Server, PostgreSQL), этот способ является наиболее быстрым и эффективным, особенно когда сбилось расписание у десятков предопределенных регламентных заданий.

Информация о расписании, настройках и истории запусков регламентных заданий хранится на уровне СУБД в системной таблице платформы с именем _ScheduledJobs. Данные в этой таблице находятся в бинарном (сериализованном) виде, поэтому просто точечно поменять дату в одной колонке через стандартный SQL-запрос UPDATE не получится. Однако мы можем полностью очистить эту таблицу или удалить из нее конкретные строки.

Проанализируем пошаговый алгоритм решения проблемы через СУБД:

  1. Остановите службу сервера 1С:Предприятия. Это критически важный шаг! Менеджер кластера 1С (процесс rmngr) кэширует состояния планировщика регламентных заданий в оперативной памяти. Если вы измените данные в SQL-таблице при работающей службе, менеджер кластера при первом же удобном случае перезапишет ваши изменения в базе данных обратно «будущей» датой из своего кэша.
  2. Откройте среду управления вашей СУБД (например, SQL Server Management Studio) и найдите нужную базу данных.
  3. Для полной очистки истории всех регламентных заданий выполните запрос очистки таблицы. Разберем пример SQL-скрипта:
    
    -- Очистка таблицы регламентных заданий в MS SQL
    TRUNCATE TABLE _ScheduledJobs;
    
    Примечание: Если вы не хотите сбрасывать настройки всех заданий, можно удалить только конкретные строки, предварительно сопоставив их по внутренним идентификаторам (UUID), но для гарантированного решения проблемы чаще всего очищают таблицу полностью. При следующем запуске платформы предопределенные задания инициализируются заново с пустым временем последнего запуска.
  4. Запустите службу сервера 1С:Предприятия. При старте службы процесс ragent считает чистую таблицу _ScheduledJobs, увидит, что истории запусков у предопределенных заданий нет, и начнет их выполнение строго по установленному расписанию, ориентируясь на текущее серверное время.

Способ 2. Сброс расписания через интерфейс БСП (для дополнительных обработок)

Если «зависло» расписание у дополнительных (внешних) отчетов или обработок, подключенных через Библиотеку стандартных подсистем (БСП), вам не потребуется лезть в базу данных на уровне СУБД. В механизмах БСП заложена архитектура, которая позволяет пересоздавать фоновые задания принудительно через пользовательский интерфейс.

Рассмотрим порядок действий для сброса даты запуска:

  1. Перейдите в раздел администрирования программных интерфейсов, где находится список дополнительных отчетов и обработок.
  2. Откройте карточку настройки проблемной дополнительной обработки.
  3. Найдите команду, у которой настроено расписание, и снимите флаг «Выполнять команду по расписанию» (или снимите признак активности использования).
  4. Обязательно запишите изменения (нажмите кнопку «Записать» или «Записать и закрыть»). В этот момент БСП программно удаляет связанное с обработкой фоновое регламентное задание.
  5. Снова откройте карточку настройки, установите флаг использования расписания обратно и еще раз запишите обработку.

Такой цикл действий заставляет БСП удалить старый экземпляр регламентного задания и создать абсолютно новый элемент с пустой историей. Запуск произойдет сразу же при наступлении ближайшего события по расписанию.


Способ 3. Пересоздание заданий вручную (для непредопределенных заданий)

В конфигурациях 1С регламентные задания делятся на предопределенные (созданные разработчиком в конфигураторе) и непредопределенные (созданные пользователями или программно в режиме «1С:Предприятие»).

Если зависшие задания не являются предопределенными, самым безопасным и простым методом исправления ситуации будет их ручное пересоздание:

  1. Откройте типовую обработку «Консоль регламентных заданий» (или стандартный интерфейс управления регламентными заданиями в вашей конфигурации).
  2. Найдите проблемное задание, откройте его свойства и зафиксируйте (запишите или сделайте скриншот настроек) расписание и параметры запуска.
  3. Удалите текущее регламентное задание.
  4. Создайте новое регламентное задание с точно такими же параметрами и расписанием.

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


Способ 4. Манипуляции в файловых базах данных

В файловом варианте работы базы данных (когда вся база хранится в одном файле 1Cv8.1CD) напрямую выполнить SQL-запросы к таблице _ScheduledJobs штатными средствами СУБД невозможно. В этом случае у администратора есть два пути решения проблемы.

Использование сторонних утилит для работы с файлами баз данных

Вы можете воспользоваться специализированными низкоуровневыми утилитами (например, популярной программой Tool1CD), которые умеют открывать структуру файлов .1CD без запуска платформы 1С. С помощью таких инструментов можно напрямую открыть таблицу _ScheduledJobs внутри файловой базы и вручную очистить ее записи.

Важно: Любое прямое редактирование файлов базы данных сторонними утилитами несет в себе риски необратимого повреждения данных. Перед выполнением этой операции в обязательном порядке сделайте резервную копию файла базы данных (1Cv8.1CD).

Временное изменение конфигурации

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

  1. Откройте базу данных в режиме «Конфигуратор».
  2. Включите возможность изменения конфигурации (если она находится на поддержке без возможности редактирования).
  3. Найдите в дереве метаданных проблемные регламентные задания в ветке Общие -> РегламентныеЗадания.
  4. В свойствах каждого из этих заданий временно снимите свойство «Предопределенное» (установите значение в «Ложь»).
  5. Обновите конфигурацию базы данных (нажмите клавишу F7). При этом платформа удалит предопределенные элементы из системных таблиц планировщика.
  6. Верните свойство «Предопределенное» обратно в значение «Истина» для всех измененных заданий.
  7. Повторно обновите конфигурацию базы данных (F7).

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

← На главную