Установка/снятие блокировки регламентных заданий (клиент-серверный вариант)

Небольшая обработка для программного изменения свойств текущей информационной базы (клиент-сервер), в частности свойства ScheduledJobsDenied — признака блокировки выполнения регламентных заданий информационной базы.
Тестировал в 8.3.10.2667 (OS Windows, MS SQL 2008).

Набросал для себя, потом подумал, что кому-то вдруг окажется интересно программно запрещать или разрешать фоновые процессы, которые стартуют по регламентному расписанию. Целью была доработка типовой обработки БлокировкаСоединенийСИнформационнойБазой, я "выгонял" из базы пользователей, но фоновые задачи нужно было иногда прекращать сразу, а каждый раз запускать оснастку администрирования — лень.

В общем, основная процедура из модуля обработки в тексте.

// Функция - Получить структуру соединения информационной базы
//
// Параметры:
//  СтрокаСоединения - Строка - Строка соединения с информационной базой в формате "<Имя параметра>=<Значение параметра>;". При пустом значении используется текущая строка соединения
//
// Возвращаемое значение:
// Структура - Ключ - <Имя параметра>, значение - <Значение параметра>
//
Функция ПолучитьСтруктуруСоединенияИнформационнойБазы(Знач СтрокаСоединения = Неопределено) Экспорт
Если СтрокаСоединения = Неопределено тогда
СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
КонецЕсли;

Результат = Новый Структура;

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

Возврат Результат;
КонецФункции

// Функция - Блокировка регламентных заданий в текущей информационной базе
//
// Параметры:
//  УстановитьБлокировку - Булево - Если задан, то производится попытка изменить состояние блокировки регламентных заданий
//
// Возвращаемое значение:
// Булево - состояние блокировки после установки нового состояния.
// Неопределено - в случае, если невозможно изменить состояние блокировки регламетных заданий
//
Функция БлокировкаРегламентныхЗаданий(УстановитьБлокировку = Неопределено) Экспорт
АдминистраторИБ = Новый Структура("Имя, Пароль", "username", "password");

СтруктураСоединения = ПолучитьСтруктуруСоединенияИнформационнойБазы();

COMСоединитель = Новый COMОбъект("V83.COMConnector");
Попытка
СоединениеСАгентомСервера = COMСоединитель.ConnectAgent(СтруктураСоединения.Srvr);
Исключение
СоединениеСАгентомСервера = Неопределено;
КонецПопытки;
Если СоединениеСАгентомСервера = Неопределено тогда
Возврат Неопределено;
КонецЕсли;

МассивКластеров = СоединениеСАгентомСервера.GetClusters();
КластерТекущий = Неопределено;
Для Каждого Кластер Из МассивКластеров Цикл
Если Нрег(Кластер.HostName) = Нрег(СтруктураСоединения.Srvr) тогда
КластерТекущий = Кластер;
Прервать;
КонецЕсли;
КонецЦикла;
Если КластерТекущий = Неопределено тогда
Возврат Неопределено;
КонецЕсли;
СоединениеСАгентомСервера.Authenticate(КластерТекущий, "", "");

МассивРабочихПроцессов = СоединениеСАгентомСервера.GetWorkingProcesses(КластерТекущий);
ИнформационнаяБазаТекущая = Неопределено;
Для Каждого РабочийПроцесс Из МассивРабочихПроцессов Цикл
СоединениеСРабочимПроцессом = COMСоединитель.ConnectWorkingProcess("tcp://"+РабочийПроцесс.HostName+":"+Формат(РабочийПроцесс.MainPort,"ЧГ=0"));
СоединениеСРабочимПроцессом.AddAuthentication(АдминистраторИБ.Имя, АдминистраторИБ.Пароль);
МассивИнформационныхБаз = СоединениеСРабочимПроцессом.GetInfoBases();
Для Каждого ИнформационнаяБаза Из МассивИнформационныхБаз Цикл
Если Нрег(ИнформационнаяБаза.Name) = Нрег(СтруктураСоединения.Ref) тогда
ИнформационнаяБазаТекущая = ИнформационнаяБаза;
Прервать;
КонецЕсли;
КонецЦикла;
Если НЕ ИнформационнаяБазаТекущая = Неопределено тогда
Прервать;
КонецЕсли;
КонецЦикла;
Если ИнформационнаяБазаТекущая = Неопределено тогда
Возврат Неопределено;
КонецЕсли;

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

Возврат Результат;
КонецФункции

 

4 Comments

  1. aspirator23

    Консоль не понравилась?

    Reply
  2. jwslavin

    (1) Чай не девушка, чтобы нравиться 🙂 А если серьезно, то и консолью пользуюсь. Но специфика работы моей главной базы в том, что фоновые задания обращаются к внешним компонентам и при принудительной остановке сеанса эти компоненты иногда чудят. Проще запретить регламентные задания, а пользователям дать минут 5-10 на аккуратное завершение. И все это из одного окна (клиент-то уже как правило запущен), ибо лень. Короче, частный случай.

    Reply
  3. aspirator23

    В консоли не пробовал регламентные задания выключать?

    Reply
  4. jwslavin

    (3) Выключал. Надоело запускать еще одно окно. Чего ж непонятного-то?

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *