27 марта 2011 г.

Выгонялка пользователей и 1С:Предприятия

Случалось ли вам для того что бы отключить всех пользователей от базы 1С подолгу обзванивать всех менеджеров, операторов, бухгалтеров и др. персонал. Что бы облегчить жизнь Вам и себе я написал обработку которая позволяет отключать пользователей с запросом в не зависимости от типа используемой базы данных (файл/сервер).Основное окно обработки отключения пользователей
Кратко о возможностях обработки:
  • отображение текущих пользователей;
  • выбор пользователей которых необходимо отключить;
  • запрет подключения после выхода пользователя из базы 1С:Предприятия;
  • установка/отключение монопольного режима;
  • «Быстрое отключение» пользователей;
  • Настройки времени ожидания до выключения и времени запрета подключения;
  • Корректировка текста предупреждения;
  • Выбор пользователя который будет иметь доступ после запрета подключения;
  • Обработка не зависит от используемой конфигурации.
Настройки обработки отключения пользователей
Что нужно сделать что бы обработка заработала:
  1. Создать регистр сведений: доОтключениеПользователей - непериодический и независимый.
    Измерения и ресурсы:
    • Пользователь – СправочникСсылка.Пользователи, Ведущее, Основной отбор;
    • Отключить – Булево;
    • ЗапретПодключения – Булево;
    • БыстроеОтключение – Булево;
    • СостояниеОтключения – Строка, длина 25 символов;
    • Сообщение – Строка, длина 300 символов;
    • ДатаВремяПуска – Дата, дата и время;
    • ОтключениеМинут – Число, Длина: 2, Точность: 0;
    • ПаузаДоОтключения – Число, Длина: 1, Точность: 0.
    Регистр сведений измерения и ресурсы
  2. Добавить общий модуль: доОтключениеПользователей - глобальный.
    Общий модуль
    // Процедура контроля возможности подключения.
    //
    Процедура СтартПроверкиОтключения(Отказ) Экспорт
       
    Пользователь = УправлениеПользователями.ОпределитьТекущегоПользователя();
       
    Зп = Новый Запрос;
       
    Зп.УстановитьПараметр("Пользователь",Пользователь);
       
    Зп.Текст = "ВЫБРАТЬ
        | доОтключениеПользователей.Пользователь,
        | доОтключениеПользователей.ЗапретПодключения,
        | доОтключениеПользователей.ДатаВремяПуска,
        | доОтключениеПользователей.ОтключениеМинут,
        | доОтключениеПользователей.ПаузаДоОтключения
        |ИЗ
        | РегистрСведений.доОтключениеПользователей КАК доОтключениеПользователей
        |ГДЕ
        | доОтключениеПользователей.Пользователь = &Пользователь"
    ;
       
    РезультатЗп = Зп.Выполнить().Выбрать();
        Если
    РезультатЗп.Следующий() Тогда
            Если
    РезультатЗп.ЗапретПодключения Тогда
               
    НеПодключать = Ложь;
               
    // Расчет времени не подключения
               
    ТекДата = ТекущаяДата();
               
    СтартДата = РезультатЗп.ДатаВремяПуска;
               
    ВремяПаузы = РезультатЗп.ОтключениеМинут * 60 + РезультатЗп.ПаузаДоОтключения * 15;
               
    ДельтаПаузы = ТекДата - СтартДата;
                Если
    ВремяПаузы > ДельтаПаузы Тогда
                   
    НеПодключать = Истина;
                КонецЕсли;
               
    // Конец Расчета времени не подключения
               
    Если НеПодключать Тогда
                   
    #Если Клиент Тогда
                       
    Предупреждение("Подключение запрещено. Ведутся сервисные работы.", 5, "Подключение...");
                   
    #КонецЕсли
                   
    Отказ = Истина;
                КонецЕсли;
            КонецЕсли;
        КонецЕсли;
       
    // Проверка и опрос состояния отключения
       
    ПодключитьОбработчикОжидания("ЦиклическийВызов",15);
    КонецПроцедуры
    // СтартПроверкиОтключения()

    // Процедура контроля отключения. Конечный автомат состояний отключения.
    //
    Процедура ЦиклическийВызов() Экспорт
       
    ОтклПользователей = РегистрыСведений.доОтключениеПользователей;
       
    Отбор = Новый Структура("Пользователь");
       
    Отбор.Пользователь = УправлениеПользователями.ОпределитьТекущегоПользователя();
       
    ВыборкаРегистра = ОтклПользователей.Выбрать(Отбор);
        Пока
    ВыборкаРегистра.Следующий() Цикл
           
    Запись = ВыборкаРегистра.ПолучитьМенеджерЗаписи();
           
    Запись.Прочитать();
           
    СостояниеОткл = СокрЛП(Запись.СостояниеОтключения);
           
    ВремяОткл = Запись.ПаузаДоОтключения;
            Если
    СостояниеОткл = "Предупреждение" Тогда
               
    СостОткл = "Ожидание";
               
    Запись.СостояниеОтключения = СостОткл;
               
    Запись.ПаузаДоОтключения = ВремяОткл*4;
               
    Запись.Записать();
               
    #Если Клиент Тогда
                   
    Сигнал();
                   
    Сигнал();
                   
    Сигнал();
                   
    Предупреждение(Запись.Сообщение,15,"Предупреждение");
               
    #КонецЕсли
           
    ИначеЕсли СостояниеОткл = "Ожидание" Тогда
               
    Время = ВремяОткл;
               
    Время = Время - 1;
                Если
    Время = 0 Тогда
                   
    СостОткл = "Предупреждение +";
                Иначе
                   
    СостОткл = "Ожидание";
                КонецЕсли;
               
    Запись.СостояниеОтключения = СостОткл;
               
    Запись.ПаузаДоОтключения = Время;
               
    Запись.Записать();
            ИначеЕсли
    СостояниеОткл = "Предупреждение +" Тогда
               
    СостОткл = "Мини Ожидание";
               
    Запись.СостояниеОтключения = СостОткл;
               
    Запись.ПаузаДоОтключения = 2;
               
    Запись.Записать();
               
    #Если Клиент Тогда
                   
    Сигнал();
                   
    Сигнал();
                   
    Сигнал();
                   
    Предупреждение(Запись.Сообщение,15,"Предупреждение!");
               
    #КонецЕсли
           
    ИначеЕсли СостояниеОткл = "Мини Ожидание" Тогда
               
    Время = ВремяОткл;
               
    Время = Время - 1;
                Если
    Время = 0 Тогда
                   
    СостОткл = "Отключение с запросом";
                Иначе
                   
    СостОткл = "Мини Ожидание";
                КонецЕсли;
               
    Запись.СостояниеОтключения = СостОткл;
               
    Запись.ПаузаДоОтключения = Время;
               
    Запись.Записать();
            ИначеЕсли
    СостояниеОткл = "Отключение с запросом" Тогда
               
    СостОткл = "Сеанс выключен";
               
    Запись.СостояниеОтключения = СостОткл;
               
    Запись.Записать();
               
    #Если Клиент Тогда
                   
    Сигнал();
                   
    Сигнал();
                   
    Сигнал();
                   
    Предупреждение("Извините но вы не предприняли никаких действий.",5,"Отключение.");
                   
    ЗавершитьРаботуСистемы();
               
    #КонецЕсли
           
    ИначеЕсли СостояниеОткл = "Сеанс выключен" Тогда
               
    СтопПроверкиОтключения();
               
    #Если Клиент Тогда
                   
    Сигнал();
                   
    Сигнал();
                   
    Сигнал();
                   
    Предупреждение("Тушим...",5,"Отключение.");
                   
    ПрекратитьРаботуСистемы();
               
    #КонецЕсли
           
    КонецЕсли;
        КонецЦикла;
    КонецПроцедуры
    // ЦиклическийВызов()

    // Процедура контроля отключения.
    //
    Процедура СтопПроверкиОтключения() Экспорт
       
    ОтклПользователей = РегистрыСведений.доОтключениеПользователей;
       
    Отбор = Новый Структура("Пользователь");
       
    Отбор.Пользователь = УправлениеПользователями.ОпределитьТекущегоПользователя();
       
    ВыборкаРегистра = ОтклПользователей.Выбрать(Отбор);
        Пока
    ВыборкаРегистра.Следующий() Цикл
           
    Запись = ВыборкаРегистра.ПолучитьМенеджерЗаписи();
           
    Запись.Отключить = Ложь;
           
    Запись.СостояниеОтключения = "Неактивен";
           
    Запись.Записать();
        КонецЦикла;
    КонецПроцедуры
    // СтопПроверкиОтключения()
  3. Добавить в модуль приложения в предопределенные процедуры код:
    Процедура ПередНачаломРаботыСистемы(Отказ)
       
    // ... типовые операции
        // Типовый вызовы отключения пользователей
       
    СтартПроверкиОтключения(Отказ);
    КонецПроцедуры

    Процедура
    ПриЗавершенииРаботыСистемы()
       
    // ... типовые операции
        // Типовый вызовы отключения пользователей
       
    СтопПроверкиОтключения();
    КонецПроцедуры
  4. Интегрировать обработку из файла по ссылке:Обработка отключения пользователей
    Скачать обработку отключения пользователей
PS Обработка для 1С предприятия 8.1. Для 8.2 (неуправляемого интерфейса) достаточно открыть эту обработку в конфигураторе, остальные операции аналогичны.

Upd Если у Вас возникло сообщение
{Форма.СервисФорма(139)}: Ошибка при вызове метода контекста (Выбрать): Недопустимое значение параметра (параметр номер '1')
ВыборкаРегистра = ОтклПользователей.Выбрать(Отбор);
по причине:
Недопустимое значение параметра (параметр номер '1')
то необходимо проверить настройки измерения у регистра сведений доОтключениеПользователей
Настройки измерения

4 комментария:

  1. 3.Добавить в модуль приложения в предопределенные процедуры код:

    подскажи пожалуйста где найти модуль приложение?

    ОтветитьУдалить
  2. Открываешь дерево конфигурации - Правой кнопкой на названии конфигурации - Открыть модуль приложения(8.1)/Открыть модуль обычного приложения(8.2)

    ОтветитьУдалить
  3. У меня при обращении к внешней обработке доотключеняпользователей выдает ошибку:

    {Форма.СервисФорма.Форма(139)}: Ошибка при вызове метода контекста (Выбрать)
    ВыборкаРегистра = ОтклПользователей.Выбрать(Отбор);
    по причине:
    Недопустимое значение параметра (параметр номер '1')

    ОтветитьУдалить
  4. icq: 287384457
    mail: kojin.nova@gmail.com

    ОтветитьУдалить