В процессе разработки и администрирования баз на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией: в дерево метаданных внесены правки для предопределенного регламентного задания (например, изменен флаг Использование или обновлено расписание), конфигурация базы данных обновлена, но система продолжает упорно выполнять задание по старым правилам. В этой статье мы подробно разберем, почему так происходит, изучим внутренние механизмы платформы и рассмотрим рабочие способы принудительного обновления настроек.
Проанализируем ситуацию: когда мы впервые создаем предопределенное регламентное задание в конфигураторе и выполняем обновление, платформа создает в системных таблицах управления заданиями соответствующую запись. В этот момент происходит однократное копирование свойств из объекта метаданных в базу данных. Это называется созданием «снимка» или инициализацией.
Разберем, почему последующие изменения в конфигураторе игнорируются:
Использовать в конфигураторе, для базы данных это не сигнал к обновлению существующей записи, а лишь изменение «шаблона», который уже был использован ранее.Рассмотрим случай, когда стандартные инструменты (обработки «Консоль заданий») не помогают. Часто старые обработки, написанные еще под версию 8.2 или ранние релизы 8.3, могут некорректно отображать состояние или выдавать ошибки при попытке записи. Это связано с тем, что в современных версиях платформы (например, 8.3.26) изменены требования к безопасности и методам работы с менеджером регламентных заданий.
Выясним причину, по которой консоль может «не видеть» новое задание: если у задания в метаданных не стоит признак Предопределенное, оно не появится в списке предопределенных. Если же оно предопределенное, но запись в базе данных «зависла» в старом состоянии, нам придется прибегнуть к программным методам исправления ситуации.
Если в вашей конфигурации нет встроенных инструментов (например, БСП), а внешние консоли работают с ошибками, мы можем воспользоваться механизмом отладки. Для этого запустим 1С в режиме предприятия и откроем окно «Вычислить выражение» (или создадим простейшую внешнюю обработку).
Рассмотрим программный код, который принудительно обновляет состояние задания:
// Находим предопределенное задание по его имени в метаданных
ИмяЗадания = "ВашеИмяРегламентногоЗадания";
ЗаданиеОбъект = РегламентныеЗадания.НайтиПредопределенное(Метаданные.РегламентныеЗадания[ИмяЗадания]);
// Если задание найдено, принудительно устанавливаем свойства
Если ЗаданиеОбъект <> Неопределено Тогда
ЗаданиеОбъект.Использование = Истина; // Или Ложь, если нужно отключить
// Можно также обновить расписание из метаданных, если оно изменилось
ЗаданиеОбъект.Расписание = Метаданные.РегламентныеЗадания[ИмяЗадания].Расписание;
ЗаданиеОбъект.Записать();
Сообщить("Настройки задания успешно обновлены в базе данных");
КонецЕсли;
Важный момент: только метод Записать() физически фиксирует изменения в системных таблицах СУБД. Пока вы его не вызвали, изменения в объекте РегламентноеЗадание существуют только в оперативной памяти вашего сеанса.
Проанализируем ситуацию, когда предопределенных заданий много и нужно убедиться, что все они соответствуют текущему состоянию метаданных. Мы можем написать цикл, который синхронизирует все задания сразу. Это особенно полезно при развертывании базы на новом сервере или после крупного релиза.
Посмотрим на пример такого кода:
Процедура СинхронизироватьРегламентныеЗадания() Экспорт
Для Каждого МетаДанныеЗадания Из Метаданные.РегламентныеЗадания Цикл
// Пытаемся найти существующее задание в БД
ЗаданиеБД = РегламентныеЗадания.НайтиПредопределенное(МетаДанныеЗадания);
Если ЗаданиеБД = Неопределено Тогда
// Если почему-то задание не создалось автоматически, это редкий случай
Продолжить;
КонецЕсли;
// Синхронизируем флаг использования
Если ЗаданиеБД.Использование <> МетаДанныеЗадания.Использование Тогда
ЗаданиеБД.Использование = МетаДанныеЗадания.Использование;
ЗаданиеБД.Записать();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Если вы решили использовать консоль заданий, убедитесь, что она адаптирована под управляемые формы и ваш релиз платформы. В консоли следует обращать внимание на колонку «Имя предопределенного».
Разберем по шагам действия в консоли:
Использование. Если в конфигураторе вы его сняли, а в консоли он стоит — снимите его вручную в консоли.Выясним еще одну важную деталь: в клиент-серверном варианте за запуск заданий отвечает менеджер кластера. Даже если вы программно изменили задание, иногда требуется подождать несколько минут (до следующего цикла опроса планировщика), чтобы изменения вступили в силу. В редких случаях, если задания «зависли» намертво, может потребоваться перезапуск службы 1C:Enterprise 8.3 Server Agent, хотя использование метода Записать() в коде обычно решает проблему без радикальных мер.
Подведем итог: помните, что предопределенное задание в Конфигураторе — это лишь декларация намерения. Реальный объект управления находится в базе данных, и после его создания связь с метаданными в части настроек (расписание, использование, параметры) становится односторонней. Для управления такими заданиями всегда используйте либо специализированные обработки (консоли), либо программный интерфейс РегламентныеЗадания.