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







Данный код позволит вам автоматически отключать регламентные задачи в копиях баз данных.
Перейти к публикации
Судя по коду это все ориентированно на клиент-сервер. Тогда зачем все это придумывать??
В консоли сервера предприятия 1С вибираем базу которая является копией. Правой кнопкой — Свойства — и ставим галочку напротив «Блокировка регламентных задач включена»
Регламентные задачи нас больше не беспокоят
(1) Zero_nv,
+1
(1) Zero_nv,
Вы же занимаетесь автоматизацией, а предлагаете ручками ставить галку 🙂
Фактически мы так и делали, но после пары «несчетных случаев» решили что на людей надежды нет.
// —- Инцилизиурем константы —-
но это же не констранты! [кричит]
А так рекомендовал бы
Весь код метода работы с кластером и вкл/выкл регламентных заданий сделать самостоятельным метод,
например
УстановитьРежимВыполненияРегламентыхЗаданий()
И сделать главным акцентом поста, а привязка его в начало сеанса пользователя по условию как пример применения тогда комментарий (0) не будет сам собой напрашиваться.
так же в примере не ясно, если Сеанс инициализирует само регламентное задание — где его прерывание?
(3) BorisMor объясните поподробней, что вы имели ввиду под фразой: «Фактически мы так и делали, но после пары «несчетных случаев» решили что на людей надежды нет.»
И причем сдесь ручками ставить галку?? Это работает по принципу: один раз поставил и забыл, сколько бы не перезаливал бы данные из бекапов. Может я не понимаю что-то или у вас какая-то специфичная ситуация?
(3) но ведь можно же скрипт vbs написать, конфу трогать не придется.
(6) djd.sf Поясните каким образом можно использовать скрипт в этом случае
(7) может быть я неправильно понял задачу, но что мешает переписать код в публикации на vbs? я так понял происходит подключение к com объекту, перебираются базы и по некому признаку выбирают базу, где изменяют свойство ScheduledJobsDenied
(5) Zero_nv,
Один раз это делается в случае если у вас одна тестовая базе.
У нас исторически несколько баз и несколько программистов.
(4) xzorkiix,
Прерывается за счет вызова исключения во время инициализации сеанса.
(8) djd.sf,
Регламентное задание может сработать раньше чем отключающий скрипт. имхо
(11)
Присоединяюсь к хору «непонятливых». Пока складывается впечатление, что либо что-то недообъяснено, либо Вы сами в своем хозяйстве неправильно хозяйствуете.
Ситуация следующая: может быть только одно из двух:
1) Тестовая база на кластере создана заново, и в нее загружена выгрузка из рабочей или восстановлен SQL-бэкап.
В этом случае, при создании базы на кластере 1С, нужно просто поставить галочку «Блокировка регламентных заданий включена», и все. А эта галочка и так поставлена по умолчанию при создании базы.
2) Тестовая база на кластере уже была ранее, и в нее загружена выгрузка из рабочей или восстановлен SQL-бэкап.
В этом случае, так как уже при создании базы в кластере в ней блокируются регламентные задания, то проблемы нет.
То есть, если при создании базы в кластере администратор кластера отработал ответственно, то и незачем огород городить.
Более того, если кластеры разные (один кластер — рабочий, а второй — тестовый), то имя тестовой базы может совпадать с именем рабочей, и Ваша проверка ничего не отключит.
(11)
Конечно, если каждый разработчик может создавать себе на кластере все, что ему в голову взбредет, то такая отключалка нужна. Но это вряд ли хорошая практика. Может быть, имеет смысл уменьшить количество «хозяев» у кластера, и проблема уйдет сама собой?
(9) у нас тож несколько программистов и 6 копий БД, но при этом кластером заведует один (!!!) человек. С него весь и спрос.
(14) Zero_nv,
Ну чтож… значит свою расхлябанность мы решаем технической подкованностью))
Код «кладет соломку» там где пару раз упали — ничего плохого тут не вижу.
Извините, просто глаза режет:
Тоже используем нечто подобное, но не регламентные задания отключаем, а отключаются e-mail, тома файлов, папки обмена. Меняется заголовок.
Кода не много, а пару раз выручало.
З.ы. и да часть баз РИБ, причем со своими админами, что тоже немаловажный фактор в пользу использования такого функционала.
(18) да да, база «не являеться» :))