8.х Подскажите как отсоединить пользователей программно в клиент-серверной восьмерке ?

Тема в разделе "Общие вопросы "1С:Предприятие 8"", создана пользователем Tatyana, 2 июн 2008.

  1. TopicStarter Overlay
    Tatyana
    Offline

    Tatyana

    Регистрация:
    8 май 2008
    Сообщения:
    4
    Симпатии:
    0
    Баллы:
    1
    Подскажите как отсоединить пользователей программно в клиент-серверной восьмерке ?

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

    Процедура ПриНачалеРаботыСистемы()
    ...
    ОбработкаПланировщикаЗадач(Перечисления.ПериодыЗапускаЗадачПланировщика.ПриЗапускеСистемы);
    ПодключитьОбработчикОжидания("глОбработкаПланировщикаЗадач",10);
    ...
    КонецПроцедуры // ПриНачалеРаботыСистемы()

    // вызывается каждые 10 сек. проверяется наличие задач у пользователя и если
    // подошел срок их исполнения, то задачи выполняються
    Процедура глОбработкаПланировщикаЗадач() Экспорт
    ОбработкаПланировщикаЗадач();
    КонецПроцедуры

    // выберем задачи текущего пользователя
    Если ПараметрыСеанса.Пользователь = Справочники.Пользователи.Робот Тогда
    Если НЕ ПустаяСтрока(ПараметрЗапуска) Тогда
    Возврат;
    КонецЕсли;
    КонецЕсли;

    Запрос=Новый Запрос("
    |ВЫБРАТЬ
    | ЗадачиПланировщика.ВидЗадачи,
    | ЗадачиПланировщика.Объект,
    | ЗадачиПланировщика.ПериодЗапускаЗадачи,
    | ЗадачиПланировщика.МоментЗапускаЗадачи,
    | ЗадачиПланировщика.ДействиеПриОшибке,
    | ЗадачиПланировщика.Периодическая,
    | ЗадачиПланировщика.ДатаИВремяОднократногоЗапуска,
    | ЗадачиПланировщика.УдалятьЗадачуПослеЗапуска
    |ИЗ
    | РегистрСведений.ЗадачиПланировщика КАК ЗадачиПланировщика
    |
    |ГДЕ
    | ЗадачиПланировщика.Пользователь = &Пользователь
    | "+?(Режим<>Неопределено,"И ЗадачиПланировщика.ПериодЗапускаЗадачи=&ПериодЗапускаЗадачи",""));
    Запрос.УстановитьПараметр("Пользователь",ПараметрыСеанса.Пользователь);
    Запрос.УстановитьПараметр("ПериодЗапускаЗадачи",Режим);
    РезультатЗадачи=Запрос.Выполнить();
    // если нет ничего, то ничего и не делаем
    Если РезультатЗадачи.Пустой() Тогда Возврат; КонецЕсли;
    // задачи есть. выполняем
    ВыборкаЗадачи=РезультатЗадачи.Выбрать();
    Пока ВыборкаЗадачи.Следующий() Цикл
    // проверим пришло ли время
    ВремяПришло=(Режим<>Неопределено);

    Если ВыборкаЗадачи.Периодическая Тогда

    Если ВыборкаЗадачи.ПериодЗапускаЗадачи=Перечисления.ПериодыЗапускаЗадачПланировщика.Ежедневно Тогда
    Секунд=ВыборкаЗадачи.МоментЗапускаЗадачи-НачалоДня(ВыборкаЗадачи.МоментЗапускаЗадачи);
    СейчасСекунд=ТекущаяДата()-НачалоДня(ТекущаяДата());
    Интервал=СейчасСекунд-Секунд;
    ВремяПришло=(Интервал>0 И Интервал<=10);
    КонецЕсли;

    Иначе

    Если НачалоДня(ТекущаяДата())=НачалоДня(ВыборкаЗадачи.ДатаИВремяОднократногоЗапуска) Тогда
    // отработаем проверку времени запуска одноразовой задачи
    Секунд=ВыборкаЗадачи.ДатаИВремяОднократногоЗапуска-НачалоДня(ВыборкаЗадачи.ДатаИВремяОднократногоЗапуска);
    СейчасСекунд=ТекущаяДата()-НачалоДня(ТекущаяДата());
    Интервал=СейчасСекунд-Секунд;
    ВремяПришло=(Интервал>0 И Интервал<=10);
    Иначе
    ВремяПришло=Ложь;
    КонецЕсли;

    КонецЕсли;
    // если время еще не пришло, то уйдем
    Если НЕ ВремяПришло Тогда Продолжить; КонецЕсли;
    КоличествоПопыток=10; // количество попыток выполнения действия
    ЕстьОшибка=Ложь;

    ~Обратно:
    // избежим зацикливания
    КоличествоПопыток=КоличествоПопыток-1; // попытка прошла
    // попытки закончились
    Если КоличествоПопыток=0 Тогда
    Сообщить("Задачу "+СокрЛП(ВыборкаЗадачи.ВидЗадачи)+" "+СокрЛП(ВыборкаЗадачи.Объект)+" выполнить не удалось!",СтатусСообщения.ОченьВажное);
    Сообщить("Было предпринято "+СокрЛП(КоличествоПопыток)+" попыток.",СтатусСообщения.Информация);
    Продолжить;
    КонецЕсли;

    // смотрим что за задача
    Если ВыборкаЗадачи.ВидЗадачи=Перечисления.ВидЗадачПланировщика.ЗавершениеРаботыСистемы Тогда
    // завершаем
    ЗавершитьРаботуСистемы(Ложь);
    КонецЕсли;

    // ошибка, посмотрим что делаем по ошибке
    Если ЕстьОшибка Тогда
    Если ВыборкаЗадачи.ДействиеПриОшибке=Перечисления.ВидыДействийПриОшибкеВыполненияЗадачи.ЗавершитьРаботуСистемы Тогда
    ЗавершитьРаботуСистемы(Ложь);
    ИначеЕсли ВыборкаЗадачи.ДействиеПриОшибке=Перечисления.ВидыДействийПриОшибкеВыполненияЗадачи.ПовторятьПопытку Тогда
    Перейти ~Обратно;
    Иначе
    Продолжить;
    КонецЕсли;
    Иначе
    // Если задача исполнилась успешно - и при этом она одноразовая, и
    // у неё взведён флаг удаления после исполнения - то удалим её
    Если (НЕ ВыборкаЗадачи.Периодическая) И (ВыборкаЗадачи.УдалятьЗадачуПослеЗапуска) Тогда
    ОтборПланировщика=Новый Структура;
    ОтборПланировщика.Вставить("Пользователь", ПараметрыСеанса.Пользователь);

    Выборка=РегистрыСведений.ЗадачиПланировщика.Выбрать(ОтборПланировщика);
    Пока Выборка.Следующий() Цикл
    Если
    (Выборка.ВидЗадачи=ВыборкаЗадачи.ВидЗадачи) И
    (Выборка.Объект=ВыборкаЗадачи.Объект) И
    (Выборка.ПериодЗапускаЗадачи=ВыборкаЗадачи.ПериодЗапускаЗадачи) И
    (Выборка.МоментЗапускаЗадачи=ВыборкаЗадачи.МоментЗапускаЗадачи) И
    (Выборка.ДействиеПриОшибке=ВыборкаЗадачи.ДействиеПриОшибке) И
    (Выборка.Периодическая=ВыборкаЗадачи.Периодическая) И
    (Выборка.ДатаИВремяОднократногоЗапуска=ВыборкаЗадачи.ДатаИВремяОднократногоЗапуска) И
    (Выборка.УдалятьЗадачуПослеЗапуска=ВыборкаЗадачи.УдалятьЗадачуПослеЗапуска)
    Тогда
    Запись=Выборка.ПолучитьМенеджерЗаписи();
    Запись.Удалить();
    КонецЕсли;
    КонецЦикла;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    КонецПроцедуры
  2. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Посмотри в типовой УПП - там это есть

Поделиться этой страницей