Как исправить дату завершения фонового задания после перевода системного времени на сервере

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

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

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

Анализируем причину зависания заданий

Рассмотрим механизм работы планировщика. За выполнение регламентных заданий в клиент-серверном варианте отвечает процесс rmngr (менеджер кластера). Именно он хранит в своей оперативной памяти и в специальных файлах состояния (кеше) информацию о том, когда задание запускалось в последний раз. Когда мы перевели время на две недели вперед, 1С успешно выполнила задание и записала в базу данных и в кеш сервера время завершения, скажем, 14.11.2019.

После возврата времени на текущую дату планировщик сверяет условия запуска. Стандартная логика выглядит так: ТекущееВремя > (ВремяПоследнегоЗапуска + ИнтервалПоРасписанию). Поскольку ТекущееВремя (настоящее) значительно меньше зафиксированного ВремениПоследнегоЗапуска (из будущего), условие никогда не выполняется. Задание переходит в состояние бесконечного ожидания.

Решение 1: Перезапуск службы сервера 1С (самый надежный способ)

Как показала практика обсуждения на форуме, наиболее эффективным и простым методом является полная перезагрузка службы 1С:Предприятия или всего сервера. Разберем, почему это помогает.

При остановке службы 1C:Enterprise 8 Server Agent менеджер кластера сбрасывает текущие состояния планировщика из оперативной памяти. Если проблема не успела глубоко «зашиться» в файлы сеансовых данных, то при старте планировщик может пересчитать контрольные точки заново, ориентируясь на актуальное системное время.

Порядок действий:

  1. Завершите работу всех активных пользователей в базе данных.
  2. Остановите службу сервера 1С через оснастку services.msc.
  3. Если есть возможность, выполните перезагрузку всего физического или виртуального сервера (это дополнительно очистит кеш операционной системы и освободит заблокированные файлы).
  4. Запустите службу и проверьте консоль регламентных заданий.

Решение 2: Пересоздание регламентного задания

Если перезапуск сервера невозможен или не помог, проанализируем ситуацию с пересозданием объектов. Если задание не является предопределенным (то есть оно создано пользователем в режиме «Предприятие»), его можно просто удалить и создать заново с тем же расписанием.

Рассмотрим шаги для непредопределенных заданий:

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

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

Нюанс с предопределенными заданиями:

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

  1. В конфигураторе временно снимите флаг Предопределенное у соответствующего объекта РегламентноеЗадание.
  2. Обновите конфигурацию базы данных.
  3. В режиме «Предприятие» удалите это задание.
  4. Верните флаг в конфигураторе и снова обновите базу.

Решение 3: Программное «подталкивание» через встроенный язык

Выясним, можно ли изменить дату завершения программно. Напрямую свойство Конец у объекта ФоновоеЗадание доступно только для чтения. Однако мы можем попробовать программно изменить расписание самого регламентного задания, что иногда заставляет rmngr пересмотреть очередь запусков.

Рассмотрим пример кода, который можно запустить во внешней обработке:


// Выбираем нужное регламентное задание по метаданным
Выборка = РегламентныеЗадания.ПолучитьРегламентныеЗадания();
Для Каждого Задание Из Выборка Цикл
    Если Задание.Метаданные.Имя = "ОбновлениеИндексаППД" Тогда
        // Отключаем задание
        Задание.Использование = Ложь;
        Задание.Записать();
        
        // Меняем расписание на однократный запуск в ближайшее время
        НовоеРасписание = Новый РасписаниеРегламентногоЗадания;
        НовоеРасписание.ДатаНачала = ТекущаяДата();
        НовоеРасписание.ПериодПовтораВДень = 60; // каждые 60 секунд
        
        Задание.Расписание = НовоеРасписание;
        Задание.Использование = Истина;
        Задание.Записать();
        
        Сообщить("Задание перезаписано с новым расписанием.");
    КонецЕсли;
КонецЦикла;

Этот метод не гарантирует 100% результат, если планировщик жестко держит дату в кеше, но он позволяет избежать удаления объекта.

Решение 4: Очистка серверного кеша и сеансовых данных

Если перезапуск службы не помог, значит информация о «будущем» запуске сохранилась в файлах кластера. Проанализируем структуру каталога srvinfo. Данные о регламентных заданиях и их расписаниях могут находиться в подпапках, связанных с идентификатором базы данных, в частности в папке snccntx.

Важно: Данная операция требует остановки службы 1С и сопряжена с риском потери некоторых сеансовых данных (например, значений временных хранилищ), поэтому её следует выполнять только при наличии бэкапа папки srvinfo.

Алгоритм действий:

  1. Остановите службу сервера 1С.
  2. Перейдите в каталог данных кластера (обычно C:\Program Files\1cv8\srvinfo\reg_1541\).
  3. Найдите папку с UID вашей базы данных.
  4. Внутри неё найдите папку snccntx. Проанализируем её содержимое: там находятся файлы с расширением .dat, хранящие контекст сеансов.
  5. Удалите содержимое папки snccntx.
  6. Запустите службу.

Использование «Инструментов разработчика»

Существуют сторонние решения, такие как «Инструменты разработчика» (автор Сергей Старых). В составе этого набора есть продвинутая консоль регламентных заданий, которая позволяет более гибко манипулировать объектами планировщика. Рассмотрим её возможности: она позволяет видеть уникальные идентификаторы заданий (UUID) и напрямую вызывать методы интерфейса МенеджерРегламентныхЗаданий, что может помочь в диагностике того, какое именно время «видит» система.

Рекомендации по предотвращению проблемы

Чтобы не сталкиваться с подобными ситуациями в будущем, проанализируем правила работы с системным временем на серверах 1С:

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

← На главную