722 lines
47 KiB
Plaintext
722 lines
47 KiB
Plaintext
///////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
// Copyright (c) 2024, ООО 1С-Софт
|
||
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
|
||
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
|
||
// Текст лицензии доступен по ссылке:
|
||
// https://creativecommons.org/licenses/by/4.0/legalcode
|
||
///////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
||
#Область СлужебныйПрограммныйИнтерфейс
|
||
|
||
// Открывает форму, в которой пользователь может сменить пароль.
|
||
Процедура ОткрытьФормуСменыПароля(Пользователь = Неопределено, ОбработкаПродолжения = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт
|
||
|
||
ПараметрыФормы = Новый Структура;
|
||
ПараметрыФормы.Вставить("ВернутьПарольБезУстановки", Ложь);
|
||
ПараметрыФормы.Вставить("СтарыйПароль", Неопределено);
|
||
ПараметрыФормы.Вставить("ИмяДляВхода", "");
|
||
Если ДополнительныеПараметры <> Неопределено Тогда
|
||
ЗаполнитьЗначенияСвойств(ПараметрыФормы, ДополнительныеПараметры);
|
||
КонецЕсли;
|
||
ПараметрыФормы.Вставить("Пользователь", Пользователь);
|
||
|
||
ОткрытьФорму("ОбщаяФорма.СменаПароля", ПараметрыФормы,,,,, ОбработкаПродолжения);
|
||
|
||
КонецПроцедуры
|
||
|
||
// См. ПользователиСлужебныйВМоделиСервисаКлиент.ЗапроситьПарольДляАутентификацииВСервисе.
|
||
Процедура ЗапроситьПарольДляАутентификацииВСервисе(ОбработкаПродолжения, ФормаВладелец = Неопределено, ПарольПользователяСервиса = Неопределено) Экспорт
|
||
|
||
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПользователиВМоделиСервиса") Тогда
|
||
|
||
МодульПользователиСлужебныйВМоделиСервисаКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль(
|
||
"ПользователиСлужебныйВМоделиСервисаКлиент");
|
||
|
||
МодульПользователиСлужебныйВМоделиСервисаКлиент.ЗапроситьПарольДляАутентификацииВСервисе(
|
||
ОбработкаПродолжения, ФормаВладелец, ПарольПользователяСервиса);
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
Процедура УстановитьИнтерактивнуюОбработкуПриОшибкеНедостаточноПравДляВходаВПрограмму(Параметры, ОписаниеОшибки) Экспорт
|
||
|
||
Параметры.Отказ = Истина;
|
||
Параметры.ИнтерактивнаяОбработка = Новый ОписаниеОповещения(
|
||
"ИнтерактивнаяОбработкаПриОшибкеНедостаточноПравДляВходаВПрограмму", ЭтотОбъект, ОписаниеОшибки);
|
||
|
||
КонецПроцедуры
|
||
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
// Для работы интерфейса ролей в управляемой форме.
|
||
|
||
// Только для внутреннего использования.
|
||
//
|
||
// Параметры:
|
||
// Форма - ФормаКлиентскогоПриложения
|
||
// Безусловно - Булево
|
||
//
|
||
Процедура РазвернутьПодсистемыРолей(Форма, Безусловно = Истина) Экспорт
|
||
|
||
Элементы = Форма.Элементы;
|
||
|
||
Если НЕ Безусловно
|
||
И НЕ Элементы.РолиПоказатьТолькоВыбранныеРоли.Пометка Тогда
|
||
|
||
Возврат;
|
||
КонецЕсли;
|
||
|
||
// Развернуть все.
|
||
Для каждого СтрокаТаблицы Из Форма.Роли.ПолучитьЭлементы() Цикл
|
||
Элементы.Роли.Развернуть(СтрокаТаблицы.ПолучитьИдентификатор(), Истина);
|
||
КонецЦикла;
|
||
|
||
КонецПроцедуры
|
||
|
||
// Только для внутреннего использования.
|
||
Процедура ВыбратьНазначение(ДанныеФормы, Заголовок, ВыбиратьПользователей = Истина, ЭтоОтбор = Ложь, ОписаниеОповещения = Неопределено) Экспорт
|
||
|
||
ДополнительныеПараметры = Новый Структура;
|
||
ДополнительныеПараметры.Вставить("ДанныеФормы", ДанныеФормы);
|
||
ДополнительныеПараметры.Вставить("ЭтоОтбор", ЭтоОтбор);
|
||
ДополнительныеПараметры.Вставить("ОписаниеОповещения", ОписаниеОповещения);
|
||
|
||
ОписаниеОповещенияОЗакрытии = Новый ОписаниеОповещения("ПослеВыбораНазначения", ЭтотОбъект, ДополнительныеПараметры);
|
||
|
||
Назначение = ?(ЭтоОтбор, ДанныеФормы.ВидПользователей, ДанныеФормы.Объект.Назначение);
|
||
|
||
ПараметрыФормы = Новый Структура;
|
||
ПараметрыФормы.Вставить("Заголовок", Заголовок);
|
||
ПараметрыФормы.Вставить("Назначение", Назначение);
|
||
ПараметрыФормы.Вставить("ВыбиратьПользователей", ВыбиратьПользователей);
|
||
ПараметрыФормы.Вставить("ЭтоОтбор", ЭтоОтбор);
|
||
ОткрытьФорму("ОбщаяФорма.ВыборТиповПользователей", ПараметрыФормы,,,,, ОписаниеОповещенияОЗакрытии);
|
||
|
||
КонецПроцедуры
|
||
|
||
///////////////////////////////////////////////////////////////////////////////
|
||
// Обработчики ожидания.
|
||
|
||
// Открывает окно предупреждения безопасности.
|
||
Процедура ПоказатьПредупреждениеБезопасности() Экспорт
|
||
|
||
ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске();
|
||
Ключ = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыРаботыКлиента, "КлючПредупрежденияБезопасности");
|
||
Если ЗначениеЗаполнено(Ключ) Тогда
|
||
ОткрытьФорму("ОбщаяФорма.ПредупреждениеБезопасности", Новый Структура("Ключ", Ключ));
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
Процедура ПриКонтролеПерезапускаПриСокращенииПравДоступа() Экспорт
|
||
ИнформироватьОПерезапускеПриложения();
|
||
КонецПроцедуры
|
||
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
// Обработчики событий подсистем конфигурации.
|
||
|
||
// См. ОбщегоНазначенияКлиентПереопределяемый.ПередНачаломРаботыСистемы.
|
||
Процедура ПередНачаломРаботыСистемы(Параметры) Экспорт
|
||
|
||
ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске();
|
||
|
||
Если ПараметрыКлиента.Свойство("ОшибкаНедостаточноПравДляВходаВПрограмму") Тогда
|
||
Параметры.ПолученныеПараметрыКлиента.Вставить("ОшибкаНедостаточноПравДляВходаВПрограмму");
|
||
УстановитьИнтерактивнуюОбработкуПриОшибкеНедостаточноПравДляВходаВПрограмму(Параметры,
|
||
ПараметрыКлиента.ОшибкаНедостаточноПравДляВходаВПрограмму);
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
// См. ОбщегоНазначенияКлиентПереопределяемый.ПередНачаломРаботыСистемы.
|
||
Процедура ПередНачаломРаботыСистемы2(Параметры) Экспорт
|
||
|
||
// Проверяет авторизацию пользователя и уведомляет об ошибке.
|
||
ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске();
|
||
|
||
Если ПараметрыКлиента.Свойство("ОшибкаАвторизации") Тогда
|
||
Параметры.Отказ = Истина;
|
||
Параметры.ИнтерактивнаяОбработка = Новый ОписаниеОповещения("ПоказатьПредупреждениеИПродолжить",
|
||
СтандартныеПодсистемыКлиент, ПараметрыКлиента.ОшибкаАвторизации);
|
||
Возврат;
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
// См. ОбщегоНазначенияКлиентПереопределяемый.ПередНачаломРаботыСистемы.
|
||
Процедура ПередНачаломРаботыСистемы3(Параметры) Экспорт
|
||
|
||
// Требует сменить пароль при необходимости.
|
||
ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске();
|
||
|
||
Если ПараметрыКлиента.Свойство("ТребуетсяСменитьПароль") Тогда
|
||
Параметры.ИнтерактивнаяОбработка = Новый ОписаниеОповещения(
|
||
"ИнтерактивнаяОбработкаПриСменеПароляПриЗапуске", ЭтотОбъект);
|
||
Возврат;
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
// См. ОбщегоНазначенияКлиентПереопределяемый.ПослеНачалаРаботыСистемы.
|
||
Процедура ПослеНачалаРаботыСистемы() Экспорт
|
||
|
||
ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске();
|
||
Ключ = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыРаботыКлиента, "КлючПредупрежденияБезопасности");
|
||
Если ЗначениеЗаполнено(Ключ) Тогда
|
||
// Небольшая задержка чтобы платформа успела отрисовать текущее окно, поверх которого выводится окно предупреждения.
|
||
ПодключитьОбработчикОжидания("ПоказатьПредупреждениеБезопасностиПослеЗапуска", 0.3, Истина);
|
||
КонецЕсли;
|
||
|
||
Если ПараметрыРаботыКлиента.Свойство("ЗадатьВопросПроОтключениеOpenIDConnect") Тогда
|
||
ОповещениеНажатия = Новый ОписаниеОповещения("ЗадатьВопросПроОтключениеOpenIDConnect", ЭтотОбъект);
|
||
ЗаголовокСообщения = НСтр("ru = 'Предупреждение безопасности'");
|
||
ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
|
||
НСтр("ru = 'Отключите аутентификацию %1, если не используется.'"), "OpenID-Connect");
|
||
ПоказатьОповещениеПользователя(ЗаголовокСообщения, ОповещениеНажатия,
|
||
ТекстСообщения, БиблиотекаКартинок.ДиалогВосклицание, СтатусОповещенияПользователя.Важное);
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
// См. СтандартныеПодсистемыКлиент.ПриПолученииСерверногоОповещения.
|
||
Процедура ПриПолученииСерверногоОповещения(ИмяОповещения, Результат) Экспорт
|
||
|
||
Если Результат = "ВходВПрограммуЗапрещен" Тогда
|
||
ПрекратитьПерезапускПриложения();
|
||
ОткрытьФорму("ОбщаяФорма.ВходВПрограммуЗапрещен");
|
||
|
||
ИначеЕсли Результат = "РолиСокращены" Тогда
|
||
НачатьПерезапускПриложения();
|
||
|
||
ИначеЕсли Результат = "РолиРасширены" Тогда
|
||
ПрекратитьПерезапускПриложения();
|
||
ПоказатьОповещениеПользователя(
|
||
НСтр("ru = 'Права доступа обновлены'"),
|
||
"e1cib/app/ОбщаяФорма.КонтрольИзмененияРолейПользователяИБ",
|
||
НСтр("ru = 'Перезапустите приложение, чтобы они вступили в силу.'"),
|
||
БиблиотекаКартинок.ДиалогВосклицание,
|
||
СтатусОповещенияПользователя.Важное,
|
||
"КонтрольИзмененияРолейПользователяИБ");
|
||
|
||
ИначеЕсли ТипЗнч(Результат) = Тип("Число") Тогда
|
||
ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
|
||
НСтр("ru = 'Через %1 приложение станет недоступным.
|
||
|Если требуется продлить срок, обратитесь к администратору.'"),
|
||
Формат(Результат, "ЧГ=") + " "
|
||
+ ПользователиСлужебныйКлиентСервер.ПредметЦелогоЧисла(Результат,
|
||
"", НСтр("ru = 'день,дня,дней,,,,,,0'")));
|
||
|
||
ПоказатьОповещениеПользователя(
|
||
НСтр("ru = 'Истекает срок действия входа'"),,
|
||
ТекстСообщения,
|
||
БиблиотекаКартинок.ДиалогВосклицание,
|
||
СтатусОповещенияПользователя.Важное,
|
||
"ИстечениеСрокаДействияПользователяВПриложении");
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
#КонецОбласти
|
||
|
||
#Область СлужебныеПроцедурыИФункции
|
||
|
||
///////////////////////////////////////////////////////////////////////////////
|
||
// Обработчики оповещений.
|
||
|
||
// Предупреждает пользователя об ошибке недостатка прав для входа в программу.
|
||
Процедура ИнтерактивнаяОбработкаПриОшибкеНедостаточноПравДляВходаВПрограмму(Параметры, ОписаниеОшибки) Экспорт
|
||
|
||
ПоказатьПредупреждение(
|
||
Новый ОписаниеОповещения("ИнтерактивнаяОбработкаПриОшибкеНедостаточноПравДляВходаВПрограммуПослеПредупреждения",
|
||
ЭтотОбъект, Параметры),
|
||
ОписаниеОшибки);
|
||
|
||
КонецПроцедуры
|
||
|
||
// Завершает работу после предупреждения пользователя об ошибке недостатка прав для входа в программу.
|
||
Процедура ИнтерактивнаяОбработкаПриОшибкеНедостаточноПравДляВходаВПрограммуПослеПредупреждения(Параметры) Экспорт
|
||
|
||
ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения);
|
||
|
||
КонецПроцедуры
|
||
|
||
// Предлагает пользователю сменить пароль или завершить работу.
|
||
Процедура ИнтерактивнаяОбработкаПриСменеПароляПриЗапуске(Параметры, Контекст) Экспорт
|
||
|
||
ПараметрыФормы = Новый Структура;
|
||
ПараметрыФормы.Вставить("ПриВходеВПрограмму", Истина);
|
||
|
||
ОткрытьФорму("ОбщаяФорма.СменаПароля", ПараметрыФормы,,,,, Новый ОписаниеОповещения(
|
||
"ИнтерактивнаяОбработкаПриСменеПароляПриЗапускеЗавершение", ЭтотОбъект, Параметры));
|
||
|
||
КонецПроцедуры
|
||
|
||
// Продолжение процедуры ИнтерактивнаяОбработкаПриСменеПароляПриЗапуске.
|
||
Процедура ИнтерактивнаяОбработкаПриСменеПароляПриЗапускеЗавершение(Результат, Параметры) Экспорт
|
||
|
||
Если Не ЗначениеЗаполнено(Результат) Тогда
|
||
Параметры.Отказ = Истина;
|
||
КонецЕсли;
|
||
|
||
ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения);
|
||
|
||
КонецПроцедуры
|
||
|
||
// Предлагает отключить аутентификацию OpenID-Connect после запуска.
|
||
Процедура ЗадатьВопросПроОтключениеOpenIDConnect(Контекст) Экспорт
|
||
|
||
ОбработкаЗавершения = Новый ОписаниеОповещения(
|
||
"ЗадатьВопросПроОтключениеOpenIDConnectЗавершение", ЭтотОбъект);
|
||
|
||
ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
|
||
НСтр("ru = 'Для пользователей включена аутентификация %1.
|
||
|Если такой вид аутентификации не используется, рекомендуется его отключить.'"),
|
||
"OpenID-Connect");
|
||
|
||
Кнопки = Новый СписокЗначений;
|
||
Кнопки.Добавить("ОтключитьУВсехПользователей", НСтр("ru = 'Отключить у всех пользователей'"));
|
||
Кнопки.Добавить("НеОтключать", НСтр("ru = 'Не отключать'"));
|
||
Кнопки.Добавить("НапомнитьПозже", НСтр("ru = 'Напомнить позже'"));
|
||
|
||
ДополнительныеПараметры = СтандартныеПодсистемыКлиент.ПараметрыВопросаПользователю();
|
||
ДополнительныеПараметры.Заголовок = НСтр("ru = 'Предупреждение безопасности'");
|
||
ДополнительныеПараметры.ПредлагатьБольшеНеЗадаватьЭтотВопрос = Ложь;
|
||
|
||
СтандартныеПодсистемыКлиент.ПоказатьВопросПользователю(ОбработкаЗавершения,
|
||
ТекстВопроса, Кнопки, ДополнительныеПараметры);
|
||
|
||
КонецПроцедуры
|
||
|
||
// Продолжение процедуры ЗадатьВопросПроОтключениеOpenIDConnect.
|
||
Процедура ЗадатьВопросПроОтключениеOpenIDConnectЗавершение(Результат, Параметры) Экспорт
|
||
|
||
Ответ = ?(Результат <> Неопределено, Результат.Значение, "НапомнитьПозже");
|
||
|
||
Если Ответ = "ОтключитьУВсехПользователей" Тогда
|
||
СтандартныеПодсистемыВызовСервера.ОбработатьОтветПроОтключениеOpenIDConnect(Истина);
|
||
ИначеЕсли Ответ = "НеОтключать" Тогда
|
||
СтандартныеПодсистемыВызовСервера.ОбработатьОтветПроОтключениеOpenIDConnect(Ложь);
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
// Записывает в форму результат выбора назначения.
|
||
//
|
||
// Параметры:
|
||
// РезультатЗакрытия - Неопределено
|
||
// - СписокЗначений
|
||
// ДополнительныеПараметры - Структура:
|
||
// * ДанныеФормы - ФормаКлиентскогоПриложения
|
||
// - РасширениеУправляемойФормыДляОбъектов:
|
||
// ** Объект - ДанныеФормыСтруктура
|
||
// ** Элементы - ВсеЭлементыФормы:
|
||
// *** ВыбратьНазначение - КнопкаФормы
|
||
// * ЭтоОтбор - Булево
|
||
// * ОписаниеОповещения - ОписаниеОповещения
|
||
//
|
||
Процедура ПослеВыбораНазначения(РезультатЗакрытия, ДополнительныеПараметры) Экспорт
|
||
|
||
Если РезультатЗакрытия = Неопределено Тогда
|
||
Возврат;
|
||
КонецЕсли;
|
||
|
||
Если Не ДополнительныеПараметры.ЭтоОтбор Тогда
|
||
Назначение = ДополнительныеПараметры.ДанныеФормы.Объект.Назначение;
|
||
Назначение.Очистить();
|
||
КонецЕсли;
|
||
|
||
МассивСинонимов = Новый Массив;
|
||
МассивТипов = Новый Массив;
|
||
|
||
Для Каждого Элемент Из РезультатЗакрытия Цикл
|
||
|
||
Если Элемент.Пометка Тогда
|
||
МассивСинонимов.Добавить(Элемент.Представление);
|
||
МассивТипов.Добавить(Элемент.Значение);
|
||
Если Не ДополнительныеПараметры.ЭтоОтбор Тогда
|
||
НоваяСтрока = Назначение.Добавить();
|
||
НоваяСтрока.ТипПользователей = Элемент.Значение;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
|
||
КонецЦикла;
|
||
|
||
ЗаголовокЭлемента = СтрСоединить(МассивСинонимов, ", ");
|
||
|
||
Если ДополнительныеПараметры.ЭтоОтбор Тогда
|
||
ДополнительныеПараметры.ДанныеФормы.ВидПользователей = ЗаголовокЭлемента;
|
||
Иначе
|
||
ДополнительныеПараметры.ДанныеФормы.Элементы.ВыбратьНазначение.Заголовок = ЗаголовокЭлемента;
|
||
КонецЕсли;
|
||
|
||
Если ДополнительныеПараметры.ОписаниеОповещения <> Неопределено Тогда
|
||
ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещения, МассивТипов);
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
///////////////////////////////////////////////////////////////////////////////
|
||
// Процедуры и функции обработки "НастройкиПользователей".
|
||
|
||
// Предназначена для открытия переданного отчета или формы.
|
||
//
|
||
// Параметры:
|
||
// ТекущийЭлемент - ТаблицаФормы - выделенная строка дерева значений.
|
||
// Пользователь - Строка - имя пользователя информационной базы,
|
||
// ТекущийПользователь - Строка - имя пользователя информационной базы, для открытия формы
|
||
// должен совпадать значением параметра "Пользователь".
|
||
// ИмяФормыПерсональныхНастроек - Строка - путь для открытия формы персональных настроек.
|
||
// Вида "ОбщаяФорма.НазваниеФормы".
|
||
//
|
||
Процедура ОткрытьОтчетИлиФорму(ТекущийЭлемент, Пользователь, ТекущийПользователь, ИмяФормыПерсональныхНастроек) Экспорт
|
||
|
||
ЭлементДереваЗначений = ТекущийЭлемент;
|
||
Если ЭлементДереваЗначений.ТекущиеДанные = Неопределено Тогда
|
||
Возврат;
|
||
КонецЕсли;
|
||
|
||
Если Пользователь <> ТекущийПользователь Тогда
|
||
ТекстПредупреждения =
|
||
НСтр("ru = 'Для просмотра настроек другого пользователя необходимо
|
||
|запустить приложение от его имени и открыть нужную настройку.'");
|
||
ПоказатьПредупреждение(,ТекстПредупреждения);
|
||
Возврат;
|
||
КонецЕсли;
|
||
|
||
Если ЭлементДереваЗначений.Имя = "НастройкиОтчетовДерево" Тогда
|
||
|
||
КлючОбъекта = ЭлементДереваЗначений.ТекущиеДанные.Ключи[0].Значение;
|
||
КлючОбъектаМассивСтрок = СтрРазделить(КлючОбъекта, "/", Ложь);
|
||
КлючВарианта = КлючОбъектаМассивСтрок[1];
|
||
ПараметрыОтчета = Новый Структура("КлючВарианта, КлючПользовательскихНастроек", КлючВарианта, "");
|
||
|
||
Если ЭлементДереваЗначений.ТекущиеДанные.Тип = "НастройкаОтчета" Тогда
|
||
КлючПользовательскихНастроек = ЭлементДереваЗначений.ТекущиеДанные.Ключи[0].Представление;
|
||
ПараметрыОтчета.Вставить("КлючПользовательскихНастроек", КлючПользовательскихНастроек);
|
||
КонецЕсли;
|
||
|
||
ОткрытьФорму(КлючОбъектаМассивСтрок[0] + ".Форма", ПараметрыОтчета);
|
||
Возврат;
|
||
|
||
ИначеЕсли ЭлементДереваЗначений.Имя = "ВнешнийВид" Тогда
|
||
|
||
Для Каждого КлючОбъекта Из ЭлементДереваЗначений.ТекущиеДанные.Ключи Цикл
|
||
|
||
Если КлючОбъекта.Пометка = Истина Тогда
|
||
|
||
ИмяФормы = СтрРазделить(КлючОбъекта.Значение, "/")[0];
|
||
ИмяФормыЧастями = СтрРазделить(ИмяФормы, ".");
|
||
Пока ИмяФормыЧастями.Количество() > 4 Цикл
|
||
ИмяФормыЧастями.Удалить(4);
|
||
КонецЦикла;
|
||
ИмяФормы = СтрСоединить(ИмяФормыЧастями, ".");
|
||
ОткрытьФорму(ИмяФормы);
|
||
Возврат;
|
||
Иначе
|
||
РодительЭлемента = ЭлементДереваЗначений.ТекущиеДанные.ПолучитьРодителя();
|
||
|
||
Если ЭлементДереваЗначений.ТекущиеДанные.ТипСтроки = "НастройкиРабочегоСтола" Тогда
|
||
ПоказатьПредупреждение(,
|
||
НСтр("ru = 'Для просмотра настроек начальной страницы перейдите к разделу
|
||
|""Начальная страница"" в командном интерфейсе приложения.'"));
|
||
Возврат;
|
||
КонецЕсли;
|
||
|
||
Если ЭлементДереваЗначений.ТекущиеДанные.ТипСтроки = "НастройкиКомандногоИнтерфейса" Тогда
|
||
ПоказатьПредупреждение(,
|
||
НСтр("ru = 'Для просмотра настроек командного интерфейса
|
||
|выберите нужный раздел командного интерфейса приложения.'"));
|
||
Возврат;
|
||
КонецЕсли;
|
||
|
||
Если РодительЭлемента <> Неопределено Тогда
|
||
ТекстПредупреждения =
|
||
НСтр("ru = 'Для просмотра данной настройки откройте ""%1""
|
||
|и затем перейдите к форме ""%2"".'");
|
||
ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстПредупреждения,
|
||
РодительЭлемента.Настройка, ЭлементДереваЗначений.ТекущиеДанные.Настройка);
|
||
ПоказатьПредупреждение(,ТекстПредупреждения);
|
||
Возврат;
|
||
КонецЕсли;
|
||
|
||
КонецЕсли;
|
||
|
||
КонецЦикла;
|
||
|
||
ПоказатьПредупреждение(,НСтр("ru = 'Просмотр данной настройки не предусмотрен.'"));
|
||
Возврат;
|
||
|
||
ИначеЕсли ЭлементДереваЗначений.Имя = "ПрочиеНастройки" Тогда
|
||
|
||
Если ЭлементДереваЗначений.ТекущиеДанные.Тип = "ПерсональныеНастройки"
|
||
И ИмяФормыПерсональныхНастроек <> "" Тогда
|
||
ОткрытьФорму(ИмяФормыПерсональныхНастроек);
|
||
Возврат;
|
||
КонецЕсли;
|
||
|
||
ПоказатьПредупреждение(,НСтр("ru = 'Просмотр данной настройки не предусмотрен.'"));
|
||
Возврат;
|
||
|
||
КонецЕсли;
|
||
|
||
ПоказатьПредупреждение(,НСтр("ru = 'Выберите настройку для просмотра.'"));
|
||
|
||
КонецПроцедуры
|
||
|
||
// Предназначена для формирования строки пояснения при копировании настроек.
|
||
//
|
||
// Параметры:
|
||
// ПредставлениеНастройки - Строка - название настройки. Используется если копируется одна настройка.
|
||
// КоличествоНастроек - Число - количество настроек. Используется, если копируется две более настроек.
|
||
// ПояснениеКомуСкопированыНастройки - Строка - кому копируются настройки.
|
||
//
|
||
// Возвращаемое значение:
|
||
// Строка - текст пояснения при копировании настройки.
|
||
//
|
||
Функция ФормированиеПоясненияПриКопировании(ПредставлениеНастройки, КоличествоНастроек, ПояснениеКомуСкопированыНастройки) Экспорт
|
||
|
||
Если КоличествоНастроек = 1 Тогда
|
||
|
||
Если СтрДлина(ПредставлениеНастройки) > 24 Тогда
|
||
ПредставлениеНастройки = Лев(ПредставлениеНастройки, 24) + "...";
|
||
КонецЕсли;
|
||
|
||
ПояснениеОповещения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
|
||
НСтр("ru = '""%1"" скопирована %2'"),
|
||
ПредставлениеНастройки,
|
||
ПояснениеКомуСкопированыНастройки);
|
||
Иначе
|
||
ПрописьПредмета = Формат(КоличествоНастроек, "ЧДЦ=0") + " "
|
||
+ ПользователиСлужебныйКлиентСервер.ПредметЦелогоЧисла(КоличествоНастроек,
|
||
"", НСтр("ru = 'настройка,настройки,настроек,,,,,,0'"));
|
||
|
||
ПояснениеОповещения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
|
||
НСтр("ru = 'Скопировано %1 %2'"),
|
||
ПрописьПредмета,
|
||
ПояснениеКомуСкопированыНастройки);
|
||
КонецЕсли;
|
||
|
||
Возврат ПояснениеОповещения;
|
||
|
||
КонецФункции
|
||
|
||
// Формирует строку получателя настройки.
|
||
//
|
||
// Параметры:
|
||
// КоличествоПользователей - Число - используется, если значение больше единицы.
|
||
// Пользователь - Строка - имя пользователя. Используется, если количество пользователей
|
||
// равно единице.
|
||
//
|
||
// Возвращаемое значение:
|
||
// Строка - пояснение кому копируется настройка.
|
||
//
|
||
Функция ПояснениеПользователи(КоличествоПользователей, Пользователь) Экспорт
|
||
|
||
Если КоличествоПользователей = 1 Тогда
|
||
ПояснениеКомуСкопированыНастройки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
|
||
НСтр("ru = 'пользователю ""%1""'"), Пользователь);
|
||
Иначе
|
||
ПояснениеКомуСкопированыНастройки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
|
||
НСтр("ru = '%1 пользователям'"), КоличествоПользователей);
|
||
КонецЕсли;
|
||
|
||
Возврат ПояснениеКомуСкопированыНастройки;
|
||
|
||
КонецФункции
|
||
|
||
///////////////////////////////////////////////////////////////////////////////
|
||
// Процедуры и функции перезапуска приложения при сокращении ролей пользователя.
|
||
|
||
Процедура НачатьПерезапускПриложения()
|
||
|
||
Параметры = ПараметрыИнформированияОПерезапуске();
|
||
Если ЗначениеЗаполнено(Параметры.ДатаПерезапуска) Тогда
|
||
Возврат;
|
||
КонецЕсли;
|
||
|
||
Параметры.ДатаПерезапуска = ОбщегоНазначенияКлиент.ДатаСеанса() + 15*60; // 15 минут.
|
||
|
||
ПодключитьОбработчикОжидания("КонтрольПерезапускаПриСокращенииПравДоступа", 60);
|
||
ИнформироватьОПерезапускеПриложения();
|
||
|
||
КонецПроцедуры
|
||
|
||
Процедура ПрекратитьПерезапускПриложения()
|
||
|
||
ОтключитьОбработчикОжидания("КонтрольПерезапускаПриСокращенииПравДоступа");
|
||
ОчиститьОповещениеОПерезапуске();
|
||
ПараметрыИнформированияОПерезапуске().ДатаПерезапуска = '00010101';
|
||
|
||
КонецПроцедуры
|
||
|
||
Процедура ИнформироватьОПерезапускеПриложения()
|
||
|
||
Параметры = ПараметрыИнформированияОПерезапуске();
|
||
Если Не ЗначениеЗаполнено(Параметры.ДатаПерезапуска) Тогда
|
||
Возврат;
|
||
КонецЕсли;
|
||
|
||
Если Не СтандартныеПодсистемыВызовСервера.РолиТекущегоПользователяСокращены() Тогда
|
||
ПрекратитьПерезапускПриложения();
|
||
Возврат;
|
||
КонецЕсли;
|
||
|
||
ИнтервалПредупреждения = 10; // 10 минут.
|
||
ИнтервалЗакрытьСЗапросом = 5; // 5 минут.
|
||
ТекущийМомент = ОбщегоНазначенияКлиент.ДатаСеанса();
|
||
|
||
Если Параметры.ДатаПерезапуска - ТекущийМомент < 5 Тогда
|
||
ПерезапуститьСейчас();
|
||
Возврат;
|
||
КонецЕсли;
|
||
|
||
ОсталосьМинут = ОсталосьМинутДоПерезапуска(Параметры.ДатаПерезапуска, ТекущийМомент);
|
||
ПредставлениеОсталосьМинут = ПредставлениеОсталосьМинутДоПерезапуска(ОсталосьМинут);
|
||
|
||
ПоказатьОповещениеОПерезапуске(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
|
||
НСтр("ru = 'Рекомендуется сохранить все свои данные. Перезапуск через %1'"),
|
||
ПредставлениеОсталосьМинут));
|
||
|
||
Если ОсталосьМинут <= ИнтервалЗакрытьСЗапросом Тогда
|
||
ЗадатьВопросПриЗавершенииРаботы(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
|
||
НСтр("ru = 'Рекомендуется сохранить все свои данные.
|
||
|Перезапуск через %1. Перезапустить сейчас?'"),
|
||
ПредставлениеОсталосьМинут));
|
||
|
||
ИначеЕсли ОсталосьМинут <= ИнтервалПредупреждения Тогда
|
||
ПоказатьПредупреждениеПриЗавершенииРаботы(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
|
||
НСтр("ru = 'Рекомендуется сохранить все свои данные.
|
||
|Перезапуск через %1'"),
|
||
ПредставлениеОсталосьМинут));
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
Функция ОсталосьМинутДоПерезапуска(ДатаПерезапуска, ТекущийМомент = Неопределено) Экспорт
|
||
|
||
Если ТекущийМомент = Неопределено Тогда
|
||
ТекущийМомент = ОбщегоНазначенияКлиент.ДатаСеанса();
|
||
КонецЕсли;
|
||
|
||
ОсталосьМинут = Цел((ДатаПерезапуска - ТекущийМомент) / 60);
|
||
|
||
Возврат ?(ОсталосьМинут > 0, ОсталосьМинут, 1);
|
||
|
||
КонецФункции
|
||
|
||
Функция ПредставлениеОсталосьМинутДоПерезапуска(ОсталосьМинут) Экспорт
|
||
|
||
Возврат СтроковыеФункцииКлиентСервер.СтрокаСЧисломДляЛюбогоЯзыка(
|
||
НСтр("ru = ';%1 минута;%1 минуты;%1 минут;%1 минут;%1 минут'"),
|
||
ОсталосьМинут);
|
||
|
||
КонецФункции
|
||
|
||
// Параметры:
|
||
// ОбновитьДатуПоследнегоПредупрежденияИлиВопроса - Булево
|
||
//
|
||
// Возвращаемое значение:
|
||
// Структура:
|
||
// * ОповещениеПоказано - Булево
|
||
// * ПоказатьПредупреждениеИлиВопрос - Булево
|
||
// * ДатаПоследнегоПредупрежденияИлиВопроса - Дата
|
||
// * ДатаПерезапуска - Дата
|
||
//
|
||
Функция ПараметрыИнформированияОПерезапуске(ОбновитьДатуПоследнегоПредупрежденияИлиВопроса = Ложь) Экспорт
|
||
|
||
ИмяПараметра = "СтандартныеПодсистемы.Пользователи.ПараметрыИнформированияОПерезапуске";
|
||
Свойства = ПараметрыПриложения[ИмяПараметра];
|
||
Если Свойства = Неопределено Или Не ЗначениеЗаполнено(Свойства.ДатаПерезапуска) Тогда
|
||
Свойства = Новый Структура;
|
||
Свойства.Вставить("ОповещениеПоказано", Ложь);
|
||
Свойства.Вставить("ПоказатьПредупреждениеИлиВопрос", Ложь);
|
||
Свойства.Вставить("ДатаПоследнегоПредупрежденияИлиВопроса", '00010101');
|
||
Свойства.Вставить("ДатаПерезапуска", '00010101');
|
||
ПараметрыПриложения.Вставить(ИмяПараметра, Свойства);
|
||
КонецЕсли;
|
||
|
||
Если ОбновитьДатуПоследнегоПредупрежденияИлиВопроса Тогда
|
||
ДатаСеанса = ОбщегоНазначенияКлиент.ДатаСеанса();
|
||
Если Свойства.ДатаПоследнегоПредупрежденияИлиВопроса + 50 < ДатаСеанса Тогда
|
||
Свойства.ДатаПоследнегоПредупрежденияИлиВопроса = ДатаСеанса;
|
||
Свойства.ПоказатьПредупреждениеИлиВопрос = Истина;
|
||
Иначе
|
||
Свойства.ПоказатьПредупреждениеИлиВопрос = Ложь;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
|
||
Возврат Свойства;
|
||
|
||
КонецФункции
|
||
|
||
Процедура ПоказатьОповещениеОПерезапуске(ТекстСообщения)
|
||
|
||
Параметры = ПараметрыИнформированияОПерезапуске();
|
||
Если Параметры.ОповещениеПоказано Тогда
|
||
Возврат;
|
||
КонецЕсли;
|
||
|
||
ПоказатьОповещениеПользователя(
|
||
НСтр("ru = 'Приложение будет перезапущено'"),
|
||
"e1cib/app/ОбщаяФорма.КонтрольИзмененияРолейПользователяИБ",
|
||
ТекстСообщения,
|
||
БиблиотекаКартинок.ДиалогВосклицание,
|
||
СтатусОповещенияПользователя.Важное,
|
||
"КонтрольПерезапускаПриСокращенииПравДоступа");
|
||
|
||
Параметры.ОповещениеПоказано = Истина;
|
||
|
||
КонецПроцедуры
|
||
|
||
Процедура ОчиститьОповещениеОПерезапуске()
|
||
|
||
Параметры = ПараметрыИнформированияОПерезапуске();
|
||
Если Не Параметры.ОповещениеПоказано Тогда
|
||
Возврат;
|
||
КонецЕсли;
|
||
Параметры.ОповещениеПоказано = Ложь;
|
||
|
||
ПоказатьОповещениеПользователя(НСтр("ru = 'Перезапуск приложения отменен'"),,,,
|
||
СтатусОповещенияПользователя.Важное, "КонтрольПерезапускаПриСокращенииПравДоступа");
|
||
|
||
КонецПроцедуры
|
||
|
||
Процедура ПоказатьПредупреждениеПриЗавершенииРаботы(ТекстПредупреждения)
|
||
|
||
Параметры = ПараметрыИнформированияОПерезапуске(Истина);
|
||
Если Не Параметры.ПоказатьПредупреждениеИлиВопрос Тогда
|
||
Возврат;
|
||
КонецЕсли;
|
||
|
||
ПоказатьПредупреждение(, ТекстПредупреждения, 30);
|
||
|
||
КонецПроцедуры
|
||
|
||
Процедура ЗадатьВопросПриЗавершенииРаботы(ТекстВопроса)
|
||
|
||
Параметры = ПараметрыИнформированияОПерезапуске(Истина);
|
||
Если Не Параметры.ПоказатьПредупреждениеИлиВопрос Тогда
|
||
Возврат;
|
||
КонецЕсли;
|
||
|
||
ОписаниеОповещения = Новый ОписаниеОповещения("ЗадатьВопросПриЗавершенииРаботыЗавершение", ЭтотОбъект);
|
||
ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, РежимДиалогаВопрос.ДаНет, 30, КодВозвратаДиалога.Да);
|
||
|
||
КонецПроцедуры
|
||
|
||
Процедура ЗадатьВопросПриЗавершенииРаботыЗавершение(Ответ, ДополнительныеПараметры) Экспорт
|
||
|
||
Если Ответ = КодВозвратаДиалога.Да Тогда
|
||
ПерезапуститьСейчас();
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
Процедура ПерезапуститьСейчас()
|
||
|
||
СтандартныеПодсистемыКлиент.ПропуститьПредупреждениеПередЗавершениемРаботыСистемы();
|
||
ЗавершитьРаботуСистемы(Истина, Истина);
|
||
|
||
КонецПроцедуры
|
||
|
||
#КонецОбласти
|