Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 2
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Отключение регламентных заданий в копии базы , или Пример работы с агентом 1С          
Vofka Подменю пользователя
сообщение 15.08.12, 20:11
Сообщение #1

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13955
Из: Киев
Спасибо сказали: 4520 раз
Рейтинг: 3642.8

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

///////////////////////////////

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

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

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


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

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


[необходимо зарегистрироваться для просмотра ссылки]

Сообщение отредактировал Vofka - 28.08.12, 11:51

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 25.04.24, 10:07
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!