8.х Как програмно принудительно закрыть сессии?

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем ВикторТ, 8 сен 2009.

  1. TopicStarter Overlay
    ВикторТ
    Offline

    ВикторТ

    Регистрация:
    8 сен 2009
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
    Здравствуйте.
    Платформа 8.1 (.11.67)
    Как програмно принудительно закрыть сессии (все или нужные)? И как оповестить пользователей о предстоящем закрытии их сессий? Есть какие намеки на решение?
    Да, это, базы данных и фаловые, и на SQL. Нужно и для того, и для другого случая.
    Заранее всем спасибо.
  2. lazy
    Offline

    lazy Модераторы Команда форума Модератор

    Регистрация:
    1 сен 2007
    Сообщения:
    2.127
    Симпатии:
    4
    Баллы:
    29
  3. TopicStarter Overlay
    ВикторТ
    Offline

    ВикторТ

    Регистрация:
    8 сен 2009
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
    Спасибо.
    Отмазываюсь: я действительно пытался поискать по форуму...
    Для будущих искателей: Закрыть сессии, завершить сеансы, выгнать пользователей. Ну и хватит.
    Для себя решил посмотреть, как сделано в УПП. Есть еще какой-то вариант здесь, но я его не видел, он платный - http://infostart.ru/projects/2874/.
    Тему наверное можно закрывать.
  4. coder1cv8
    Offline

    coder1cv8 Опытный в 1С

    Регистрация:
    30 авг 2007
    Сообщения:
    101
    Симпатии:
    0
    Баллы:
    26
    А как же мои бесплатные варианты? )
    Все есть на Инфостарте.
  5. mialord
    Offline

    mialord Модераторы Команда форума Модератор

    Регистрация:
    31 июл 2009
    Сообщения:
    5.398
    Симпатии:
    40
    Баллы:
    54
    На инфостарте есть действительно много вариантов выгонялок, посмотрите там.
    А coder1cv8 тебе можно отдельное спасибо за твои варианты сказать, на инфостарте я уж благодарил :), однако одну из выгонялок, с сокрытием лишник кнопок, с оповещением пользователей (которая мне так глянулась) ты так и не дописал, а именно нет списка пользователей при входе, а уж очень хотелось бы, я бы тебя своими спасибами засыпал бы :unsure: .
  6. TopicStarter Overlay
    ВикторТ
    Offline

    ВикторТ

    Регистрация:
    8 сен 2009
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
    Ну, или там были внешним приложением реализованы выгонялки, или только для клиент-серверного варианта. А мне нужно было в общем-то для реализации обмена. В случае, если приходит измененная конфигурация, выгнаться всех, закрыть текущую сессию, запустив пакетном режиме обновление конфигурации.

    Реализовал запущенным ОбработчикомОжидания, кот. вызывает процедуру, проверяющую наличие блокировки. Т.е., когда надо, устанавливаю блокировку на 5 мин, обработчик ожидания с периодом в 60 сек проверяет, 2 раза с интревалом в минуту сообщает, что для обновления будет завершена программа, на 3-й - завершает. Будет кому интересно, покажу код.

    Если это плохой метод, с удовольствием выслушаю конструктивную критику. :unsure:
  7. mialord
    Offline

    mialord Модераторы Команда форума Модератор

    Регистрация:
    31 июл 2009
    Сообщения:
    5.398
    Симпатии:
    40
    Баллы:
    54
    А зачем Вам выгонялка для обновления конфигурации, а динамическое обновление Вас чем не устраивает?
  8. TopicStarter Overlay
    ВикторТ
    Offline

    ВикторТ

    Регистрация:
    8 сен 2009
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
    А динамическое в случае изменения структуры не возможно. Или я ошибаюсь?
  9. mialord
    Offline

    mialord Модераторы Команда форума Модератор

    Регистрация:
    31 июл 2009
    Сообщения:
    5.398
    Симпатии:
    40
    Баллы:
    54
    Нет, не ошибаешься.

    Конечно интересно, выкладывай на обсуждение, если у тебя там секретов нету :unsure: .
  10. TopicStarter Overlay
    ВикторТ
    Offline

    ВикторТ

    Регистрация:
    8 сен 2009
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
    Да никаких секретов нет.

    Код:
    Процедура ПриНачалеРаботыСистемы()
    
    ПодключитьОбработчикОжидания("ЗавершитьРаботуПользователей", 60);	
    
    ...	
    КонецПроцедуры
    
    
    В нужный момент включаю блокировку. А след. процедура 1 раз в минуту проверяет наличие блокировки.

    Код:
    Процедура ЗавершитьРаботуПользователей() Экспорт
    //в 1-ю очередь проверим, нужно ли. Нужно только при включенной блокировке
    // Получим текущее значение параметров блокировки
    Блокировка = ПолучитьБлокировкуУстановкиСоединений();
    БлокировкаУстановлена = Блокировка.Установлена;
    
    Если Не БлокировкаУстановлена Тогда 
    Возврат;
    КонецЕсли;
    
    ПараметрБлокировки = Блокировка.Параметр;
    ПозицияРазделителя = Найти(ПараметрБлокировки, ";");
    Если ПозицияРазделителя = 0 Тогда 
    //это какая-то не наша блокировка
    Возврат;
    КонецЕсли;
    
    //Разберем 
    ИмяПользователяЗапуска = Лев(ПараметрБлокировки , ПозицияРазделителя-1);
    Команда                = Прав(ПараметрБлокировки , СтрДлина(ПараметрБлокировки) - ПозицияРазделителя);
    
    Если ИмяПользователяЗапуска = ИмяПользователя() Тогда
    Соединения = ПолучитьСоединенияИнформационнойБазы();
    Если Соединения.Количество() = 1 Тогда
    // Отключены все пользователи, кроме текущего сеанса
    КомандаСистемы(Команда);
    ЗавершитьРаботуСистемы(Ложь);
    Возврат;
    КонецЕсли; 
    ЗапущенныеСеансы="";
    для каждого соед из Соединения цикл
    Если НомерСоединенияИнформационнойБазы()=соед.НомерСоединения Тогда
    Продолжить;
    КонецЕсли;
    ЗапущенныеСеансы=ЗапущенныеСеансы
    +"Имя компьютера:"+СокрЛП(соед.ИмяКомпьютера)+"; "+
    +"Пользователь:"+СокрЛП(соед.Пользователь)
    +Символы.ПС;						
    КонецЦикла;
    Предупреждение("Ожидается завершение следуюих сеансов для обновления конфигурации:"+Символы.ПС
    +ЗапущенныеСеансы, 10); 
    Иначе
    ВремяНачалаБлокировки = Блокировка.Начало;
    Причина = Блокировка.Сообщение;
    ТекущееВремя = ТекущаяДата();
    РазницаРемени = ТекущееВремя - ВремяНачалаБлокировки;
    
    ПлюсТекст = "
    |Причина - "+Причина+". Несохраненные данные будут утеряны.";
    
    Если РазницаРемени <= 60 Тогда //1-е предупреждение
    Предупреждение("Закройте, пожалуйста, программу. Или работа будет завершена через 2 минуты. "+ПлюсТекст, 10);
    ИначеЕсли РазницаРемени <= 120 Тогда   //2-е предупреждение
    Предупреждение("Закройте, пожалуйста, программу. Или работа будет завершена через 1 минуту. "+ПлюсТекст, 10);
    ИначеЕсли РазницаРемени <= 180 Тогда //завершение работы с запросами о сохранении несохр.
    Предупреждение("Программа будет завершена сейчас. Причина - "+Причина, 10);
    ПрекратитьРаботуСистемы();//ЗавершитьРаботуСистемы(Ложь);
    Иначе                                //безусловное завершение работы
    ПрекратитьРаботуСистемы();
    КонецЕсли;
    КонецЕсли;
    
    КонецПроцедуры
    
    
    Перед завершением работы запускаю в пакетном режиме свое обновление конфигурации:
    "КомандаСистемы(Команда);", где команда равно "Start /D"+КаталогОбмена + "/B UpdateDB.bat"

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