Как программно определить, включены ли регламентные задания в 1С

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

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

В этой статье мы подробно разберем, как программно определить состояние планировщика заданий, используя как встроенные средства платформы, так и механизмы Библиотеки стандартных подсистем (БСП).

Уровни блокировки регламентных заданий

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

  1. Уровень платформы (серверный): Флаг устанавливается в консоли администрирования кластера серверов (свойство ScheduledJobsDenied). Если он включен, платформа вообще не инициирует запуск регламентных заданий для данной базы.
  2. Уровень прикладного решения (БСП): Это логическая блокировка «работы с внешними ресурсами». При создании копии базы БСП предлагает нажать кнопку «Это копия», после чего программно выставляется флаг, запрещающий выполнение кода, связанного с внешними интеграциями, даже если сами задания технически запускаются платформой.

Способ 1: Использование механизмов БСП (для типовых конфигураций)

Если ваша конфигурация построена на базе БСП (УТ 11, БП 3.0, ЗУП 3, ERP), то самым надежным способом будет проверка состояния блокировки работы с внешними ресурсами. Рассмотрим пример кода, который позволяет извлечь этот признак из параметров конфигурации. Нам потребуется обратиться к константе ПараметрыБлокировкиРаботыСВнешнимиРесурсами.

Разберем следующий фрагмент кода:


РаботаСВнешнимиРесурсамиЗаблокирована = Неопределено;
ПараметрыБлокировки = Константы.ПараметрыБлокировкиРаботыСВнешнимиРесурсами.Получить().Получить();

Если ТипЗнч(ПараметрыБлокировки) = Тип("Структура") Тогда
    ПараметрыБлокировки.Свойство("РаботаСВнешнимиРесурсамиЗаблокирована", РаботаСВнешнимиРесурсамиЗаблокирована);
КонецЕсли;

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

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

Способ 2: Встроенный метод платформы «ПолучитьБлокировкуУстановкиСоединений»

Существует более «чистый» программный способ, который позволяет узнать состояние системного флага блокировки заданий в кластере серверов без использования COM-соединений или внешних библиотек. Для этого мы воспользуемся методом ПолучитьБлокировкуУстановкиСоединений(). Этот метод возвращает объект БлокировкаУстановкиСоединений, содержащий нужные нам свойства.

Рассмотрим реализацию на примере:


БлокировкаПараметры = ПолучитьБлокировкуУстановкиСоединений();
Если БлокировкаПараметры.РегламентныеЗаданияЗаблокированы Тогда
    // Флаг в консоли администрирования установлен
    Сообщить("Выполнение регламентных заданий запрещено на уровне сервера.");
Иначе
    Сообщить("Планировщик регламентных заданий работает.");
КонецЕсли;

Важный нюанс: Данный метод работает в контексте сервера или толстого клиента. В обычном приложении или на тонком клиенте может потребоваться вызов серверной функции.

Способ 3: Проверка через менеджер регламентных заданий

Иногда требуется проверить не глобальную блокировку, а доступность возможности запуска заданий в принципе. Выясним причину, почему задания могут не запускаться, попробовав получить к ним доступ через МенеджерРегламентныхЗаданий. Однако стоит помнить, что метод РегламентныеЗадания.ПолучитьРегламентныеЗадания() вернет список объектов даже при включенной блокировке в консоли, так как он считывает метаданные и настройки из базы, а не состояние планировщика.

Для проверки «боеспособности» системы можно попытаться создать фоновое задание. Если выполнение заданий заблокировано на уровне сервера, система вызовет исключение.


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

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

Резюме и рекомендации

Выбор метода зависит от вашей конечной цели:

  1. Если вам нужно понять, является ли база копией (чтобы не испортить данные внешних систем), используйте Способ 1 через проверку параметров БСП.
  2. Если вам нужно технически знать, запустит ли сервер 1С планировщик, используйте Способ 2 с методом ПолучитьБлокировкуУстановкиСоединений().
  3. Для комплексной проверки в типовых решениях мы рекомендуем заглянуть в общий модуль БлокировкаРаботыСВнешнимиРесурсами, где реализованы стандартные функции РаботаСВнешнимиРесурсамиЗаблокирована(). Это позволит не изобретать велосипед и следовать логике разработчиков фирмы 1С.

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

← На главную