Завершение работы пользователей




Завершение работы пользователей с помощью подключения обработчика ожидания.

Завершение работы пользователей с помощью подключения обработчика ожидания.

Когда базой пользуются  5-10 человек, можно поднять трубку и позвонить пользователям  или написать в какой-нибудь мессенджер и попросить  выйти из базы. А если у вас сотни пользователей и обработки со списком пользователей которых надо выбирать завершать, а как же уведомить пользователей, постоянно дергать админа кластера: «сделай пожалуйста….» Ну и так далее.

Задачи были следящие:

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

2.Завершить сеансы пользователей с возможностью сохранения данных.

3.Ну и для особо «Работящих», завершить без сохранения.

Решение получилось достаточно простым, теперь по порядку.

Первым делом создаем перечисление «РежимыЗавершенияРаботыПользователей»

Затем две константы «РежимЗавершенияРаботыПользователей» (ПеречислениеСсылка.РежимыЗавершенияРаботыПользователей) и «РежимЗавершенияРаботыПользователейТаймАут» (Число)

 

Нам потребуется общая форма:

В модуле данной формы пишем:

&НаСервере
Процедура ЗаписатьНаСервере()
Константы.РежимЗавершенияРаботыПользователей.Установить(ЭтотОбъект.РежимыЗавершенияРаботыПользователей);
Константы.РежимЗавершенияРаботыПользователейТаймАут.Установить(ЭтотОбъект.РежимЗавершенияРаботыПользователейТаймАут);
КонецПроцедуры

&НаКлиенте
Процедура Записать(Команда)
ЗаписатьНаСервере();
КонецПроцедуры

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ЭтотОбъект.РежимыЗавершенияРаботыПользователей = Константы.РежимЗавершенияРаботыПользователей.Получить();
ЭтотОбъект.РежимЗавершенияРаботыПользователейТаймАут = ЗавершенияРаботыПользователей.РежимЗавершенияРаботыПользователейТаймАут();
КонецПроцедуры

И наконец, создаем два общих модуля один для «Сервера» другой для «Клиента» (у меня это «ЗавершенияРаботыПользователей» и «ЗавершенияРаботыПользователейКлиент»)

Модуль ЗавершенияРаботыПользователейКлиент:

Процедура ОбработчикКонтрольРежимаЗавершенияРаботыПользователей() Экспорт

ТекущийРежим = ЗавершенияРаботыПользователей.ТекущийРежимЗавершенияРаботыПользователей();

Если ТекущийРежим = ЗавершенияРаботыПользователей.ПредупредитьПользователейОЗавершенииРаботы() Тогда
ВывестиПредупреждение("Работа системы будет завершена через несколько минут!", 10, "Завершение работы системы");
ИначеЕсли ТекущийРежим = ЗавершенияРаботыПользователей.ЗавершитьССохранениемДанныхПользователей() Тогда
ВывестиПредупреждение("Работа системы будет завершена!", 10, "Завершение работы системы");
ЗавершитьРаботуСистемы(Истина);
ИначеЕсли ТекущийРежим = ЗавершенияРаботыПользователей.ПрекратитьРаботуБезусловно() Тогда
ПрекратитьРаботуСистемы();
КонецЕсли;

КонецПроцедуры

Процедура УстановитьКонтрольРежимаЗавершенияРаботыПользователей() Экспорт
ТекущийРежим = ЗавершенияРаботыПользователей.ТекущийРежимЗавершенияРаботыПользователей();

Если ЗавершенияРаботыПользователей.РольДоступнаЗавершенияРаботыПользователей() Тогда
Если ТекущийРежим <> ЗавершенияРаботыПользователей.РазрешитьРаботу() Тогда
Если ЗавершенияРаботыПользователей.РежимыЗавершенияРаботыПользователейЗначениеЗаполнено() Тогда
ВывестиПредупреждение("Установлен режим завершения работы пользователей: " + ТекущийРежим + ".",10, "Завершение работы системы");
Иначе
ВывестиПредупреждение("Режим завершения работы пользователей не установлен.", 10, "Завершение работы системы");
КонецЕсли;
КонецЕсли;
Иначе
ОбработчикКонтрольРежимаЗавершенияРаботыПользователей();
ТаймАут = ЗавершенияРаботыПользователей.РежимЗавершенияРаботыПользователейТаймАут();
ПодключитьОбработчикОжидания("ОбработчикКонтрольРежимаЗавершенияРаботыПользователей", ТаймАут);
КонецЕсли;
КонецПроцедуры

Функция ВывестиПредупреждение(ТекстСообщения, ТаймАут = 0, Заголовок = "") Экспорт
Предупреждение(ТекстСообщения, ТаймАут, Заголовок);
КонецФункции

 

 Модуль ЗавершенияРаботыПользователей:

Функция ТекущийРежимЗавершенияРаботыПользователей() Экспорт
Возврат Константы.РежимЗавершенияРаботыПользователей.Получить();
КонецФункции

Функция РольДоступнаЗавершенияРаботыПользователей() Экспорт
Возврат РольДоступна("ПравоЗавершенияРаботыПользователей");
КонецФункции

Функция ПредупредитьПользователейОЗавершенииРаботы() Экспорт
Возврат Перечисления.РежимыЗавершенияРаботыПользователей.ПредупредитьПользователейОЗавершенииРаботы;
КонецФункции

Функция ЗавершитьССохранениемДанныхПользователей() Экспорт
Возврат Перечисления.РежимыЗавершенияРаботыПользователей.ЗавершитьССохранениемДанныхПользователей;
КонецФункции

Функция ПрекратитьРаботуБезусловно() Экспорт
Возврат Перечисления.РежимыЗавершенияРаботыПользователей.ПрекратитьРаботуБезусловно;
КонецФункции

Функция РазрешитьРаботу() Экспорт
Возврат Перечисления.РежимыЗавершенияРаботыПользователей.РазрешитьРаботу;
КонецФункции

Функция РежимыЗавершенияРаботыПользователейЗначениеЗаполнено() Экспорт
Возврат ЗначениеЗаполнено(Константы.РежимЗавершенияРаботыПользователей.Получить());
КонецФункции

Функция РежимЗавершенияРаботыПользователейТаймАут() Экспорт
Если ЗначениеЗаполнено(Константы.РежимЗавершенияРаботыПользователейТаймАут.Получить()) Тогда
ТаймАут = Константы.РежимЗавершенияРаботыПользователейТаймАут.Получить();
Иначе
ТаймАут = 60;
КонецЕсли;
Возврат ТаймАут;
КонецФункции

Теперь чтобы все заработало  нам необходимо добавить  строчку в модуль приложения:

Процедура ПриНачалеРаботыСистемы()
УстановитьКонтрольРежимаЗавершенияРаботыПользователей();
КонецПроцедуры

Описание:

Пользователям которые должны работать (администраторы, чтобы сделать обновления) даем Роль – «ЗавершенияРаботыПользователей». Таким пользователям при запуске базы  сообщается в каком режиме работает в данное время система. У всех остальных пользователей запускается обработчик ожидания "ОбработчикКонтрольРежимаЗавершенияРаботыПользователей", который в зависимости от установленного значения константы «РежимЗавершенияРаботыПользователей» с периодичностью константы «РежимЗавершенияРаботыПользователейТаймАут» выполняет действия:

— «ПредупредитьПользователейОЗавершенииРаботы» — пользователю выдается сообщение "Работа системы будет завершена через несколько минут!" с периодичностью константы «РежимЗавершенияРаботыПользователейТаймАут»;

— «ЗавершитьССохранениемДанныхПользователей» — пользователю выдается сообщение «Работа системы будет завершена!», после закрытия всех документов работа будет завершена;

— «ПрекратитьРаботуБезусловно» работа будет завершена без предупреждения пользователя.

В режиме «РазрешитьРаботу» сообщения никакие не выдаются

Обработка тестировалась на платформе  1С:Предприятие 8.3 (8.3.14.1694).

6 Comments

  1. Sedaiko

    Прикольно.

    Reply
  2. demon1981

    А чем не устроила типовая система завершения работы пользователей при помощи объекта БлокировкаСеансов.

    Reply
  3. user921814

    (2) конфигурация самописная. Это решение мне показалось гораздо проще чем решение из Библиотеки стандартных подсистем.

    Reply
  4. demon1981

    (3)а, я просто БСП в свою самописку внедрил 🙂

    Reply
  5. gaglo

    Решение практически совпадает с примененным в очень древнем УПП (1.0 — когда БСП, поди, еще не было).

    Reply
  6. webresurs

    Интересная разработка!

    Было бы ваше «ВАУУ» добавив выполнение по условию…

    — например,

    — в 12-00 предупреждать и завершать все сеансы

    — или при простое более 30 минут

    возможно?

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *