В процессе разработки и администрирования систем на базе 1С:Предприятие часто возникает необходимость программно проверить, выполняются ли в текущий момент регламентные задания. Это особенно актуально при работе с копиями баз, где выполнение заданий обычно блокируется, чтобы избежать нежелательной рассылки почты или синхронизации с внешними системами. Также это полезно для оптимизации интерфейса: например, если регламентные задания выключены, данные в динамическом списке можно собирать сложным запросом «на лету», а если включены — брать из предварительно рассчитанного регистра.
В этой статье мы подробно разберем, как программно определить состояние планировщика заданий, используя как встроенные средства платформы, так и механизмы Библиотеки стандартных подсистем (БСП).
Прежде всего, проанализируем ситуацию и поймем, что блокировка может происходить на двух разных уровнях, которые не всегда связаны между собой:
ScheduledJobsDenied). Если он включен, платформа вообще не инициирует запуск регламентных заданий для данной базы.Если ваша конфигурация построена на базе БСП (УТ 11, БП 3.0, ЗУП 3, ERP), то самым надежным способом будет проверка состояния блокировки работы с внешними ресурсами. Рассмотрим пример кода, который позволяет извлечь этот признак из параметров конфигурации. Нам потребуется обратиться к константе ПараметрыБлокировкиРаботыСВнешнимиРесурсами.
Разберем следующий фрагмент кода:
РаботаСВнешнимиРесурсамиЗаблокирована = Неопределено;
ПараметрыБлокировки = Константы.ПараметрыБлокировкиРаботыСВнешнимиРесурсами.Получить().Получить();
Если ТипЗнч(ПараметрыБлокировки) = Тип("Структура") Тогда
ПараметрыБлокировки.Свойство("РаботаСВнешнимиРесурсамиЗаблокирована", РаботаСВнешнимиРесурсамиЗаблокирована);
КонецЕсли;
Если РаботаСВнешнимиРесурсамиЗаблокирована = Истина Тогда
// Регламентные задания логически отключены, так как база признана копией
Сообщить("Работа с внешними ресурсами заблокирована (режим копии).");
КонецЕсли;
Этот метод хорош тем, что он учитывает специфику работы пользователя с базой после её перемещения. Проанализируем ситуацию: если мы хотим менять логику запроса в динамическом списке (как предлагалось в обсуждении), этот флаг будет наиболее релевантным индикатором того, обновляются ли данные в регистрах по расписанию.
Существует более «чистый» программный способ, который позволяет узнать состояние системного флага блокировки заданий в кластере серверов без использования COM-соединений или внешних библиотек. Для этого мы воспользуемся методом ПолучитьБлокировкуУстановкиСоединений(). Этот метод возвращает объект БлокировкаУстановкиСоединений, содержащий нужные нам свойства.
Рассмотрим реализацию на примере:
БлокировкаПараметры = ПолучитьБлокировкуУстановкиСоединений();
Если БлокировкаПараметры.РегламентныеЗаданияЗаблокированы Тогда
// Флаг в консоли администрирования установлен
Сообщить("Выполнение регламентных заданий запрещено на уровне сервера.");
Иначе
Сообщить("Планировщик регламентных заданий работает.");
КонецЕсли;
Важный нюанс: Данный метод работает в контексте сервера или толстого клиента. В обычном приложении или на тонком клиенте может потребоваться вызов серверной функции.
Иногда требуется проверить не глобальную блокировку, а доступность возможности запуска заданий в принципе. Выясним причину, почему задания могут не запускаться, попробовав получить к ним доступ через МенеджерРегламентныхЗаданий. Однако стоит помнить, что метод РегламентныеЗадания.ПолучитьРегламентныеЗадания() вернет список объектов даже при включенной блокировке в консоли, так как он считывает метаданные и настройки из базы, а не состояние планировщика.
Для проверки «боеспособности» системы можно попытаться создать фоновое задание. Если выполнение заданий заблокировано на уровне сервера, система вызовет исключение.
Попытка
// Пытаемся запустить пустое фоновое задание для проверки
ФоновыеЗадания.Выполнить("Общего Назначения.ПустаяПроцедура");
ЗаданияДоступны = Истина;
Исключение
// Если в тексте ошибки есть упоминание о блокировке регламентных заданий
ЗаданияДоступны = Ложь;
КонецПопытки;
Проанализируем этот подход: он достаточно радикален и требует наличия прав у пользователя, но дает 100% гарантию понимания, работает ли механизм фоновых и регламентных заданий в текущий момент или нет.
Выбор метода зависит от вашей конечной цели:
ПолучитьБлокировкуУстановкиСоединений().БлокировкаРаботыСВнешнимиРесурсами, где реализованы стандартные функции РаботаСВнешнимиРесурсамиЗаблокирована(). Это позволит не изобретать велосипед и следовать логике разработчиков фирмы 1С.Использование данных методов позволит вам гибко настраивать поведение системы, например, автоматически переключать источники данных в отчетах или динамических списках в зависимости от доступности фоновых процессов обновления.