bdd2

Отключение регламентных заданий в копии базы

Опубликовал Борис Моренко (BorisMor) в раздел Программирование - Практика программирования

Данный код позволит вам автоматически отключать регламентные задачи в копиях баз данных.
У нас есть регламентные задачи которые надо выполнять только на рабочей базе (забирает данные с другой базы). При создание копии базы данные «уходили» в нерабочую базу. Что бы это искоренить был придуман следующий алгоритм дейсвий:
  • В константе «ИмяРабочейБазы» прописывается имя рабочей базы (Например: ”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(РабочаяБаза);
        ВызватьИсключение
"Выключенно регламентное задание. Перезапуститесь." ; // Что бы прервать сеанс регламентного
   
КонецЕсли;

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

И не забываем вставить вызов этой процедуры из модуля сеанса...

Процедура УстановкаПараметровСеанса()
   
ПолныеПрава.ПроверкаНаКопию();
    ...
КонецПроцедуры

См. также

Добавить вознаграждение
Комментарии
0. Борис Моренко (BorisMor) 285 09.08.12 07:32 Сейчас в теме
Данный код позволит вам автоматически отключать регламентные задачи в копиях баз данных.

Перейти к публикации

1. Николай Зайцев (Zero_nv) 127 09.08.12 11:50 Сейчас в теме
Судя по коду это все ориентированно на клиент-сервер. Тогда зачем все это придумывать??
В консоли сервера предприятия 1С вибираем базу которая является копией. Правой кнопкой - Свойства - и ставим галочку напротив "Блокировка регламентных задач включена"
Регламентные задачи нас больше не беспокоят
w-divin; xzorkiix; KonstB; +3 Ответить 2
2. Konstantin Konstantin (KonstB) 159 09.08.12 12:00 Сейчас в теме
3. Борис Моренко (BorisMor) 285 09.08.12 12:29 Сейчас в теме
(1) Zero_nv,
Вы же занимаетесь автоматизацией, а предлагаете ручками ставить галку :)
Фактически мы так и делали, но после пары "несчетных случаев" решили что на людей надежды нет.
4. Евгений Шабалин (xzorkiix) 23 09.08.12 12:32 Сейчас в теме
// ---- Инцилизиурем константы ----
но это же не констранты! [кричит]

А так рекомендовал бы
Весь код метода работы с кластером и вкл/выкл регламентных заданий сделать самостоятельным метод,
например
УстановитьРежимВыполненияРегламентыхЗаданий()

И сделать главным акцентом поста, а привязка его в начало сеанса пользователя по условию как пример применения тогда комментарий (0) не будет сам собой напрашиваться.

так же в примере не ясно, если Сеанс инициализирует само регламентное задание - где его прерывание?
5. Николай Зайцев (Zero_nv) 127 09.08.12 12:45 Сейчас в теме
(3) BorisMor объясните поподробней, что вы имели ввиду под фразой: "Фактически мы так и делали, но после пары "несчетных случаев" решили что на людей надежды нет."
И причем сдесь ручками ставить галку?? Это работает по принципу: один раз поставил и забыл, сколько бы не перезаливал бы данные из бекапов. Может я не понимаю что-то или у вас какая-то специфичная ситуация?
6. игорь ром (djd.sf) 09.08.12 12:53 Сейчас в теме
(3) но ведь можно же скрипт vbs написать, конфу трогать не придется.
7. Николай Зайцев (Zero_nv) 127 09.08.12 12:59 Сейчас в теме
(6) djd.sf Поясните каким образом можно использовать скрипт в этом случае
8. игорь ром (djd.sf) 09.08.12 13:03 Сейчас в теме
(7) может быть я неправильно понял задачу, но что мешает переписать код в публикации на vbs? я так понял происходит подключение к com объекту, перебираются базы и по некому признаку выбирают базу, где изменяют свойство ScheduledJobsDenied
9. Борис Моренко (BorisMor) 285 09.08.12 13:06 Сейчас в теме
(5) Zero_nv,
Один раз это делается в случае если у вас одна тестовая базе.
У нас исторически несколько баз и несколько программистов.
10. Борис Моренко (BorisMor) 285 09.08.12 13:11 Сейчас в теме
(4) xzorkiix,
так же в примере не ясно, если Сеанс инициализирует само регламентное задание - где его прерывание?

Прерывается за счет вызова исключения во время инициализации сеанса.
11. Борис Моренко (BorisMor) 285 09.08.12 13:21 Сейчас в теме
(8) djd.sf,
Регламентное задание может сработать раньше чем отключающий скрипт. имхо
12. Александр Капустин (kapustinag) 09.08.12 16:19 Сейчас в теме
(11) BorisMor,

Присоединяюсь к хору "непонятливых". Пока складывается впечатление, что либо что-то недообъяснено, либо Вы сами в своем хозяйстве неправильно хозяйствуете.
Ситуация следующая: может быть только одно из двух:
1) Тестовая база на кластере создана заново, и в нее загружена выгрузка из рабочей или восстановлен SQL-бэкап.

В этом случае, при создании базы на кластере 1С, нужно просто поставить галочку "Блокировка регламентных заданий включена", и все. А эта галочка и так поставлена по умолчанию при создании базы.

2) Тестовая база на кластере уже была ранее, и в нее загружена выгрузка из рабочей или восстановлен SQL-бэкап.

В этом случае, так как уже при создании базы в кластере в ней блокируются регламентные задания, то проблемы нет.

То есть, если при создании базы в кластере администратор кластера отработал ответственно, то и незачем огород городить.
Более того, если кластеры разные (один кластер - рабочий, а второй - тестовый), то имя тестовой базы может совпадать с именем рабочей, и Ваша проверка ничего не отключит.
13. Александр Капустин (kapustinag) 09.08.12 16:22 Сейчас в теме
(11) BorisMor,
Конечно, если каждый разработчик может создавать себе на кластере все, что ему в голову взбредет, то такая отключалка нужна. Но это вряд ли хорошая практика. Может быть, имеет смысл уменьшить количество "хозяев" у кластера, и проблема уйдет сама собой?
14. Николай Зайцев (Zero_nv) 127 10.08.12 04:30 Сейчас в теме
(9) BorisMor, у нас тож несколько программистов и 6 копий БД, но при этом кластером заведует один (!!!) человек. С него весь и спрос.
15. Борис Моренко (BorisMor) 285 10.08.12 06:10 Сейчас в теме
(14) Zero_nv,
Ну чтож... значит свою расхлябанность мы решаем технической подкованностью))
Код "кладет соломку" там где пару раз упали - ничего плохого тут не вижу.
DanilaDru; +1 Ответить
18. WellMaster (WellMaster) 97 14.12.16 17:36 Сейчас в теме
Извините, просто глаза режет: http://tsya.ru/
19. Le8niD K (le0nid) 14.12.16 17:51 Сейчас в теме
Тоже используем нечто подобное, но не регламентные задания отключаем, а отключаются e-mail, тома файлов, папки обмена. Меняется заголовок.

Кода не много, а пару раз выручало.

З.ы. и да часть баз РИБ, причем со своими админами, что тоже немаловажный фактор в пользу использования такого функционала.