Отправляет email-рассылки с помощью сервиса Sendsay

Записки программиста

  Все выпуски  

Записки программиста Все на выход


На днях пришлось знакомому админу рассказывать про систему отключения пользователей от базы. Может кто встречал другие варианты, но я когда-то реализовал и до сих пор пользуюсь нехитрым способом.
Основной элемент всей конструкции - процедура

ОбработкаОжидания(ИмяПроцедуры,Интервал)

ей в качестве параметра ИмяПроцедуры передаем процедуру, которая будет запускаться каждые Интервал секунд. Т.е. основная идея - каждые полминуты или минуту проверяем Что-То и если есть необходимость вызываем

ЗавершитьРаботуСистемы()

Были разные идеи:
1. Файлик-семафор
в принципе годится для управления системой не имея возможности запуска 1С, например для управления через командный файл, скрипт, какая-нибудь система с командами, отправляемыми через электропочту, SMS ну и тому подобное. Как вариант может быть внедрен обработчик разных семафоров для выполнения разных команд внутри самой 1С.
2. Справочник с сообщениями
это на случай, когда в конфигурации уже работает система сообщений между пользователями основанная на справочнике, в который записывается текст сообщения и его получатель, специальный обработчик просматривает справочник и у требуемого пользователя выводит сообщение, либо выполняет какую-то команду, в нашем случае - закрывает программу.
3. Константа со значением - флагом
а вот на таком варианте я и остановился, и вот почему: на изменение константы можно поставить права на изменение и застраховаться от любопытных-продвинутых пользователей, в случае с файлом это можно сделать только при использовании файловой системы NTFS, что не всегда возможно; со значением из константы проще работать ну и для внедрения это вариант полегче.

Значит итог таков, для работы всей системы необходимо:

1. завести константу ФлагЗавершенияРаботы;
2. написать процедуру Администратор(), эта процедура будет обрабатывать значение константы и производить нужные действия;
3. прописать вызов процедуры с помощью стандартной процедуры ОбработкаОжидания().

Немного о том, что попалось интересного в реализации процедуры.
Во-первых это проверка имени пользователя или набора его прав или имени компьютера, тут можно варьировать по ситуации - т.е. отключение сработки процедуры при каком-то условии. Это понадобится чтобы самого админа не выкидывало из программы.
Во-вторых не стоит сразу выкидывать пользователей, все-таки некоторые могут быть заняты серьезным делом. Поэтому лучше для начала их предупредить. Значит по какому-то значению константы-флага не закрываем программу, а выдаем предупреждение. Здесь тоже есть подводный камень - процедуру Предупреждение() следует вызвать обязательно с указанием параметра задержки ожидания, иначе если пользователя не будет на месте программа останется открытой пока кто-нибудь не нажмет кнопку ОК.
В-третьих некоторые конфигурации обрабатывают событие ПриЗавершенииРаботыСистемы() где может содержаться запрос подтверждения выхода, поэтому если нам нужен безусловный выход, нужно подправить и эту процедуру.
И последнее, чтобы не дожидаться сработки по таймауту, можно вызов процедуры Администратор() добавить еще и в стандартную процедуру ПриНачалеРаботыСистемы()
Учитывая изложенные комментарии привожу то, что получилось:


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

        глПринудительноеЗавершениеРаботы=1;
        ЗавершитьРаботуСистемы(0);
    ИначеЕсли СокрЛП(ФлагЗавершения)<>"" Тогда
        Предупреждение("ув. "+ИмяПольз+", администратор системы просит вас закончить работу с программой и закрыть ее."+РазделительСтрок+"
        |"+ВРег(СокрЛП(ФлагЗавершения)),15);
    КонецЕсли;
КонецПроцедуры


В указаной процедуре использована еще одна хитрость - если в константу-флаг записана единица, то произойдет завершение работы, если она не пустая, то ее содержимое будет выведено в сообщении и может быть использовано как комментарий к просьбе о завершении работы.

В избранное