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

Администрирование - Системное

блокировка фоновые регламентные задания

17
Небольшая обработка для программного изменения свойств текущей информационной базы (клиент-сервер), в частности свойства 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;
	КонецЕсли;
	
	Возврат Результат;
КонецФункции

 

17

Скачать файлы

Наименование Файл Версия Размер
Установка/снятие блокировки регламентных заданий (клиент-серверный вариант):
.epf 7,28Kb
13.03.18
13
.epf 7,28Kb 13 Скачать

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. aspirator23 374 17.03.18 14:30 Сейчас в теме
Консоль не понравилась?
2. jwslavin 17 19.03.18 07:52 Сейчас в теме
(1) Чай не девушка, чтобы нравиться :) А если серьезно, то и консолью пользуюсь. Но специфика работы моей главной базы в том, что фоновые задания обращаются к внешним компонентам и при принудительной остановке сеанса эти компоненты иногда чудят. Проще запретить регламентные задания, а пользователям дать минут 5-10 на аккуратное завершение. И все это из одного окна (клиент-то уже как правило запущен), ибо лень. Короче, частный случай.
3. aspirator23 374 19.03.18 11:13 Сейчас в теме
В консоли не пробовал регламентные задания выключать?
4. jwslavin 17 19.03.18 14:06 Сейчас в теме
(3) Выключал. Надоело запускать еще одно окно. Чего ж непонятного-то?
Оставьте свое сообщение