- В константе «ИмяРабочейБазы» прописывается имя рабочей базы (Например: ”UT82_Live”)
- Если создается копия базы то она называется по другому (Например: ”UT82_Test”)
- Если имя базы не совпадает с константой «ИмяРабочейБазы», то идет отключение регламенты задач.
Для этого была создана процедура «ПроверкаНаКопию()». Процедура находиться в общем привилигированнм модуле.
Вызваться процедура при инициализации сеанса пользователя («Модуль сеанса» - Процедура «УстановкаПараметровСеанса()»).
Сама процедура:
// Проверяет не являеться ли текущая база копией
// Определяеться по константе ИмяРабочейБазы - которая не должна отличаться от текущей базы
// Если база копия то отрубаем регламентное задание
// Истина - это не копия
// Ложь - это копия базы
Функция ПроверкаНаКопию() Экспорт
// ---- Проверка на копию ----
ИмяРабочейБазы = СокрЛП(НРег(Константы.ИмяРабочейБазы.Получить()));
СтрокаСоединения = НРег(СтрокаСоединенияИнформационнойБазы());
ИскомаяБаза = """" + ИмяРабочейБазы + """";
БазаНайдена = Найти(СтрокаСоединения,ИскомаяБаза) > 0;
Если БазаНайдена и Не ПустаяСтрока(ИмяРабочейБазы) тогда
Возврат Истина;
Иначе
#Если НаКлиенте тогда
Сообщить("Текущая базе не являеться рабочей! (см. константу ""ИмяРабочейБазы"") " + Константы.ИмяРабочейБазы.Получить());
#КонецЕсли
КонецЕсли;
// ---- Инцилизиурем константы ----
ИмяСервера = "server1C"; // адрес 1С сервер
АдминКластера = "";
ПарольАдминаКластера = "";
Админ1С = "COMConnect"; // пользователь с полными правами
ПарольАдмина1С = ""; // пароль админа 1С
// ---- Отписываемся от регламентых заданий ----
Соединение = Новый COMОбъект("V82.COMConnector"); // Соединились с 1С
Попытка
СоединениеАгент = Соединение.ConnectAgent(ИмяСервера); // Соединились с 1С Агентом
Кластеры = СоединениеАгент.GetClusters(); // Получитли массив кластеров (COMSafeArray)
Исключение
#Если НаКлиенте тогда
Сообщить("Ошибка соединения с COM сервером: " + ОписаниеОшибки());
#КонецЕсли
Возврат Ложь;
КонецПопытки;
КоличествоКластеров = Кластеры.GetLength(0);
Если КоличествоКластеров < 1 тогда
#Если НаКлиенте тогда
Сообщить("Не найден кластер на сервере " + ИмяСервера);
#КонецЕсли
Возврат Ложь;
КонецЕсли;
РабочийКластер = Кластеры.GetValue(0);
Попытка
// Авторизируемся на кластере (Кластер,Имя,Пароль)
СоединениеАгент.Authenticate(РабочийКластер, АдминКластера, ПарольАдминаКластера);
Исключение
#Если НаКлиенте тогда
Сообщить("Ошибка авторизации: " + ОписаниеОшибки());
#КонецЕсли
Возврат Ложь;
КонецПопытки;
// Подключаемся к рабочему процессу
РабочийПроцесс = СоединениеАгент.GetWorkingProcesses(РабочийКластер).GetValue(0);
Порт = СтрЗаменить(Строка(РабочийПроцесс.MainPort),Символы.НПП,""); // убиваем непереносимые пробелы
СтрокаПодлючения = РабочийПроцесс.HostName + ":" + Порт;
СоединениеСРабочимПроцессом = Соединение.ConnectWorkingProcess(СтрокаПодлючения);
СоединениеСРабочимПроцессом.AddAuthentication(Админ1С,ПарольАдмина1С);
// Ищем текущую базу данных
МассивБаз = СоединениеСРабочимПроцессом.GetInfoBases();
БазаНайдена = Ложь;
Для каждого РабочаяБаза из МассивБаз цикл
ИскомаяБаза = НРег("""" + РабочаяБаза.Name + """");
БазаНайдена = Найти(СтрокаСоединения,ИскомаяБаза) > 0;
Если БазаНайдена тогда
Прервать;
КонецЕсли;
КонецЦикла;
Если Не БазаНайдена тогда
#Если НаКлиенте тогда
Сообщить("База (" + СтрокаСоединения + ") не найдена на сервере " + ИмяСервера);
#КонецЕсли
Возврат Ложь;
КонецЕсли;
Если НЕ РабочаяБаза.ScheduledJobsDenied тогда
#Если НаКлиенте тогда
Сообщить("Отключаем регламентное задание");
#КонецЕсли
РабочаяБаза.ScheduledJobsDenied = Истина; // Блокируем выполнения регламентных заданий
СоединениеСРабочимПроцессом.UpdateInfoBase(РабочаяБаза);
ВызватьИсключение "Выключенно регламентное задание. Перезапуститесь." ; // Что бы прервать сеанс регламентного
КонецЕсли;
Возврат Ложь;
КонецФункции
И не забываем вставить вызов этой процедуры из модуля сеанса...
Процедура УстановкаПараметровСеанса()
ПолныеПрава.ПроверкаНаКопию();
...
КонецПроцедуры