#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Заголовок = ?(ЗначениеЗаполнено(Параметры.Заголовок), Параметры.Заголовок, Заголовок);
Элементы.ТекстСообщенияОбОшибке.Заголовок = ?(ЗначениеЗаполнено(Параметры.ТекстСообщенияОбОшибке),
Параметры.ТекстСообщенияОбОшибке, Элементы.ТекстСообщенияОбОшибке.Заголовок);
ПроверитьМонопольныйРежимНаСервере();
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Если МонопольныйРежимДоступен Тогда
Отказ = Истина;
ВыполнитьОбработкуОповещения(ОписаниеОповещенияОЗакрытии, Ложь);
Возврат;
КонецЕсли;
Если Параметры.ЗавершатьВсеСеансыКромеТекущего Тогда
СоединенияИБКлиент.УстановитьПризнакЗавершитьВсеСеансыКромеТекущего(Истина);
КонецЕсли;
ПодключитьОбработчикОжидания("ПроверитьМонопольныйРежим", 30);
КонецПроцедуры
&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
Если Параметры.ЗавершатьВсеСеансыКромеТекущего Тогда
СоединенияИБКлиент.УстановитьПризнакЗавершитьВсеСеансыКромеТекущего(Ложь);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовШапкиФормы
&НаКлиенте
Процедура АктивныеПользователиНажатие(Элемент)
ПроверитьМонопольныйРежимНаСервере();
ОписаниеОповещения = Новый ОписаниеОповещения("ОткрытьСписокАктивныхПользователейЗавершение", ЭтотОбъект);
ОткрытьФорму("Обработка.АктивныеПользователи.Форма.АктивныеПользователи", , , , , ,
ОписаниеОповещения,
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
&НаКлиенте
Процедура АктивныеПользователи2Нажатие(Элемент)
ПроверитьМонопольныйРежимНаСервере();
ОписаниеОповещения = Новый ОписаниеОповещения("ОткрытьСписокАктивныхПользователейЗавершение", ЭтотОбъект);
ОткрытьФорму("Обработка.АктивныеПользователи.Форма.АктивныеПользователи" , , , , , ,
ОписаниеОповещения,
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиКомандФормы
&НаКлиенте
Процедура ЗавершитьСеансыИПовторить(Команда)
Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.Ожидание;
Элементы.ФормаПовторитьЗапускПрограммы.Видимость = Ложь;
Элементы.ФормаЗавершитьСеансыИПерезапуститьПрограмму.Видимость = Ложь;
ПроверитьМонопольныйРежим();
УстановитьБлокировкуФайловойБазы();
СоединенияИБКлиент.УстановитьРежимЗавершенияРаботыПользователей(Истина);
ПодключитьОбработчикОжидания("ОжидатьЗавершенияРаботыПользователей", 60);
КонецПроцедуры
&НаКлиенте
Процедура ОтменитьЗапускПрограммы(Команда)
ОтменитьБлокировкуФайловойБазы();
Закрыть(Истина);
КонецПроцедуры
&НаКлиенте
Процедура ПовторитьЗапускПрограммы(Команда)
Закрыть(Ложь);
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
&НаКлиенте
Процедура ОткрытьСписокАктивныхПользователейЗавершение(Результат, ДополнительныеПараметры) Экспорт
ПроверитьМонопольныйРежим();
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьМонопольныйРежим()
ПроверитьМонопольныйРежимНаСервере();
Если МонопольныйРежимДоступен Тогда
Закрыть(Ложь);
Возврат;
КонецЕсли;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура ОбновитьКоличествоАктивныхСеансов(Форма)
Если Форма.КоличествоАктивныхСеансов > 0 Тогда
ТекстГиперссылки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Активные пользователи (%1)'"),
Форма.КоличествоАктивныхСеансов);
Иначе
ТекстГиперссылки = НСтр("ru = 'Активные пользователи'");
КонецЕсли;
Форма.Элементы.АктивныеПользователи.Заголовок = ТекстГиперссылки;
Форма.Элементы.АктивныеПользователиОжидание.Заголовок = ТекстГиперссылки;
Форма.Элементы.АктивныеПользователи.РасширеннаяПодсказка.Заголовок = Форма.ОшибкаУстановкиМонопольногоРежима;
Форма.Элементы.АктивныеПользователиОжидание.РасширеннаяПодсказка.Заголовок = Форма.ОшибкаУстановкиМонопольногоРежима;
Если Форма.КоличествоАктивныхСеансов = 0 И ПустаяСтрока(Форма.ОшибкаУстановкиМонопольногоРежима) Тогда
Форма.Элементы.ТекстСообщенияОбОшибке.Заголовок = НСтр("ru = 'Другие пользователи уже завершили свою работу:'");
Форма.Элементы.ПояснениеПоОшибке.Заголовок = НСтр("ru = 'Для продолжения нажмите Повторить.'");
Иначе
Если ЗначениеЗаполнено(Форма.Параметры.ТекстСообщенияОбОшибкеЗавершенияРаботы) Тогда
ТекстСообщенияОбОшибке = Форма.Параметры.ТекстСообщенияОбОшибкеЗавершенияРаботы;
Иначе
ТекстСообщенияОбОшибке = НСтр("ru = 'Невозможно выполнить обновление версии приложения, т.к. не удалось завершить работу пользователей:'");
КонецЕсли;
Форма.Элементы.ТекстСообщенияОбОшибке.Заголовок = ТекстСообщенияОбОшибке;
Форма.Элементы.ПояснениеПоОшибке.Заголовок = НСтр("ru = 'Для продолжения необходимо завершить их работу.'");
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПроверитьМонопольныйРежимНаСервере()
СеансыИнформационнойБазы = ПолучитьСеансыИнформационнойБазы();
НомерСеансаТекущегоПользователя = НомерСеансаИнформационнойБазы();
КоличествоАктивныхСеансов = 0;
Для Каждого СеансИБ Из СеансыИнформационнойБазы Цикл
Если СеансИБ.ИмяПриложения = "Designer" И Не Параметры.ЗавершатьСеансКонфигуратора
Или СеансИБ.НомерСеанса = НомерСеансаТекущегоПользователя Тогда
Продолжить;
КонецЕсли;
КоличествоАктивныхСеансов = КоличествоАктивныхСеансов + 1;
КонецЦикла;
МонопольныйРежимДоступен = Ложь;
ОшибкаУстановкиМонопольногоРежима = "";
Если КоличествоАктивныхСеансов = 0 Тогда
Попытка
УстановитьМонопольныйРежим(Истина);
Исключение
ОшибкаУстановкиМонопольногоРежима = НСтр("ru = 'Техническая информация:'") + " "
+ ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
КонецПопытки;
Если МонопольныйРежим() Тогда
УстановитьМонопольныйРежим(Ложь);
КонецЕсли;
МонопольныйРежимДоступен = Истина;
КонецЕсли;
ОбновитьКоличествоАктивныхСеансов(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ОжидатьЗавершенияРаботыПользователей()
ПродолжительностьЗавершенияРаботыПользователей = ПродолжительностьЗавершенияРаботыПользователей + 1;
Если ПродолжительностьЗавершенияРаботыПользователей < 8 Тогда
Возврат;
КонецЕсли;
ОтменитьБлокировкуФайловойБазы();
Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.Информация;
ОбновитьКоличествоАктивныхСеансов(ЭтотОбъект);
Элементы.ФормаПовторитьЗапускПрограммы.Видимость = Истина;
Элементы.ФормаЗавершитьСеансыИПерезапуститьПрограмму.Видимость = Истина;
ОтключитьОбработчикОжидания("ОжидатьЗавершенияРаботыПользователей");
ПродолжительностьЗавершенияРаботыПользователей = 0;
КонецПроцедуры
&НаСервере
Процедура УстановитьБлокировкуФайловойБазы()
Объект.ЗапретитьРаботуПользователей = Истина;
Объект.НачалоДействияБлокировки = ТекущаяДатаСеанса() + 2*60;
ПериодБлокировки = ?(ЗначениеЗаполнено(Параметры.ПериодБлокировки), Параметры.ПериодБлокировки, 5*60);
Объект.ОкончаниеДействияБлокировки = Объект.НачалоДействияБлокировки + ПериодБлокировки;
Объект.СообщениеДляПользователей = ?(ЗначениеЗаполнено(Параметры.СообщениеПриВходеВПриложение), Параметры.СообщениеПриВходеВПриложение, НСтр("ru = 'Работа с приложением временно недоступна для обновления на новую версию.'"));
Попытка
РеквизитФормыВЗначение("Объект").ВыполнитьУстановку();
Исключение
ЗаписьЖурналаРегистрации(СоединенияИБ.СобытиеЖурналаРегистрации(),
УровеньЖурналаРегистрации.Ошибка,,,
ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
ОбщегоНазначения.СообщитьПользователю(ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецПроцедуры
&НаСервере
Процедура ОтменитьБлокировкуФайловойБазы()
РеквизитФормыВЗначение("Объект").ОтменитьБлокировку();
КонецПроцедуры
#КонецОбласти