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




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

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

Когда базой пользуются  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 не будет опубликован. Обязательные поля помечены *