Завершение работы пользователей с помощью подключения обработчика ожидания.
Когда базой пользуются 5-10 человек, можно поднять трубку и позвонить пользователям или написать в какой-нибудь мессенджер и попросить выйти из базы. А если у вас сотни пользователей и обработки со списком пользователей которых надо выбирать завершать, а как же уведомить пользователей, постоянно дергать админа кластера: «сделай пожалуйста….» Ну и так далее.
Задачи были следящие:
1.Уведомить всех пользователей базы о скором выключении базы.
2.Завершить сеансы пользователей с возможностью сохранения данных.
3.Ну и для особо «Работящих», завершить без сохранения.
Решение получилось достаточно простым, теперь по порядку.
Первым делом создаем перечисление «РежимыЗавершенияРаботыПользователей»
Затем две константы «РежимЗавершенияРаботыПользователей» (ПеречислениеСсылка.РежимыЗавершенияРаботыПользователей) и «РежимЗавершенияРаботыПользователейТаймАут» (Число)
Нам потребуется общая форма:
В модуле данной формы пишем:
&НаСервере
Процедура ЗаписатьНаСервере()
Константы.РежимЗавершенияРаботыПользователей.Установить(ЭтотОбъект.РежимыЗавершенияРаботыПользователей);
Константы.РежимЗавершенияРаботыПользователейТаймАут.Установить(ЭтотОбъект.РежимЗавершенияРаботыПользователейТаймАут);
КонецПроцедуры
&НаКлиенте
Процедура Записать(Команда)
ЗаписатьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ЭтотОбъект.РежимыЗавершенияРаботыПользователей = Константы.РежимЗавершенияРаботыПользователей.Получить();
ЭтотОбъект.РежимЗавершенияРаботыПользователейТаймАут = ЗавершенияРаботыПользователей.РежимЗавершенияРаботыПользователейТаймАут();
КонецПроцедуры
И наконец, создаем два общих модуля один для «Сервера» другой для «Клиента» (у меня это «ЗавершенияРаботыПользователей» и «ЗавершенияРаботыПользователейКлиент»)
Модуль ЗавершенияРаботыПользователейКлиент:
Процедура ОбработчикКонтрольРежимаЗавершенияРаботыПользователей() Экспорт
ТекущийРежим = ЗавершенияРаботыПользователей.ТекущийРежимЗавершенияРаботыПользователей();
Если ТекущийРежим = ЗавершенияРаботыПользователей.ПредупредитьПользователейОЗавершенииРаботы() Тогда
ВывестиПредупреждение("Работа системы будет завершена через несколько минут!", 10, "Завершение работы системы");
ИначеЕсли ТекущийРежим = ЗавершенияРаботыПользователей.ЗавершитьССохранениемДанныхПользователей() Тогда
ВывестиПредупреждение("Работа системы будет завершена!", 10, "Завершение работы системы");
ЗавершитьРаботуСистемы(Истина);
ИначеЕсли ТекущийРежим = ЗавершенияРаботыПользователей.ПрекратитьРаботуБезусловно() Тогда
ПрекратитьРаботуСистемы();
КонецЕсли;
КонецПроцедуры
Процедура УстановитьКонтрольРежимаЗавершенияРаботыПользователей() Экспорт
ТекущийРежим = ЗавершенияРаботыПользователей.ТекущийРежимЗавершенияРаботыПользователей();
Если ЗавершенияРаботыПользователей.РольДоступнаЗавершенияРаботыПользователей() Тогда
Если ТекущийРежим <> ЗавершенияРаботыПользователей.РазрешитьРаботу() Тогда
Если ЗавершенияРаботыПользователей.РежимыЗавершенияРаботыПользователейЗначениеЗаполнено() Тогда
ВывестиПредупреждение("Установлен режим завершения работы пользователей: " + ТекущийРежим + ".",10, "Завершение работы системы");
Иначе
ВывестиПредупреждение("Режим завершения работы пользователей не установлен.", 10, "Завершение работы системы");
КонецЕсли;
КонецЕсли;
Иначе
ОбработчикКонтрольРежимаЗавершенияРаботыПользователей();
ТаймАут = ЗавершенияРаботыПользователей.РежимЗавершенияРаботыПользователейТаймАут();
ПодключитьОбработчикОжидания("ОбработчикКонтрольРежимаЗавершенияРаботыПользователей", ТаймАут);
КонецЕсли;
КонецПроцедуры
Функция ВывестиПредупреждение(ТекстСообщения, ТаймАут = 0, Заголовок = "") Экспорт
Предупреждение(ТекстСообщения, ТаймАут, Заголовок);
КонецФункции
Модуль ЗавершенияРаботыПользователей:
Функция ТекущийРежимЗавершенияРаботыПользователей() Экспорт
Возврат Константы.РежимЗавершенияРаботыПользователей.Получить();
КонецФункции
Функция РольДоступнаЗавершенияРаботыПользователей() Экспорт
Возврат РольДоступна("ПравоЗавершенияРаботыПользователей");
КонецФункции
Функция ПредупредитьПользователейОЗавершенииРаботы() Экспорт
Возврат Перечисления.РежимыЗавершенияРаботыПользователей.ПредупредитьПользователейОЗавершенииРаботы;
КонецФункции
Функция ЗавершитьССохранениемДанныхПользователей() Экспорт
Возврат Перечисления.РежимыЗавершенияРаботыПользователей.ЗавершитьССохранениемДанныхПользователей;
КонецФункции
Функция ПрекратитьРаботуБезусловно() Экспорт
Возврат Перечисления.РежимыЗавершенияРаботыПользователей.ПрекратитьРаботуБезусловно;
КонецФункции
Функция РазрешитьРаботу() Экспорт
Возврат Перечисления.РежимыЗавершенияРаботыПользователей.РазрешитьРаботу;
КонецФункции
Функция РежимыЗавершенияРаботыПользователейЗначениеЗаполнено() Экспорт
Возврат ЗначениеЗаполнено(Константы.РежимЗавершенияРаботыПользователей.Получить());
КонецФункции
Функция РежимЗавершенияРаботыПользователейТаймАут() Экспорт
Если ЗначениеЗаполнено(Константы.РежимЗавершенияРаботыПользователейТаймАут.Получить()) Тогда
ТаймАут = Константы.РежимЗавершенияРаботыПользователейТаймАут.Получить();
Иначе
ТаймАут = 60;
КонецЕсли;
Возврат ТаймАут;
КонецФункции
Теперь чтобы все заработало нам необходимо добавить строчку в модуль приложения:
Процедура ПриНачалеРаботыСистемы()
УстановитьКонтрольРежимаЗавершенияРаботыПользователей();
КонецПроцедуры
Описание:
Пользователям которые должны работать (администраторы, чтобы сделать обновления) даем Роль – «ЗавершенияРаботыПользователей». Таким пользователям при запуске базы сообщается в каком режиме работает в данное время система. У всех остальных пользователей запускается обработчик ожидания "ОбработчикКонтрольРежимаЗавершенияРаботыПользователей", который в зависимости от установленного значения константы «РежимЗавершенияРаботыПользователей» с периодичностью константы «РежимЗавершенияРаботыПользователейТаймАут» выполняет действия:
— «ПредупредитьПользователейОЗавершенииРаботы» — пользователю выдается сообщение "Работа системы будет завершена через несколько минут!" с периодичностью константы «РежимЗавершенияРаботыПользователейТаймАут»;
— «ЗавершитьССохранениемДанныхПользователей» — пользователю выдается сообщение «Работа системы будет завершена!», после закрытия всех документов работа будет завершена;
— «ПрекратитьРаботуБезусловно» работа будет завершена без предупреждения пользователя.
В режиме «РазрешитьРаботу» сообщения никакие не выдаются
Обработка тестировалась на платформе 1С:Предприятие 8.3 (8.3.14.1694).
Прикольно.
А чем не устроила типовая система завершения работы пользователей при помощи объекта БлокировкаСеансов.
(2) конфигурация самописная. Это решение мне показалось гораздо проще чем решение из Библиотеки стандартных подсистем.
(3)а, я просто БСП в свою самописку внедрил 🙂
Решение практически совпадает с примененным в очень древнем УПП (1.0 — когда БСП, поди, еще не было).
Интересная разработка!
Было бы ваше «ВАУУ» добавив выполнение по условию…
— например,
— в 12-00 предупреждать и завершать все сеансы
— или при простое более 30 минут
возможно?