В практике администрирования серверов 1С:Предприятие иногда возникают ситуации, когда системное время на сервере переводится вперед — случайно или намеренно (например, для тестирования закрытия месяца или проверки будущих начислений). Однако при возврате даты в реальное состояние системные администраторы часто сталкиваются с неприятным эффектом: все регламентные задания перестают запускаться автоматически. Проблема заключается в том, что планировщик 1С зафиксировал время последнего успешного выполнения задания в «будущем», и теперь он ожидает наступления этого момента, чтобы произвести следующий запуск согласно расписанию.
В данной статье мы подробно разберем, почему это происходит, как устроена внутренняя логика планировщика 1С и какие существуют методы исправления ситуации — от самых простых до радикальных.
Рассмотрим механизм работы планировщика. За выполнение регламентных заданий в клиент-серверном варианте отвечает процесс rmngr (менеджер кластера). Именно он хранит в своей оперативной памяти и в специальных файлах состояния (кеше) информацию о том, когда задание запускалось в последний раз. Когда мы перевели время на две недели вперед, 1С успешно выполнила задание и записала в базу данных и в кеш сервера время завершения, скажем, 14.11.2019.
После возврата времени на текущую дату планировщик сверяет условия запуска. Стандартная логика выглядит так: ТекущееВремя > (ВремяПоследнегоЗапуска + ИнтервалПоРасписанию). Поскольку ТекущееВремя (настоящее) значительно меньше зафиксированного ВремениПоследнегоЗапуска (из будущего), условие никогда не выполняется. Задание переходит в состояние бесконечного ожидания.
Как показала практика обсуждения на форуме, наиболее эффективным и простым методом является полная перезагрузка службы 1С:Предприятия или всего сервера. Разберем, почему это помогает.
При остановке службы 1C:Enterprise 8 Server Agent менеджер кластера сбрасывает текущие состояния планировщика из оперативной памяти. Если проблема не успела глубоко «зашиться» в файлы сеансовых данных, то при старте планировщик может пересчитать контрольные точки заново, ориентируясь на актуальное системное время.
Порядок действий:
services.msc.Если перезапуск сервера невозможен или не помог, проанализируем ситуацию с пересозданием объектов. Если задание не является предопределенным (то есть оно создано пользователем в режиме «Предприятие»), его можно просто удалить и создать заново с тем же расписанием.
Рассмотрим шаги для непредопределенных заданий:
Для нового задания история выполнений будет пустой, и планировщик запустит его немедленно, так как ограничение по времени из будущего исчезнет.
Нюанс с предопределенными заданиями:
Предопределенные задания, созданные разработчиком в конфигураторе, нельзя просто так удалить в режиме «Предприятие». При попытке удаления система выдаст ошибку Нельзя удалить предопределенное задание. В этом случае мы можем пойти на хитрость:
Предопределенное у соответствующего объекта РегламентноеЗадание.Выясним, можно ли изменить дату завершения программно. Напрямую свойство Конец у объекта ФоновоеЗадание доступно только для чтения. Однако мы можем попробовать программно изменить расписание самого регламентного задания, что иногда заставляет rmngr пересмотреть очередь запусков.
Рассмотрим пример кода, который можно запустить во внешней обработке:
// Выбираем нужное регламентное задание по метаданным
Выборка = РегламентныеЗадания.ПолучитьРегламентныеЗадания();
Для Каждого Задание Из Выборка Цикл
Если Задание.Метаданные.Имя = "ОбновлениеИндексаППД" Тогда
// Отключаем задание
Задание.Использование = Ложь;
Задание.Записать();
// Меняем расписание на однократный запуск в ближайшее время
НовоеРасписание = Новый РасписаниеРегламентногоЗадания;
НовоеРасписание.ДатаНачала = ТекущаяДата();
НовоеРасписание.ПериодПовтораВДень = 60; // каждые 60 секунд
Задание.Расписание = НовоеРасписание;
Задание.Использование = Истина;
Задание.Записать();
Сообщить("Задание перезаписано с новым расписанием.");
КонецЕсли;
КонецЦикла;
Этот метод не гарантирует 100% результат, если планировщик жестко держит дату в кеше, но он позволяет избежать удаления объекта.
Если перезапуск службы не помог, значит информация о «будущем» запуске сохранилась в файлах кластера. Проанализируем структуру каталога srvinfo. Данные о регламентных заданиях и их расписаниях могут находиться в подпапках, связанных с идентификатором базы данных, в частности в папке snccntx.
Важно: Данная операция требует остановки службы 1С и сопряжена с риском потери некоторых сеансовых данных (например, значений временных хранилищ), поэтому её следует выполнять только при наличии бэкапа папки srvinfo.
Алгоритм действий:
C:\Program Files\1cv8\srvinfo\reg_1541\).UID вашей базы данных.snccntx. Проанализируем её содержимое: там находятся файлы с расширением .dat, хранящие контекст сеансов.snccntx.Существуют сторонние решения, такие как «Инструменты разработчика» (автор Сергей Старых). В составе этого набора есть продвинутая консоль регламентных заданий, которая позволяет более гибко манипулировать объектами планировщика. Рассмотрим её возможности: она позволяет видеть уникальные идентификаторы заданий (UUID) и напрямую вызывать методы интерфейса МенеджерРегламентныхЗаданий, что может помочь в диагностике того, какое именно время «видит» система.
Чтобы не сталкиваться с подобными ситуациями в будущем, проанализируем правила работы с системным временем на серверах 1С:
Подводя итог, можно сказать: если вы случайно «забросили» 1С в будущее, самым быстрым и эффективным лечением будет перезагрузка всей службы сервера 1С с предварительной очисткой сеансовых данных. Это вернет планировщик в реальность и позволит заданиям снова выполняться по расписанию.