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



Данный код позволит вам автоматически отключать регламентные задачи в копиях баз данных.
У нас есть регламентные задачи которые надо выполнять только на рабочей базе (забирает данные с другой базы). При создание копии базы данные «уходили» в нерабочую базу. Что бы это искоренить был придуман следующий алгоритм дейсвий:

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

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

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

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

19 Comments

  1. BorisMor

    Данный код позволит вам автоматически отключать регламентные задачи в копиях баз данных.

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

    Reply
  2. Zero_nv

    Судя по коду это все ориентированно на клиент-сервер. Тогда зачем все это придумывать??

    В консоли сервера предприятия 1С вибираем базу которая является копией. Правой кнопкой — Свойства — и ставим галочку напротив «Блокировка регламентных задач включена»

    Регламентные задачи нас больше не беспокоят

    Reply
  3. KonstB

    (1) Zero_nv,

    +1

    Reply
  4. BorisMor

    (1) Zero_nv,

    Вы же занимаетесь автоматизацией, а предлагаете ручками ставить галку 🙂

    Фактически мы так и делали, но после пары «несчетных случаев» решили что на людей надежды нет.

    Reply
  5. xzorkiix

    // —- Инцилизиурем константы —-

    но это же не констранты! [кричит]

    А так рекомендовал бы

    Весь код метода работы с кластером и вкл/выкл регламентных заданий сделать самостоятельным метод,

    например

    УстановитьРежимВыполненияРегламентыхЗаданий()

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

    так же в примере не ясно, если Сеанс инициализирует само регламентное задание — где его прерывание?

    Reply
  6. Zero_nv

    (3) BorisMor объясните поподробней, что вы имели ввиду под фразой: «Фактически мы так и делали, но после пары «несчетных случаев» решили что на людей надежды нет.»

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

    Reply
  7. djd.sf

    (3) но ведь можно же скрипт vbs написать, конфу трогать не придется.

    Reply
  8. Zero_nv

    (6) djd.sf Поясните каким образом можно использовать скрипт в этом случае

    Reply
  9. djd.sf

    (7) может быть я неправильно понял задачу, но что мешает переписать код в публикации на vbs? я так понял происходит подключение к com объекту, перебираются базы и по некому признаку выбирают базу, где изменяют свойство ScheduledJobsDenied

    Reply
  10. BorisMor

    (5) Zero_nv,

    Один раз это делается в случае если у вас одна тестовая базе.

    У нас исторически несколько баз и несколько программистов.

    Reply
  11. BorisMor

    (4) xzorkiix,

    так же в примере не ясно, если Сеанс инициализирует само регламентное задание — где его прерывание?

    Прерывается за счет вызова исключения во время инициализации сеанса.

    Reply
  12. BorisMor

    (8) djd.sf,

    Регламентное задание может сработать раньше чем отключающий скрипт. имхо

    Reply
  13. kapustinag

    (11)

    Присоединяюсь к хору «непонятливых». Пока складывается впечатление, что либо что-то недообъяснено, либо Вы сами в своем хозяйстве неправильно хозяйствуете.

    Ситуация следующая: может быть только одно из двух:

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

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

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

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

    То есть, если при создании базы в кластере администратор кластера отработал ответственно, то и незачем огород городить.

    Более того, если кластеры разные (один кластер — рабочий, а второй — тестовый), то имя тестовой базы может совпадать с именем рабочей, и Ваша проверка ничего не отключит.

    Reply
  14. kapustinag

    (11)

    Конечно, если каждый разработчик может создавать себе на кластере все, что ему в голову взбредет, то такая отключалка нужна. Но это вряд ли хорошая практика. Может быть, имеет смысл уменьшить количество «хозяев» у кластера, и проблема уйдет сама собой?

    Reply
  15. Zero_nv

    (9) у нас тож несколько программистов и 6 копий БД, но при этом кластером заведует один (!!!) человек. С него весь и спрос.

    Reply
  16. BorisMor

    (14) Zero_nv,

    Ну чтож… значит свою расхлябанность мы решаем технической подкованностью))

    Код «кладет соломку» там где пару раз упали — ничего плохого тут не вижу.

    Reply
  17. WellMaster

    Извините, просто глаза режет: http://tsya.ru/

    Reply
  18. le0nid

    Тоже используем нечто подобное, но не регламентные задания отключаем, а отключаются e-mail, тома файлов, папки обмена. Меняется заголовок.

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

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

    Reply
  19. nicxxx

    (18) да да, база «не являеться» :))

    Reply

Leave a Comment

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