///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2024, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ОписаниеПеременных

&НаКлиенте
Перем ТекущийКонтекст;

#КонецОбласти

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	УстановитьУсловноеОформление();
	
	НавигационнаяСсылка = "e1cib/app/ОбщаяФорма.Расширения";
	
	Если Не ПравоДоступа("Администрирование", Метаданные) Тогда
		Элементы.СписокРасширенийБезопасныйРежимФлаг.ТолькоПросмотр = Истина;
	КонецЕсли;
	
	Элементы.ФормаУстановленныеПатчи.Видимость = 
		ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбновлениеКонфигурации");
	
	Если Не ПравоДоступа("АдминистрированиеРасширенийКонфигурации", Метаданные) Тогда
		Элементы.СписокРасширенийОбновить.ПоложениеВКоманднойПанели = ПоложениеКнопкиВКоманднойПанели.ВКоманднойПанели;
		Элементы.СписокРасширений.ТолькоПросмотр = Истина;
		Элементы.СписокРасширенийДобавить.Видимость = Ложь;
		Элементы.СписокРасширенийУдалить.Видимость = Ложь;
		Элементы.СписокРасширенийОбновитьИзФайла.Видимость = Ложь;
		Элементы.СписокРасширенийСохранитьКак.Видимость = Ложь;
		Элементы.СписокРасширенийКонтекстноеМенюДобавить.Видимость = Ложь;
		Элементы.СписокРасширенийКонтекстноеМенюУдалить.Видимость = Ложь;
		Элементы.СписокРасширенийКонтекстноеМенюОбновитьИзФайла.Видимость = Ложь;
		Элементы.СписокРасширенийКонтекстноеМенюСохранитьКак.Видимость = Ложь;
		Элементы.ФормаУстановленныеПатчи.Видимость = Ложь;
		Элементы.ПроверитьВозможностьПримененияВсехРасширений.Видимость = Ложь;
		Элементы.ПодменюВключитьРасширения.Видимость = Ложь;
		Элементы.ПодменюПередаватьВПодчиненныеУзлыРИБ.Видимость = Ложь;
		Элементы.ПодменюБезопасныйРежим.Видимость = Ложь;
		Элементы.УстановитьОтветственного.Видимость = Ложь;
		Элементы.СписокРасширенийОтветственный.Видимость = Ложь;
		Элементы.СписокРасширенийЕстьКомментарий.Видимость = Ложь;
		Элементы.СписокРасширенийКомментарий.Видимость = Ложь;
	КонецЕсли;
	
	Элементы.СписокРасширенийОбщее.Видимость = ОбщегоНазначения.РазделениеВключено() И ПравоДоступа("Администрирование", Метаданные);
	Элементы.СписокРасширенийПолученоИзГлавногоУзлаРИБ.Видимость = ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ();
	Элементы.СписокРасширенийПередаватьВПодчиненныеУзлыРИБ.Видимость = ОбщегоНазначения.ЭтоРаспределеннаяИнформационнаяБаза();
	
	ОбновитьСписок();
	
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	УстановитьДоступностьКнопокКомандныхПанелей()
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
	
	Если ИмяСобытия = "ВыполненВыходИзОбластиДанных" 
		Или ИмяСобытия = "ВыполненВходВОбластьДанных" Тогда
		
		ПодключитьОбработчикОжидания("ОбновитьСписокОбработчикОжидания", 0.1, Истина);
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура ПредупреждениеОписаниеОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	ЗавершитьРаботуСистемы(Ложь, Истина);
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыСписокРасширений

&НаКлиенте
Процедура СписокРасширенийВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
	Если Поле.Имя="СписокРасширенийЕстьКомментарий" Тогда
		ТекущийЭлемент = Элементы.СписокРасширенийКомментарий;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура СписокРасширенийПриАктивизацииСтроки(Элемент)
	
	УстановитьДоступностьКнопокКомандныхПанелей();
	
КонецПроцедуры

&НаКлиенте
Процедура СписокРасширенийПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)
	
	Отказ = Истина;
	ЗагрузитьРасширение(Неопределено, Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура СписокРасширенийПередУдалением(Элемент, Отказ)
	
	Отказ = Истина;
	УдалитьРасширения(Элемент.ВыделенныеСтроки);
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура СписокРасширенийПередаватьВПодчиненныеУзлыРИБПриИзменении(Элемент)
	
	ТекущееРасширение = Элементы.СписокРасширений.ТекущиеДанные;
	Если ТекущееРасширение = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	СписокРасширенийПередаватьВПодчиненныеУзлыРИБПриИзмененииНаСервере(ТекущееРасширение.ПолучитьИдентификатор());
	
КонецПроцедуры

&НаКлиенте
Процедура СписокРасширенийОтветственныйПриИзменении(Элемент)
	
	ТекущееРасширение = Элементы.СписокРасширений.ТекущиеДанные;
	СохранитьСвойстваРасширений(ТекущееРасширение.ИдентификаторРасширения, СвойстваРасширений(ТекущееРасширение));
	
КонецПроцедуры

&НаКлиенте
Процедура СписокРасширенийКомментарийПриИзменении(Элемент)
	
	ТекущееРасширение = Элементы.СписокРасширений.ТекущиеДанные;
	ТекущееРасширение.ЕстьКомментарий = ЗначениеЗаполнено(ТекущееРасширение.Комментарий);
	СохранитьСвойстваРасширений(ТекущееРасширение.ИдентификаторРасширения, СвойстваРасширений(ТекущееРасширение));
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

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

&НаКлиенте
Процедура СохранитьКак(Команда)
	
	ВыделенныеСтроки = Элементы.СписокРасширений.ВыделенныеСтроки;
	ОписаниеОповещения = Новый ОписаниеОповещения("СохранитьКакЗавершение", ЭтотОбъект, ВыделенныеСтроки);
	
	Если ВыделенныеСтроки.Количество() = 0 Тогда
		Возврат;
	ИначеЕсли ВыделенныеСтроки.Количество() = 1 Тогда
		СохраняемыеФайлы = СохранитьНаСервере(ВыделенныеСтроки);
	Иначе
		Заголовок = НСтр("ru = 'Выберите каталог для сохранения расширений конфигурации'");
		ФайловаяСистемаКлиент.ВыбратьКаталог(ОписаниеОповещения, Заголовок);
		Возврат;
	КонецЕсли;
	
	Если СохраняемыеФайлы.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	
	ПараметрыСохранения = ФайловаяСистемаКлиент.ПараметрыСохраненияФайла();
	ПараметрыСохранения.Диалог.Заголовок = НСтр("ru = 'Выберите файл для сохранения расширения конфигурации'");
	ПараметрыСохранения.Диалог.Фильтр    = НСтр("ru = 'Файлы расширений конфигурации (*.cfe)|*.cfe'") + "|"
			+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Все файлы (%1)|%1'"), ПолучитьМаскуВсеФайлы());
	
	ФайловаяСистемаКлиент.СохранитьФайлы(Неопределено, СохраняемыеФайлы, ПараметрыСохранения);
	
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьИзФайлаНаДиске(Команда)
	
	ТекущееРасширение = Элементы.СписокРасширений.ТекущиеДанные;
	
	Если ТекущееРасширение = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ЗагрузитьРасширение(Элементы.СписокРасширений.ВыделенныеСтроки);
	
КонецПроцедуры

&НаКлиенте
Процедура ПоказатьСобытияФоновогоОбновленияПараметровРаботыРасширений(Команда)
	
	ОтборСобытий = Новый Структура;
	ОтборСобытий.Вставить("СобытиеЖурналаРегистрации", ИмяСобытияЗаполненияПараметров());
	
	ЖурналРегистрацииКлиент.ОткрытьЖурналРегистрации(ОтборСобытий, ЭтотОбъект);
	
КонецПроцедуры

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

&НаКлиенте
Процедура УдалитьУстаревшиеПараметровРаботыРасширений(Команда)
	
	УдалитьУстаревшиеПараметрыРаботыРасширенийНаСервере();
	ПоказатьПредупреждение(, НСтр("ru = 'Выполнено удаление устаревших версий параметров работы расширений.'"));
	
КонецПроцедуры

&НаКлиенте
Процедура УстановленныеПатчи(Команда)
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ОбновлениеКонфигурации") Тогда
		МодульОбновлениеКонфигурацииКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОбновлениеКонфигурацииКлиент");
		МодульОбновлениеКонфигурацииКлиент.ПоказатьУстановленныеИсправления();
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьВозможностьПримененияВсехРасширений(Команда)
	
	Результат = РезультатПроверкиВозможностиПримененияВсех();
	
	Если Результат.КоличествоПроблем = 0 Тогда
		ПараметрыФормыВопроса = СтандартныеПодсистемыКлиент.ПараметрыВопросаПользователю();
		ПараметрыФормыВопроса.Картинка = БиблиотекаКартинок.ДиалогИнформация;
		ПараметрыФормыВопроса.ПредлагатьБольшеНеЗадаватьЭтотВопрос = Ложь;
		ПараметрыФормыВопроса.Заголовок = НСтр("ru = 'Результат проверки возможности применения всех расширений'");
		СтандартныеПодсистемыКлиент.ПоказатьВопросПользователю(Неопределено,
			НСтр("ru = 'Проверка возможности применения всех расширений пройдена успешно.'"),
			РежимДиалогаВопрос.ОК,
			ПараметрыФормыВопроса);
	Иначе
		Результат.ИнформацияОПроблемах.Показать(НСтр("ru = 'Результат проверки расширений.'"));
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ВключитьРасширения(Команда)
	
	ПоказатьДлительнуюОперацию();
	ПодключитьОбработчикОжидания("ВключитьПодключениеРасширений", 0.1, Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура ВыключитьРасширения(Команда)
	
	ПоказатьДлительнуюОперацию();
	ПодключитьОбработчикОжидания("ВыключитьПодключениеРасширений", 0.1, Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура ВключитьПередачуВПодчиненныеУзлыРИБ(Команда)
	
	ПоказатьДлительнуюОперацию();
	ПодключитьОбработчикОжидания("ВключитьПередачуВПодчиненныеУзлыРИБЗавершение", 0.1, Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура ВыключитьПередачуВПодчиненныеУзлыРИБ(Команда)
	
	ПоказатьДлительнуюОперацию();
	ПодключитьОбработчикОжидания("ВыключитьПередачуВПодчиненныеУзлыРИБЗавершение", 0.1, Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура ВключитьБезопасныйРежим(Команда)
	
	ПоказатьДлительнуюОперацию();
	ПодключитьОбработчикОжидания("ВключитьБезопасныйРежимЗавершение", 0.1, Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура ВыключитьБезопасныйРежим(Команда)
		
	ПоказатьДлительнуюОперацию();
	ПодключитьОбработчикОжидания("ВыключитьБезопасныйРежимЗавершение", 0.1, Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура УстановитьОтветственного(Команда)
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("РежимВыбора", Истина);
	ПараметрыФормы.Вставить("ЗакрыватьПриВыборе", Истина);
	ПараметрыФормы.Вставить("МножественныйВыбор", Ложь);
	ПараметрыФормы.Вставить("РасширенныйПодбор", Ложь);
	
	Оповещение = Новый ОписаниеОповещения("УстановитьОтветственногоПослеВыбора", ЭтотОбъект);
	
	ОткрытьФорму("Справочник.Пользователи.ФормаВыбора", ПараметрыФормы, ЭтотОбъект,,,, Оповещение,
		РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);	

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

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаКлиенте
Процедура ОбновитьСписокОбработчикОжидания()
	
	ОбновитьСписок();
	
КонецПроцедуры

&НаСервере
Процедура ОбновитьСписок(ПослеДобавления = Ложь)
	
	Если ПослеДобавления Тогда
		ИндексТекущейСтроки = СписокРасширений.Количество();
	Иначе
		ИндексТекущейСтроки = 0;
		ИдентификаторТекущейСтроки = Элементы.СписокРасширений.ТекущаяСтрока;
		Если ИдентификаторТекущейСтроки <> Неопределено Тогда
			Строка = СписокРасширений.НайтиПоИдентификатору(ИдентификаторТекущейСтроки);
			Если Строка <> Неопределено Тогда
				ИндексТекущейСтроки = СписокРасширений.Индекс(Строка);
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
	СписокРасширений.Очистить();
	
	УстановитьПривилегированныйРежим(Истина);
	Расширения = РасширенияКонфигурации.Получить();
	ПодключенныеРасширения = ИдентификаторыРасширений(ИсточникРасширенийКонфигурации.СеансАктивные);
	ОтключенныеРасширения  = ИдентификаторыРасширений(ИсточникРасширенийКонфигурации.СеансОтключенные);
	УстановитьПривилегированныйРежим(Ложь);
	
	МодульОбновлениеКонфигурации = Неопределено;
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбновлениеКонфигурации") Тогда 
		МодульОбновлениеКонфигурации = ОбщегоНазначения.ОбщийМодуль("ОбновлениеКонфигурации");
	КонецЕсли;
	
	НеВыводитьОбщиеРасширения = ОбщегоНазначения.РазделениеВключено() И Не ПравоДоступа("Администрирование", Метаданные);
	НомерПоПорядку = 1;
	Для Каждого Расширение Из Расширения Цикл
		
		Если НеВыводитьОбщиеРасширения 
			И (Расширение.ОбластьДействия = ОбластьДействияРасширенияКонфигурации.ИнформационнаяБаза) Тогда
			Продолжить;
		КонецЕсли;
			
		Если МодульОбновлениеКонфигурации <> Неопределено И МодульОбновлениеКонфигурации.ЭтоИсправление(Расширение) Тогда 
			Продолжить;
		КонецЕсли;
			
		ЭлементРасширения = СписокРасширений.Добавить();
		ЭлементРасширения.ИдентификаторРасширения = Расширение.УникальныйИдентификатор;
		ЭлементРасширения.Имя = Расширение.Имя;
		ЭлементРасширения.Версия = Расширение.Версия;
		ЭлементРасширения.КонтрольнаяСумма = Base64Строка(Расширение.ХешСумма);
		ЭлементРасширения.Синоним = Расширение.Синоним;
		ЭлементРасширения.Назначение = Расширение.Назначение;
		ЭлементРасширения.БезопасныйРежим = Расширение.БезопасныйРежим;
		ЭлементРасширения.Подключать = Расширение.Активно;
		ЭлементРасширения.ПолученоИзГлавногоУзлаРИБ = Расширение.ГлавныйУзел <> Неопределено;
		ЭлементРасширения.ПередаватьВПодчиненныеУзлыРИБ = Расширение.ИспользуетсяВРаспределеннойИнформационнойБазе;
		ЭлементРасширения.НомерПоПорядку = НомерПоПорядку;
		
		ЭлементРасширения.Общее = (Расширение.ОбластьДействия = ОбластьДействияРасширенияКонфигурации.ИнформационнаяБаза);
		
		ЭлементРасширения.ПриоритетНазначения =
			?(Расширение.Назначение = Метаданные.СвойстваОбъектов.НазначениеРасширенияКонфигурации.Исправление, 1,
			?(Расширение.Назначение = Метаданные.СвойстваОбъектов.НазначениеРасширенияКонфигурации.Адаптация, 2, 3));
		
		КлючРасширения = Расширение.Имя + Расширение.ХешСумма + Расширение.ОбластьДействия;	
		Если ПодключенныеРасширения[КлючРасширения] <> Неопределено Тогда
			ЭлементРасширения.Подключено = 0;
			ЭлементРасширения.СостояниеПодключения = НСтр("ru = 'Подключено'");
		ИначеЕсли ОтключенныеРасширения[КлючРасширения] <> Неопределено Тогда
			ЭлементРасширения.Подключено = 2;
			ЭлементРасширения.СостояниеПодключения = НСтр("ru = 'Отключено'");
		Иначе
			ЭлементРасширения.Подключено = 1;
			ЭлементРасширения.СостояниеПодключения = НСтр("ru = 'Требуется перезапуск'");
		КонецЕсли;	
			
		Если ПустаяСтрока(ЭлементРасширения.Синоним) Тогда
			ЭлементРасширения.Синоним = ЭлементРасширения.Имя;
		КонецЕсли;
		
		Если ТипЗнч(Расширение.БезопасныйРежим) = Тип("Булево") Тогда
			ЭлементРасширения.БезопасныйРежимФлаг = Расширение.БезопасныйРежим;
		Иначе
			ЭлементРасширения.БезопасныйРежимФлаг = Истина;
		КонецЕсли;
		НомерПоПорядку = НомерПоПорядку + 1;
	КонецЦикла;
	СписокРасширений.Сортировать("ПолученоИзГлавногоУзлаРИБ УБЫВ, ПриоритетНазначения, Общее УБЫВ, НомерПоПорядку");
	
	Если ИндексТекущейСтроки >= СписокРасширений.Количество() Тогда
		ИндексТекущейСтроки = СписокРасширений.Количество() - 1;
	КонецЕсли;
	Если ИндексТекущейСтроки >= 0 Тогда
		Элементы.СписокРасширений.ТекущаяСтрока = СписокРасширений.Получить(
			ИндексТекущейСтроки).ПолучитьИдентификатор();
	КонецЕсли;
	
	УстановитьПривилегированныйРежим(Истина);
	УстановленныеРасширения = Справочники.ВерсииРасширений.УстановленныеРасширения();
	ИзменилосьСостояниеРасширений = 
		(ПараметрыСеанса.УстановленныеРасширения.ОсновныеСостояние <> УстановленныеРасширения.ОсновныеСостояние);
	Элементы.ГруппаПредупреждение.Видимость = ИзменилосьСостояниеРасширений;
	УстановитьПривилегированныйРежим(Ложь);
	
	// Обновление реквизита формы для условного форматирования.
	ЭтоНеразделенныйПользовательВОбласти = ЭтоНеразделенныйПользовательВОбласти();
	
	Элементы.ПредупреждениеОписание.Видимость = Не ЭтоНеразделенныйПользовательВОбласти;
	Элементы.ПредупреждениеОписание2.Видимость = ЭтоНеразделенныйПользовательВОбласти;
	
	ОбновитьСвойстваРасширенийВСписке();
	
КонецПроцедуры

&НаСервере
Функция ИдентификаторыРасширений(ИсточникРасширений)
	
	Расширения = РасширенияКонфигурации.Получить(, ИсточникРасширений);
	Идентификаторы = Новый Соответствие;
	
	Для Каждого Расширение Из Расширения Цикл
		Идентификаторы.Вставить(Расширение.Имя + Расширение.ХешСумма + Расширение.ОбластьДействия, Истина);
	КонецЦикла;
	
	Возврат Идентификаторы;
	
КонецФункции

&НаКлиенте
Процедура СохранитьКакЗавершение(ПутьККаталогу, ВыделенныеСтроки) Экспорт
	
	СохраняемыеФайлы = СохранитьНаСервере(ВыделенныеСтроки, ПутьККаталогу);
	
	Если СохраняемыеФайлы.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	
	ПараметрыСохранения = ФайловаяСистемаКлиент.ПараметрыСохраненияФайла();
	ПараметрыСохранения.Интерактивно     = Ложь;
	
	ФайловаяСистемаКлиент.СохранитьФайлы(Неопределено, СохраняемыеФайлы, ПараметрыСохранения);
	
КонецПроцедуры

&НаСервере
Функция СохранитьНаСервере(ИдентификаторыСтрок, ПутьККаталогу = "")
	
	СохраняемыеФайлы = Новый Массив;
	Для Каждого ИдентификаторСтроки Из ИдентификаторыСтрок Цикл
		СтрокаСписка = СписокРасширений.НайтиПоИдентификатору(ИдентификаторСтроки);
		ИдентификаторРасширения = СтрокаСписка.ИдентификаторРасширения;
		Расширение = НайтиРасширение(ИдентификаторРасширения);
	
		Если Расширение <> Неопределено Тогда
			Если ЗначениеЗаполнено(ПутьККаталогу) Тогда
				Префикс = ПутьККаталогу + ПолучитьРазделительПути();
			Иначе
				Префикс = "";
			КонецЕсли;
			Имя = Префикс + Расширение.Имя + "_" + Расширение.Версия + ".cfe";
			Хранение = ПоместитьВоВременноеХранилище(Расширение.ПолучитьДанные(), УникальныйИдентификатор);
			ОписаниеПередаваемогоФайла = Новый ОписаниеПередаваемогоФайла(Имя, Хранение);
			СохраняемыеФайлы.Добавить(ОписаниеПередаваемогоФайла);
		КонецЕсли;
	КонецЦикла;
	
	Возврат СохраняемыеФайлы;
	
КонецФункции

&НаСервереБезКонтекста
Функция НайтиРасширение(ИдентификаторРасширения)
	
	Возврат Справочники.ВерсииРасширений.НайтиРасширение(ИдентификаторРасширения);
	
КонецФункции

&НаСервере
Процедура ЗапуститьОбновлениеПараметровРаботыРасширенийВФонеНаСервере(ТекстПредупреждения)
	
	УстановитьПривилегированныйРежим(Истина);
	
	РегистрыСведений.ПараметрыРаботыВерсийРасширений.ВключитьЗаполнениеПараметровРаботыРасширений();
	
	ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = '1. Включено и запущено регламентное задание
		           |""%1"".
		           |
		           |2. Результат работы см. в журнале регистрации в событиях
		           |""%2"",
		           |например, с помощью команды в меню Еще
		           |""%3"".'"),
		РегистрыСведений.ПараметрыРаботыВерсийРасширений.НаименованиеЗаданияЗаполненияПараметров(),
		РегистрыСведений.ПараметрыРаботыВерсийРасширений.ИмяСобытияЗаполненияПараметров(),
		Команды.Найти("ЗапуститьОбновлениеПараметровРаботыРасширенийВФоне").Заголовок);
		
КонецПроцедуры

&НаСервере
Процедура УдалитьУстаревшиеПараметрыРаботыРасширенийНаСервере()
	
	УстановитьПривилегированныйРежим(Истина);
	Справочники.ВерсииРасширений.УдалитьУстаревшиеВерсииПараметров();
	
КонецПроцедуры

&НаКлиенте
Процедура УдалитьРасширения(ВыделенныеСтроки)
	
	Если ВыделенныеСтроки.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	
	ИдентификаторыРасширений = Новый Массив;
	ПропускаемыеСтроки = Новый Массив;
	
	Для Каждого ИдентификаторСтроки Из ВыделенныеСтроки Цикл
		СтрокаРасширения = СписокРасширений.НайтиПоИдентификатору(ИдентификаторСтроки);
		
		Если СтрокаРасширения.Общее
		   И ЭтоНеразделенныйПользовательВОбласти
		 Или СтрокаРасширения.ПолученоИзГлавногоУзлаРИБ Тогда
			
			ПропускаемыеСтроки.Добавить(ИдентификаторСтроки);
			Продолжить;
		КонецЕсли;
		ИдентификаторыРасширений.Добавить(СтрокаРасширения.ИдентификаторРасширения);
	КонецЦикла;
	
	Для Каждого ИдентификаторСтроки Из ПропускаемыеСтроки Цикл
		ВыделенныеСтроки.Удалить(ВыделенныеСтроки.Найти(ИдентификаторСтроки));
	КонецЦикла;
	
	Если ИдентификаторыРасширений.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	
	Контекст = Новый Структура;
	Контекст.Вставить("ИдентификаторыРасширений", ИдентификаторыРасширений);
	
	Оповещение = Новый ОписаниеОповещения("УдалитьРасширениеПослеПодтверждения", ЭтотОбъект, Контекст);
	ВидПредупреждения = ?(ЕстьРасширениеСДанными(ИдентификаторыРасширений),
		ПользователиСлужебныйКлиентСервер.ВидыПредупрежденийБезопасности().ПередУдалениемРасширенияСДанными,
		ПользователиСлужебныйКлиентСервер.ВидыПредупрежденийБезопасности().ПередУдалениемРасширенияБезДанных);
	
	ПользователиСлужебныйКлиент.ПоказатьПредупреждениеБезопасности(Оповещение,
		ВидПредупреждения, ИдентификаторыРасширений.Количество() > 1);
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура УдалитьРасширениеЗавершение()
	
	Контекст = ТекущийКонтекст;
	
	Попытка
		УдалитьРасширенияНаСервере(Контекст.ИдентификаторыРасширений);
	Исключение
		ИнформацияОбОшибке = ИнформацияОбОшибке();
		ПодключитьОбработчикОжидания("СкрытьДлительнуюОперацию", 0.1, Истина);
		СтандартныеПодсистемыКлиент.ВывестиИнформациюОбОшибке(ИнформацияОбОшибке);
		Возврат;
	КонецПопытки;
	ПодключитьОбработчикОжидания("СкрытьДлительнуюОперацию", 0.1, Истина);
	
КонецПроцедуры

&НаСервере
Процедура УдалитьРасширенияНаСервере(ИдентификаторыРасширений)
	
	ТекстОшибки = "";
	Справочники.ВерсииРасширений.УдалитьРасширения(ИдентификаторыРасширений, ТекстОшибки);
	
	ОбновитьСписок();
	
	Если ЗначениеЗаполнено(ТекстОшибки) Тогда
		ВызватьИсключение ТекстОшибки;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОтключитьРасширениеПослеПодтверждения(Результат, Контекст) Экспорт
	
	Если Результат <> "Продолжить" Тогда
		
		СтрокаСписка = СписокРасширений.НайтиПоИдентификатору(Контекст.ИдентификаторСтроки);
		Если СтрокаСписка = Неопределено Тогда
			Возврат;
		КонецЕсли;
		
		СтрокаСписка.Подключать = Не СтрокаСписка.Подключать;
		ПодключитьОбработчикОжидания("СкрытьДлительнуюОперацию", 0.1, Истина);
		Возврат;
	КонецЕсли;
	
	СписокРасширенийПодключатьПриИзмененииПродолжение(Контекст);
	
КонецПроцедуры

&НаКлиенте
Процедура СписокРасширенийПодключатьПриИзмененииПродолжение(Контекст)
	
	ПоказатьДлительнуюОперацию();
	ТекущийКонтекст = Контекст;
	ПодключитьОбработчикОжидания("СписокРасширенийПодключатьПриИзмененииЗавершение", 0.1, Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура СписокРасширенийПодключатьПриИзмененииЗавершение()
	
	Контекст = ТекущийКонтекст;
	
	Попытка
		СписокРасширенийПодключатьПриИзмененииНаСервере(Контекст.ИдентификаторСтроки);
	Исключение
		ИнформацияОбОшибке = ИнформацияОбОшибке();
		ПодключитьОбработчикОжидания("СкрытьДлительнуюОперацию", 0.1, Истина);
		ПоказатьПредупреждение(, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
		Возврат;
	КонецПопытки;
	ПодключитьОбработчикОжидания("СкрытьДлительнуюОперацию", 0.1, Истина);
	
КонецПроцедуры

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

&НаСервере
Функция ЗапросыНаОтменуРазрешенийИспользованияВнешнегоМодуля(ИдентификаторыРасширений)
	
	Возврат Справочники.ВерсииРасширений.ЗапросыНаОтменуРазрешенийИспользованияВнешнегоМодуля(ИдентификаторыРасширений);
	
КонецФункции

&НаКлиенте
Процедура ПоказатьДлительнуюОперацию()
	
	Элементы.СтраницыОбновление.ТекущаяСтраница = Элементы.СтраницаДлительнаяОперация;
	УстановитьДоступностьКнопокКомандныхПанелей();
	
КонецПроцедуры

&НаКлиенте
Процедура СкрытьДлительнуюОперацию()
	
	Элементы.СтраницыОбновление.ТекущаяСтраница = Элементы.СтраницаСписокРасширений;
	УстановитьДоступностьКнопокКомандныхПанелей();
	
КонецПроцедуры

&НаКлиенте
Процедура ЗагрузитьРасширение(Знач ИдентификаторРасширения, МножественныйВыбор = Ложь)
	
	Контекст = Новый Структура;
	Контекст.Вставить("ИдентификаторРасширения", ИдентификаторРасширения);
	Контекст.Вставить("МножественныйВыбор", МножественныйВыбор);
	Контекст.Вставить("ВыделенныеСтроки", ИдентификаторРасширения);
	
	Оповещение = Новый ОписаниеОповещения("ЗагрузитьРасширениеПослеПодтверждения", ЭтотОбъект, Контекст);
	ПользователиСлужебныйКлиент.ПоказатьПредупреждениеБезопасности(Оповещение,
		ПользователиСлужебныйКлиентСервер.ВидыПредупрежденийБезопасности().ПередДобавлениемРасширений);
	
КонецПроцедуры

&НаКлиенте
Процедура ЗагрузитьРасширениеПослеПодтверждения(Ответ, Контекст) Экспорт
	Если Ответ <> "Продолжить" Тогда
		Возврат;
	КонецЕсли;
	
	Оповещение = Новый ОписаниеОповещения("ЗагрузитьРасширениеПослеПомещенияФайлов", ЭтотОбъект, Контекст);
	
	ПараметрыЗагрузки = ФайловаяСистемаКлиент.ПараметрыЗагрузкиФайла();
	ПараметрыЗагрузки.Диалог.Фильтр = НСтр("ru = 'Расширение конфигурации'")+ " (*.cfe)|*.cfe";
	ПараметрыЗагрузки.Диалог.Заголовок = НСтр("ru = 'Выберите файл расширения конфигурации'");
	ПараметрыЗагрузки.Диалог.ПроверятьСуществованиеФайла = Истина;
	
	ПараметрыЗагрузки.ИдентификаторФормы = УникальныйИдентификатор;
	ФайловаяСистемаКлиент.ЗагрузитьФайлы(Оповещение, ПараметрыЗагрузки);
	
КонецПроцедуры

&НаКлиенте
Процедура ЗагрузитьРасширениеПослеПомещенияФайлов(ПомещенныеФайлы, Контекст) Экспорт
	
	Если ПомещенныеФайлы = Неопределено
	 Или ПомещенныеФайлы.Количество() = 0 Тогда
		
		Возврат;
	КонецЕсли;
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ОбновлениеКонфигурации") Тогда
		МодульОбновлениеКонфигурацииКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОбновлениеКонфигурацииКлиент");
		
		Если ВыбранныеФайлыСодержатТолькоИсправления(ПомещенныеФайлы, МодульОбновлениеКонфигурацииКлиент) Тогда 
			
			ПараметрыРезервногоКопирования = Новый Структура;
			ПараметрыРезервногоКопирования.Вставить("ВыбранныеФайлы", ВыбранныеФайлыПоОписанию(ПомещенныеФайлы));
			МодульОбновлениеКонфигурацииКлиент.ПоказатьПоискИУстановкуОбновлений(ПараметрыРезервногоКопирования);
			Возврат;
			
		ИначеЕсли ВыбранныеФайлыСодержатИсправления(ПомещенныеФайлы, МодульОбновлениеКонфигурацииКлиент) Тогда 
			ПоказатьПредупреждение(,
				НСтр("ru = 'Выбранные файлы не должны одновременно содержать исправления (патчи) и другие виды расширений.'"));
			Возврат;
		КонецЕсли;
	КонецЕсли;
	
	Контекст.Вставить("ПомещенныеФайлы", ПомещенныеФайлы);
	
	ОповещениеОЗакрытии = Новый ОписаниеОповещения(
		"ЗагрузитьРасширениеПродолжение", ЭтотОбъект, Контекст);
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда
		
		ЗапросыРазрешений = Новый Массив;
		Попытка
			ДобавитьЗапросРазрешений(ЗапросыРазрешений, ПомещенныеФайлы, Контекст.ИдентификаторРасширения);
		Исключение
			ИнформацияОбОшибке = ИнформацияОбОшибке();
			ПоказатьПредупреждение(, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
			Возврат;
		КонецПопытки;
		
		МодульРаботаВБезопасномРежимеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаВБезопасномРежимеКлиент");
		МодульРаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(
			ЗапросыРазрешений, ЭтотОбъект, ОповещениеОЗакрытии);
	Иначе
		ВыполнитьОбработкуОповещения(ОповещениеОЗакрытии, КодВозвратаДиалога.ОК);
	КонецЕсли;
	
КонецПроцедуры

// Параметры:
//  ПомещенныеФайлы - Массив из ОписаниеПереданногоФайла
//  МодульОбновлениеКонфигурацииКлиент - ОбщийМодуль
//
// Возвращаемое значение:
//  Булево
//
&НаКлиенте
Функция ВыбранныеФайлыСодержатИсправления(ПомещенныеФайлы, МодульОбновлениеКонфигурацииКлиент)
	
	Для Каждого ПомещенныйФайл Из ПомещенныеФайлы Цикл 
		Файл = Новый Файл(ПомещенныйФайл.Имя);
		Если МодульОбновлениеКонфигурацииКлиент.ЭтоИсправление(Файл.Имя) Тогда 
			Возврат Истина;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Ложь;
	
КонецФункции

// Параметры:
//  ПомещенныеФайлы - Массив из ОписаниеПереданногоФайла
//  МодульОбновлениеКонфигурацииКлиент - ОбщийМодуль
//
// Возвращаемое значение:
//  Булево
//
&НаКлиенте
Функция ВыбранныеФайлыСодержатТолькоИсправления(ПомещенныеФайлы, МодульОбновлениеКонфигурацииКлиент)
	
	Для Каждого ПомещенныйФайл Из ПомещенныеФайлы Цикл 
		Файл = Новый Файл(ПомещенныйФайл.Имя);
		Если Не МодульОбновлениеКонфигурацииКлиент.ЭтоИсправление(Файл.Имя) Тогда 
			Возврат Ложь;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Истина;
	
КонецФункции

// Параметры:
//   ПомещенныеФайлы - Массив из ОписаниеПереданногоФайла
//
// Возвращаемое значение:
//  Строка
//
&НаКлиенте
Функция ВыбранныеФайлыПоОписанию(ПомещенныеФайлы)
	
	СписокФайлов = Новый Массив;
	
	Для Каждого ПомещенныйФайл Из ПомещенныеФайлы Цикл 
		Файл = Новый Файл(ПомещенныйФайл.Имя);
		СписокФайлов.Добавить(Файл.ПолноеИмя);
	КонецЦикла;
	
	Возврат СтрСоединить(СписокФайлов, ", ");
	
КонецФункции

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

&НаКлиенте
Процедура ЗагрузитьРасширениеЗавершение()
	
	Контекст = ТекущийКонтекст;
	
	НеподключенныеРасширения = "";
	РасширенияИзменены = Ложь;
	Если Контекст.Свойство("ЗаменаИмениПодтверждена") Тогда
		ПодтверждениеЗаменыИмени = Неопределено;
	Иначе
		ПодтверждениеЗаменыИмени = Новый Структура("СтароеИмя, НовоеИмя", "", "");
	КонецЕсли;
	Попытка
		ИзменитьРасширенияНаСервере(Контекст.ПомещенныеФайлы,
			Контекст.ВыделенныеСтроки, НеподключенныеРасширения, РасширенияИзменены, ПодтверждениеЗаменыИмени);
		Если РасширенияДляПовторногоДобавления.Количество() > 0 Тогда
			ОткрытьФормуЗавершенияРаботыПользователей();
		КонецЕсли;
	Исключение
		ИнформацияОбОшибке = ИнформацияОбОшибке();
		ПодключитьОбработчикОжидания("СкрытьДлительнуюОперацию", 0.1, Истина);
		ПоказатьПредупреждение(, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
		Возврат;
	КонецПопытки;
	ПодключитьОбработчикОжидания("СкрытьДлительнуюОперацию", 0.1, Истина);
	
	Если Не Контекст.Свойство("ЗаменаИмениПодтверждена")
	   И ЗначениеЗаполнено(ПодтверждениеЗаменыИмени.СтароеИмя) Тогда
		
		ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Расширение с именем ""%1"" будет заменено на расширение с именем ""%2"".
			           |
			           |Если расширение ""%2"" не является обновлением расширения ""%1"",
			           |тогда следует отказаться от замены и добавить расширение ""%2"", как новое.
			           |Прим.: если расширение ""%2"" не удается добавить из-за расширения ""%1"",
			           |тогда следует сначала удалить расширение ""%1"", а затем добавить ""%2"".'"),
			ПодтверждениеЗаменыИмени.СтароеИмя,
			ПодтверждениеЗаменыИмени.НовоеИмя);
			
		ОбработчикЗавершения = Новый ОписаниеОповещения(
			"ЗагрузитьРасширениеПослеВопросаЗаменыИмени", ЭтотОбъект, Контекст);
		
		Кнопки = Новый СписокЗначений;
		Кнопки.Добавить("Заменить",   НСтр("ru = 'Заменить'"));
		Кнопки.Добавить("НеЗаменять", НСтр("ru = 'Не заменять'"));
		
		ПараметрыВопроса = СтандартныеПодсистемыКлиент.ПараметрыВопросаПользователю();
		ПараметрыВопроса.КнопкаПоУмолчанию = "НеЗаменять";
		ПараметрыВопроса.ПредлагатьБольшеНеЗадаватьЭтотВопрос = Ложь;
		
		СтандартныеПодсистемыКлиент.ПоказатьВопросПользователю(ОбработчикЗавершения,
			ТекстВопроса, Кнопки, ПараметрыВопроса);
		Возврат;
	КонецЕсли;
	
	Если Не РасширенияИзменены Тогда
		Возврат;
	КонецЕсли;
	
	Если Контекст.ИдентификаторРасширения = Неопределено Тогда
		Если Контекст.ПомещенныеФайлы.Количество() > 1 Тогда
			ТекстОповещения = НСтр("ru = 'Расширения конфигурации добавлены'");
		Иначе
			ТекстОповещения = НСтр("ru = 'Расширение конфигурации добавлено'");
		КонецЕсли;
	Иначе
		ТекстОповещения = НСтр("ru = 'Расширение конфигурации обновлено'");
	КонецЕсли;
	
	ПоказатьОповещениеПользователя(ТекстОповещения);
	
	Если Не ЗначениеЗаполнено(НеподключенныеРасширения) Тогда
		Возврат;
	КонецЕсли;
	
	Если Контекст.ПомещенныеФайлы.Количество() > 1 Тогда
		Если СтрНайти(НеподключенныеРасширения, ",") > 0 Тогда
			ТекстПредупреждения = НСтр("ru = 'Некоторые расширения не подключаются:'");
		Иначе
			ТекстПредупреждения = НСтр("ru = 'Одно расширение не подключается:'");
		КонецЕсли;
		ТекстПредупреждения = ТекстПредупреждения + " " + НеподключенныеРасширения;
	Иначе
		ТекстПредупреждения = НСтр("ru = 'Расширение не подключается.'");
	КонецЕсли;
	
	ПоказатьПредупреждение(, ТекстПредупреждения);
	
КонецПроцедуры

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

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

&НаСервере
Процедура СписокРасширенийБезопасныйРежимФлагПриИзмененииНаСервере(ИдентификаторСтроки)
	
	СтрокаСписка = СписокРасширений.НайтиПоИдентификатору(ИдентификаторСтроки);
	Если СтрокаСписка = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Расширение = НайтиРасширение(СтрокаСписка.ИдентификаторРасширения);
	
	Если Расширение = Неопределено
	 Или Расширение.БезопасныйРежим = СтрокаСписка.БезопасныйРежимФлаг Тогда
		
		ОбновитьСписок();
		Возврат;
	КонецЕсли;
	
	Расширение.БезопасныйРежим = СтрокаСписка.БезопасныйРежимФлаг;
	ОтключитьПредупрежденияБезопасности(Расширение);
	ОтключитьИспользованиеОсновныхРолейДляВсехПользователей(Расширение);
	Попытка
		Расширение.Записать();
	Исключение
		СтрокаСписка.БезопасныйРежимФлаг = Не СтрокаСписка.БезопасныйРежимФлаг;
		ВызватьИсключение;
	КонецПопытки;
	
	Попытка
		РегистрыСведений.ПараметрыРаботыВерсийРасширений.ОбновитьПараметрыРаботыРасширений();
	Исключение
		ИнформацияОбОшибке = ИнформацияОбОшибке();
		Если Расширение.БезопасныйРежим Тогда
			ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Возникла непредвиденная ситуация при подготовке расширений к работе (после включения безопасного режима):
				           |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
		Иначе
			ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Возникла непредвиденная ситуация при подготовке расширений к работе (после отключения безопасного режима):
				           |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
		КонецЕсли;
	КонецПопытки;
	
	Если ЗначениеЗаполнено(ТекстОшибки) Тогда
		ИнформацияОбОшибкеВосстановления = Неопределено;
		Попытка
			Расширение.БезопасныйРежим = Не Расширение.БезопасныйРежим;
			Расширение.Записать();
		Исключение
			ИнформацияОбОшибкеВосстановления = ИнформацияОбОшибке();
			ТекстОшибки = ТекстОшибки + Символы.ПС + Символы.ПС
				+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'Возникла непредвиденная ситуация при попытке отменить изменение флажка безопасного режима расширения:
					           |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибкеВосстановления));
		КонецПопытки;
		Если ИнформацияОбОшибкеВосстановления = Неопределено Тогда
			СтрокаСписка.БезопасныйРежимФлаг = Расширение.БезопасныйРежим;
			ТекстОшибки = ТекстОшибки + Символы.ПС + Символы.ПС
				+ НСтр("ru = 'Отменено изменение флажка безопасного режима расширения.'");
		КонецЕсли;
	КонецЕсли;
	
	ОбновитьСписок();
	
	Если ЗначениеЗаполнено(ТекстОшибки) Тогда
		ВызватьИсключение ТекстОшибки;
	КонецЕсли;
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция ЕстьРасширениеСДанными(ИдентификаторыРасширений)
	
	Для Каждого ИдентификаторРасширения Из ИдентификаторыРасширений Цикл
		Если ЭтоРасширениеСДанными(ИдентификаторРасширения) Тогда
			Возврат Истина;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Ложь;
	
КонецФункции

&НаСервереБезКонтекста
Функция ЭтоРасширениеСДанными(ИдентификаторРасширения)
	
	Расширение = НайтиРасширение(ИдентификаторРасширения);
	
	Если Расширение = Неопределено Тогда
		Возврат Ложь;
	КонецЕсли;
	
	Возврат Расширение.ИзменяетСтруктуруДанных();
	
КонецФункции

&НаСервере
Процедура СписокРасширенийПодключатьПриИзмененииНаСервере(ИдентификаторСтроки)
	
	СтрокаСписка = СписокРасширений.НайтиПоИдентификатору(ИдентификаторСтроки);
	Если СтрокаСписка = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ТекущееИспользование = СтрокаСписка.Подключать;
	Попытка
		Справочники.ВерсииРасширений.ПереключитьИспользованиеРасширения(СтрокаСписка.ИдентификаторРасширения, ТекущееИспользование);
	Исключение
		СтрокаСписка.Подключать = Не СтрокаСписка.Подключать;
		ОбновитьСписок();
		
		ВызватьИсключение;
	КонецПопытки;
	
	ОбновитьСписок();
	
КонецПроцедуры

&НаСервере
Процедура СписокРасширенийПередаватьВПодчиненныеУзлыРИБПриИзмененииНаСервере(ИдентификаторСтроки)
	
	СтрокаСписка = СписокРасширений.НайтиПоИдентификатору(ИдентификаторСтроки);
	
	Если СтрокаСписка = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Расширение = НайтиРасширение(СтрокаСписка.ИдентификаторРасширения);
	
	Если Расширение <> Неопределено Тогда
	
		Если Расширение.ИспользуетсяВРаспределеннойИнформационнойБазе <> СтрокаСписка.ПередаватьВПодчиненныеУзлыРИБ Тогда
			Расширение.ИспользуетсяВРаспределеннойИнформационнойБазе = СтрокаСписка.ПередаватьВПодчиненныеУзлыРИБ;
			
			ОтключитьПредупрежденияБезопасности(Расширение);
			ОтключитьИспользованиеОсновныхРолейДляВсехПользователей(Расширение);
			Попытка
				Расширение.Записать();
			Исключение
				СтрокаСписка.ПередаватьВПодчиненныеУзлыРИБ = Не СтрокаСписка.ПередаватьВПодчиненныеУзлыРИБ;
				ВызватьИсключение;
			КонецПопытки;
		КонецЕсли;
		
	КонецЕсли;
	
	ОбновитьСписок();
	
КонецПроцедуры

&НаСервере
Процедура ДобавитьЗапросРазрешений(ЗапросыРазрешений, ПомещенныеФайлы, ИдентификаторРасширения = Неопределено)
	
	МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме");
	Если Не МодульРаботаВБезопасномРежиме.ИспользуютсяПрофилиБезопасности() Тогда
		Возврат;
	КонецЕсли;
	Разрешения = Новый Массив;
	
	Для Каждого ПомещенныйФайл Из ПомещенныеФайлы Цикл
		ДанныеОбновляемогоРасширения = Неопределено;
		ТребуетсяВосстановление = Ложь;
		Попытка
			Если ИдентификаторРасширения = Неопределено Тогда
				ВременноеРасширение = РасширенияКонфигурации.Создать();
			Иначе
				ВременноеРасширение = НайтиРасширение(ИдентификаторРасширения);
				Если ВременноеРасширение = Неопределено Тогда
					ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
						НСтр("ru = 'Расширение с идентификатором %1 не существует в приложении, возможно оно было удалено в другом сеансе.'"),
						ИдентификаторРасширения);
				КонецЕсли;
				ДанныеОбновляемогоРасширения = ВременноеРасширение.ПолучитьДанные();
			КонецЕсли;
			ОтключитьПредупрежденияБезопасности(ВременноеРасширение);
			ОтключитьИспользованиеОсновныхРолейДляВсехПользователей(ВременноеРасширение);
			ДанныеРасширения = ПолучитьИзВременногоХранилища(ПомещенныйФайл.Хранение);
			ВременноеРасширение.Записать(ДанныеРасширения);
			ТребуетсяВосстановление = Истина;
			ВременноеРасширение = НайтиРасширение(Строка(ВременноеРасширение.УникальныйИдентификатор));
			СвойстваВременногоРасширения = Новый Структура;
			СвойстваВременногоРасширения.Вставить("Имя",      ВременноеРасширение.Имя);
			СвойстваВременногоРасширения.Вставить("ХешСумма", ВременноеРасширение.ХешСумма);
			Если ИдентификаторРасширения = Неопределено Тогда
				ВременноеРасширение.Удалить();
			Иначе
				ВременноеРасширение = НайтиРасширение(ИдентификаторРасширения);
				Если ВременноеРасширение = Неопределено Тогда
					ВременноеРасширение = РасширенияКонфигурации.Создать();
				КонецЕсли;
				ОтключитьПредупрежденияБезопасности(ВременноеРасширение);
				ОтключитьИспользованиеОсновныхРолейДляВсехПользователей(ВременноеРасширение);
				ВременноеРасширение.Записать(ДанныеОбновляемогоРасширения);
			КонецЕсли;
			ТребуетсяВосстановление = Ложь;
			
			Разрешения.Добавить(МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеВнешнегоМодуля(
				СвойстваВременногоРасширения.Имя, Base64Строка(СвойстваВременногоРасширения.ХешСумма)));
				
		Исключение
			ИнформацияОбОшибке = ИнформацияОбОшибке();
			Если ИдентификаторРасширения = Неопределено Тогда
				Если ПомещенныеФайлы.Количество() > 1 Тогда
					ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
							НСтр("ru = 'При получении разрешений не удалось добавить расширение из файла
							           |""%1""
							           |по причине:
							           |%2'"),
							ПомещенныйФайл.Имя,
							ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
				Иначе
					ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
							НСтр("ru = 'При получении разрешений не удалось добавить расширение по причине:
							           |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
				КонецЕсли;
			Иначе
				ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
						НСтр("ru = 'При получении разрешений не удалось обновить расширение по причине:
						           |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
			КонецЕсли;
			Если ТребуетсяВосстановление Тогда
				Попытка
					Если ИдентификаторРасширения = Неопределено Тогда
						ВременноеРасширение.Удалить();
					Иначе
						ВременноеРасширение = НайтиРасширение(ИдентификаторРасширения);
						Если ВременноеРасширение = Неопределено Тогда
							ВременноеРасширение = РасширенияКонфигурации.Создать();
						КонецЕсли;
						ОтключитьПредупрежденияБезопасности(ВременноеРасширение);
						ОтключитьИспользованиеОсновныхРолейДляВсехПользователей(ВременноеРасширение);
						ВременноеРасширение.Записать(ДанныеОбновляемогоРасширения);
					КонецЕсли;
				Исключение
					ИнформацияОбОшибке = ИнформацияОбОшибке();
					Если ИдентификаторРасширения = Неопределено Тогда 
						Если ПомещенныеФайлы.Количество() > 1 Тогда
							ТекстОшибки = ТекстОшибки + Символы.ПС + Символы.ПС
								+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
									НСтр("ru = 'При получении разрешений добавленное расширение из файла не было удалено
									           |%1
									           |по причине:
									           |%2'"),
									ПомещенныйФайл.Имя,
									ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
						Иначе
							ТекстОшибки = ТекстОшибки + Символы.ПС + Символы.ПС
								+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
									НСтр("ru = 'Возникла непредвиденная ситуация при попытке удалить временно добавленное расширение:
									           |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
						КонецЕсли;
					Иначе
						ТекстОшибки = ТекстОшибки + Символы.ПС + Символы.ПС
							+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
								НСтр("ru = 'Возникла непредвиденная ситуация при попытке восстановить временно измененное расширение:
								           |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
					КонецЕсли;
				КонецПопытки;
			КонецЕсли;
			ВызватьИсключение ТекстОшибки;
		КонецПопытки;
	КонецЦикла;
	
	УстановленныеРасширения = РасширенияКонфигурации.Получить();
	Для Каждого Расширение Из УстановленныеРасширения Цикл
		Разрешения.Добавить(МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеВнешнегоМодуля(
			Расширение.Имя, Base64Строка(Расширение.ХешСумма)));
	КонецЦикла;
	
	ЗапросыРазрешений.Добавить(МодульРаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(Разрешения,
		ОбщегоНазначения.ИдентификаторОбъектаМетаданных("РегистрСведений.ПараметрыРаботыВерсийРасширений")));
	
КонецПроцедуры

&НаСервере
Процедура ОтключитьПредупрежденияБезопасности(Расширение)
	
	Справочники.ВерсииРасширений.ОтключитьПредупрежденияБезопасности(Расширение);
	
КонецПроцедуры

&НаСервере
Процедура ОтключитьИспользованиеОсновныхРолейДляВсехПользователей(Расширение)
	
	Справочники.ВерсииРасширений.ОтключитьИспользованиеОсновныхРолейДляВсехПользователей(Расширение);
	
КонецПроцедуры

&НаСервере
Процедура УстановитьУсловноеОформление()
	
	УсловноеОформление.Элементы.Очистить();
	
	// Оформление ТолькоПросмотр для общих расширений и расширений, полученных в подчиненном узле РИБ из главного.
	
	Элемент = УсловноеОформление.Элементы.Добавить();
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СписокРасширенийПодключать.Имя);
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СписокРасширенийБезопасныйРежимФлаг.Имя);
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СписокРасширенийПередаватьВПодчиненныеУзлыРИБ.Имя);
	
	ГруппаЭлементовОтбора = Элемент.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
	ГруппаЭлементовОтбора.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли;
	
	ГруппаЭлементовОтбораОбщее = ГруппаЭлементовОтбора.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
	ГруппаЭлементовОтбораОбщее.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;
	
	ОтборЭлемента = ГруппаЭлементовОтбораОбщее.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СписокРасширений.Общее");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;
	
	ОтборЭлемента = ГруппаЭлементовОтбораОбщее.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ЭтоНеразделенныйПользовательВОбласти");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;
	
	ОтборЭлемента = ГруппаЭлементовОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СписокРасширений.ПолученоИзГлавногоУзлаРИБ");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура УстановитьДоступностьКнопокКомандныхПанелей()
	
	Если Элементы.СтраницыОбновление.ТекущаяСтраница = Элементы.СтраницаДлительнаяОперация Тогда 
		
		Элементы.СписокРасширенийДобавить.Доступность = Ложь;
		Элементы.СписокРасширенийУдалить.Доступность = Ложь;
		Элементы.СписокРасширенийОбновитьИзФайла.Доступность = Ложь;
		
		Элементы.СписокРасширенийКонтекстноеМенюДобавить.Доступность = Ложь;
		Элементы.СписокРасширенийКонтекстноеМенюУдалить.Доступность = Ложь;
		Элементы.СписокРасширенийКонтекстноеМенюОбновитьИзФайла.Доступность = Ложь;
		
	ИначеЕсли Элементы.СтраницыОбновление.ТекущаяСтраница = Элементы.СтраницаСписокРасширений Тогда 
		
		ВыбранаОднаСтрока = Элементы.СписокРасширений.ВыделенныеСтроки.Количество() = 1;
		
		РедактированиеДоступно = Истина;
		Если ВыбранаОднаСтрока Тогда 
			ТекущееРасширение = Элементы.СписокРасширений.ТекущиеДанные;
			
			РедактированиеДоступно = (Не ТекущееРасширение.Общее 
				Или Не ЭтоНеразделенныйПользовательВОбласти())
				И Не ТекущееРасширение.ПолученоИзГлавногоУзлаРИБ;
		КонецЕсли;
		
		Элементы.СписокРасширенийДобавить.Доступность = Истина;
		Элементы.СписокРасширенийУдалить.Доступность = РедактированиеДоступно;
		Элементы.СписокРасширенийОбновитьИзФайла.Доступность = РедактированиеДоступно;
		
		Элементы.СписокРасширенийКонтекстноеМенюДобавить.Доступность = Истина;
		Элементы.СписокРасширенийКонтекстноеМенюУдалить.Доступность = РедактированиеДоступно;
		Элементы.СписокРасширенийКонтекстноеМенюОбновитьИзФайла.Доступность = ВыбранаОднаСтрока И РедактированиеДоступно;
		
		ПодключитьОбработчикОжидания("УстановитьЗаголовокЭлементаКомментарий", 0.1, Истина);

	КонецЕсли;
	
КонецПроцедуры

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

&НаСервереБезКонтекста
Функция ИмяСобытияЗаполненияПараметров()
	
	Возврат РегистрыСведений.ПараметрыРаботыВерсийРасширений.ИмяСобытияЗаполненияПараметров();
	
КонецФункции

&НаСервереБезКонтекста
Функция РезультатПроверкиВозможностиПримененияВсех()
	
	ИнформацияОПроблемахПрименения = РасширенияКонфигурации.ПроверитьВозможностьПримененияВсех();
	
	Результат = Новый Структура;
	Результат.Вставить("КоличествоПроблем", ИнформацияОПроблемахПрименения.Количество());
	Результат.Вставить("ИнформацияОПроблемах", Новый ТекстовыйДокумент);

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

&НаКлиенте
Процедура ВключитьБезопасныйРежимЗавершение()
	
	ОшибкиИзмененияРасширений = Новый Массив;
	ВключитьВыключитьБезопасныйРежимДляВыделенныхРасширений(Истина, ОшибкиИзмененияРасширений);
	ПодключитьОбработчикОжидания("СкрытьДлительнуюОперацию", 0.1, Истина);
	ВывестиИнформациюОбОшибкахПеренастройкиРасширений(ОшибкиИзмененияРасширений);
	
КонецПроцедуры

&НаКлиенте
Процедура ВыключитьБезопасныйРежимЗавершение()
	
	ОшибкиИзмененияРасширений = Новый Массив;
	ВключитьВыключитьБезопасныйРежимДляВыделенныхРасширений(Ложь, ОшибкиИзмененияРасширений);
	ПодключитьОбработчикОжидания("СкрытьДлительнуюОперацию", 0.1, Истина);
	ВывестиИнформациюОбОшибкахПеренастройкиРасширений(ОшибкиИзмененияРасширений);
	
КонецПроцедуры

&НаСервере
Процедура ВключитьВыключитьБезопасныйРежимДляВыделенныхРасширений(Значение, ОшибкиИзмененияРасширений)
	
	Для Каждого ИдентификаторСтроки Из Элементы.СписокРасширений.ВыделенныеСтроки Цикл
		СтрокаСписка = СписокРасширений.НайтиПоИдентификатору(ИдентификаторСтроки);
		Если СтрокаСписка = Неопределено Тогда
			Продолжить;
		КонецЕсли;
		
		СтрокаСписка.БезопасныйРежимФлаг = Значение;
		
		Расширение = НайтиРасширение(СтрокаСписка.ИдентификаторРасширения);
		
		Если Расширение = Неопределено
			Или Расширение.БезопасныйРежим = СтрокаСписка.БезопасныйРежимФлаг Тогда
			Продолжить;
		КонецЕсли;
		
		Расширение.БезопасныйРежим = СтрокаСписка.БезопасныйРежимФлаг;
		ОтключитьПредупрежденияБезопасности(Расширение);
		ОтключитьИспользованиеОсновныхРолейДляВсехПользователей(Расширение);
		Попытка
			Расширение.Записать();
		Исключение
			СтрокаСписка.БезопасныйРежимФлаг = Не СтрокаСписка.БезопасныйРежимФлаг;
			ОписаниеПроблемы = СтрокаСписка.Синоним + ": " + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
			ОшибкиИзмененияРасширений.Добавить(ОписаниеПроблемы);
		КонецПопытки;
		
	КонецЦикла;
	
	РегистрыСведений.ПараметрыРаботыВерсийРасширений.ОбновитьПараметрыРаботыРасширений();
	
КонецПроцедуры

&НаКлиенте
Процедура ВывестиИнформациюОбОшибкахПеренастройкиРасширений(ОшибкиИзмененияРасширений)
	Если ОшибкиИзмененияРасширений.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	
	ИнформацияОбОшибках = "";
	Для Каждого СтрокаОшибка Из ОшибкиИзмененияРасширений Цикл
		ИнформацияОбОшибках = ?(ЗначениеЗаполнено(ИнформацияОбОшибках), ИнформацияОбОшибках + Символы.ПС + Символы.ПС + СтрокаОшибка, СтрокаОшибка);
	КонецЦикла;
	
	ПараметрыФормыВопроса = СтандартныеПодсистемыКлиент.ПараметрыВопросаПользователю();
	ПараметрыФормыВопроса.Картинка = БиблиотекаКартинок.ДиалогВосклицание;
	ПараметрыФормыВопроса.ПредлагатьБольшеНеЗадаватьЭтотВопрос = Ложь;
	ПараметрыФормыВопроса.Заголовок = НСтр("ru = 'Не все расширения удалось перенастроить'");
	СтандартныеПодсистемыКлиент.ПоказатьВопросПользователю(Неопределено,
		ИнформацияОбОшибках,
		РежимДиалогаВопрос.ОК,
		ПараметрыФормыВопроса);
	
КонецПроцедуры

&НаКлиенте
Процедура ВключитьПередачуВПодчиненныеУзлыРИБЗавершение()
	
	ОшибкиИзмененияРасширений = Новый Массив;
	ВключитьВыключитьПередачуВПодчиненныеУзлыРИБ(Истина, ОшибкиИзмененияРасширений);
	ПодключитьОбработчикОжидания("СкрытьДлительнуюОперацию", 0.1, Истина);
	ВывестиИнформациюОбОшибкахПеренастройкиРасширений(ОшибкиИзмененияРасширений);
	
КонецПроцедуры

&НаКлиенте
Процедура ВыключитьПередачуВПодчиненныеУзлыРИБЗавершение()
	
	ОшибкиИзмененияРасширений = Новый Массив;
	ВключитьВыключитьПередачуВПодчиненныеУзлыРИБ(Ложь, ОшибкиИзмененияРасширений);
	ПодключитьОбработчикОжидания("СкрытьДлительнуюОперацию", 0.1, Истина);
	ВывестиИнформациюОбОшибкахПеренастройкиРасширений(ОшибкиИзмененияРасширений);
	
КонецПроцедуры

&НаСервере
Процедура ВключитьВыключитьПередачуВПодчиненныеУзлыРИБ(Значение, ОшибкиИзмененияРасширений)
	
	Для Каждого ИдентификаторСтроки Из Элементы.СписокРасширений.ВыделенныеСтроки Цикл
		СтрокаСписка = СписокРасширений.НайтиПоИдентификатору(ИдентификаторСтроки);
		Если СтрокаСписка = Неопределено Тогда
			Продолжить;
		КонецЕсли;
		
		СтрокаСписка.ПередаватьВПодчиненныеУзлыРИБ = Значение;
		
		Расширение = НайтиРасширение(СтрокаСписка.ИдентификаторРасширения);
		
		Если Расширение = Неопределено
			Или Расширение.ИспользуетсяВРаспределеннойИнформационнойБазе = СтрокаСписка.ПередаватьВПодчиненныеУзлыРИБ Тогда
			Продолжить;
		КонецЕсли;
		
		Расширение.ИспользуетсяВРаспределеннойИнформационнойБазе = СтрокаСписка.ПередаватьВПодчиненныеУзлыРИБ;
		ОтключитьПредупрежденияБезопасности(Расширение);
		ОтключитьИспользованиеОсновныхРолейДляВсехПользователей(Расширение);
		Попытка
			Расширение.Записать();
		Исключение
			СтрокаСписка.ПередаватьВПодчиненныеУзлыРИБ = Не СтрокаСписка.ПередаватьВПодчиненныеУзлыРИБ;
			ОписаниеПроблемы = СтрокаСписка.Синоним + ": " + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
			ОшибкиИзмененияРасширений.Добавить(ОписаниеПроблемы);
		КонецПопытки;
		
	КонецЦикла;
	
	ОбновитьСписок();
	
КонецПроцедуры

&НаКлиенте
Процедура ВключитьПодключениеРасширений()
	
	ОшибкиИзмененияРасширений = Новый Массив;
	ВключитьВыключитьПодключениеРасширений(Истина, ОшибкиИзмененияРасширений);
	ПодключитьОбработчикОжидания("СкрытьДлительнуюОперацию", 0.1, Истина);
	ВывестиИнформациюОбОшибкахПеренастройкиРасширений(ОшибкиИзмененияРасширений);
	
КонецПроцедуры

&НаКлиенте
Процедура ВыключитьПодключениеРасширений()
	
	СинонимыРасширений = СинонимыРасширенийВыделенныхРасширенийДляВыключения();
	Если СинонимыРасширений.СДанными.Количество() = 1 И СинонимыРасширений.БезДанных.Количество() = 0 Тогда
		
		ТекущееРасширение = Элементы.СписокРасширений.ТекущиеДанные;
		Если ТекущееРасширение = Неопределено Тогда
			Возврат;
		КонецЕсли;
		ТекущееРасширение.Подключать = Ложь;
		Контекст = Новый Структура;
		Контекст.Вставить("ИдентификаторСтроки", ТекущееРасширение.ПолучитьИдентификатор());
	
		Оповещение = Новый ОписаниеОповещения("ОтключитьРасширениеПослеПодтверждения", ЭтотОбъект, Контекст);
		ПользователиСлужебныйКлиент.ПоказатьПредупреждениеБезопасности(Оповещение,
			ПользователиСлужебныйКлиентСервер.ВидыПредупрежденийБезопасности().ПередОтключениемРасширенияСДанными);

	ИначеЕсли СинонимыРасширений.СДанными.Количество() > 0 Тогда
		
		Если СинонимыРасширений.СДанными.Количество() = 1 Тогда
			ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Среди отключаемых расширений есть расширение, хранящее данные в приложении, которые станут недоступными.
				           |Кроме того, некоторые данные самого приложения могут тоже стать недоступными для изменения.
				           |
				           |Расширение с данными:
				           | - %1'"),
				СинонимыРасширений.СДанными[0]);
		Иначе
			РасширенияСДаннымиТекст = СтрСоединить(СинонимыРасширений.СДанными, Символы.ПС + " - ");
			ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Среди отключаемых расширений есть расширения, хранящие данные в приложении, которые станут недоступными.
				           |Кроме того, некоторые данные самого приложения могут тоже стать недоступными для изменения.
				           |
				           |Расширения с данными:
				           | - %1'"),
				РасширенияСДаннымиТекст);
		КонецЕсли;
			
		ОбработчикЗавершения = Новый ОписаниеОповещения(
			"ВыключитьРасширенияПослеВопроса", ЭтотОбъект);
		
		Кнопки = Новый СписокЗначений;
		Если СинонимыРасширений.БезДанных.Количество() > 0 Тогда
			Кнопки.Добавить("ОтключитьТолькоБезДанных", НСтр("ru = 'Отключить только расширения без данных'"));
			
			Если СинонимыРасширений.БезДанных.Количество() = 1 Тогда
				РасширенияБезДанныхТекст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'Расширение без данных:
			           | - %1'"),
					СинонимыРасширений.БезДанных[0]);
			Иначе
				РасширенияБезДанныхТекст = СтрСоединить(СинонимыРасширений.БезДанных, Символы.ПС + " - ");
				РасширенияБезДанныхТекст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'Расширения без данных:
			           | - %1'"), 
					РасширенияБезДанныхТекст);
			КонецЕсли;
			ТекстВопроса = ТекстВопроса + Символы.ПС + Символы.ПС + РасширенияБезДанныхТекст;
		КонецЕсли;
		Кнопки.Добавить("ОтключитьВсе", НСтр("ru = 'Отключить все'"));
		Кнопки.Добавить("Отмена", НСтр("ru = 'Отмена'"));
		
		ПараметрыВопроса = СтандартныеПодсистемыКлиент.ПараметрыВопросаПользователю();
		ПараметрыВопроса.Заголовок = НСтр("ru = 'Предупреждение'");
		ПараметрыВопроса.Картинка = БиблиотекаКартинок.ДиалогВосклицание;
		ПараметрыВопроса.КнопкаПоУмолчанию = "ОтключитьТолькоБезДанных";
		ПараметрыВопроса.ПредлагатьБольшеНеЗадаватьЭтотВопрос = Ложь;
		
		СтандартныеПодсистемыКлиент.ПоказатьВопросПользователю(ОбработчикЗавершения,
			ТекстВопроса, Кнопки, ПараметрыВопроса);
			
	Иначе
		ОшибкиИзмененияРасширений = Новый Массив;
		ВключитьВыключитьПодключениеРасширений(Ложь, ОшибкиИзмененияРасширений);
		ПодключитьОбработчикОжидания("СкрытьДлительнуюОперацию", 0.1, Истина);
		ВывестиИнформациюОбОшибкахПеренастройкиРасширений(ОшибкиИзмененияРасширений);
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ВключитьВыключитьПодключениеРасширений(Значение, ОшибкиИзмененияРасширений, ОбрабатыватьРасширенияСДанными = Истина)
	
	Для Каждого ИдентификаторСтроки Из Элементы.СписокРасширений.ВыделенныеСтроки Цикл
		СтрокаСписка = СписокРасширений.НайтиПоИдентификатору(ИдентификаторСтроки);
		Если СтрокаСписка = Неопределено Тогда
			Продолжить;
		КонецЕсли;
		
		Если Не ОбрабатыватьРасширенияСДанными И ЭтоРасширениеСДанными(СтрокаСписка.ИдентификаторРасширения) Тогда
			Продолжить;
		КонецЕсли;
		
		СтрокаСписка.Подключать = Значение;
		
	Попытка
		Справочники.ВерсииРасширений.ПереключитьИспользованиеРасширения(СтрокаСписка.ИдентификаторРасширения, Значение);
	Исключение
		СтрокаСписка.Подключать = Не СтрокаСписка.Подключать;
		ОписаниеПроблемы = СтрокаСписка.Синоним + ": " + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
		ОшибкиИзмененияРасширений.Добавить(ОписаниеПроблемы);
	КонецПопытки;
		
	КонецЦикла;
	
	ОбновитьСписок();
	
КонецПроцедуры

&НаСервере
Функция СинонимыРасширенийВыделенныхРасширенийДляВыключения()
	
	СДанными = Новый массив;
	БезДанных = Новый массив;
	
	Для Каждого ИдентификаторСтроки Из Элементы.СписокРасширений.ВыделенныеСтроки Цикл
		СтрокаСписка = СписокРасширений.НайтиПоИдентификатору(ИдентификаторСтроки);
		Если СтрокаСписка = Неопределено И СтрокаСписка.Подключать Тогда
			Продолжить;
		КонецЕсли;
		Если ЭтоРасширениеСДанными(СтрокаСписка.ИдентификаторРасширения) Тогда
			СДанными.Добавить(СтрокаСписка.Синоним);
		Иначе
			БезДанных.Добавить(СтрокаСписка.Синоним);
		КонецЕсли;
	КонецЦикла;
	
	СинонимыРасширений = Новый Структура;
	СинонимыРасширений.Вставить("СДанными", СДанными);
	СинонимыРасширений.Вставить("БезДанных", БезДанных);
	
	Возврат СинонимыРасширений;
	
КонецФункции

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

&НаСервереБезКонтекста
Процедура СохранитьСвойстваРасширений(ИдентификаторРасширения, СвойстваРасширений)
	РегистрыСведений.СвойстваРасширений.СохранитьСвойстваРасширений(ИдентификаторРасширения, СвойстваРасширений);
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция СвойстваРасширений(ТекущееРасширение)
	
	Свойства = Новый Структура;
	Свойства.Вставить("Ответственный", ТекущееРасширение.Ответственный);
	Свойства.Вставить("Комментарий", ТекущееРасширение.Комментарий);
	
	Возврат Свойства;
	
КонецФункции

&НаСервере
Процедура ОбновитьСвойстваРасширенийВСписке()
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	Расширения.ИдентификаторРасширения КАК ИдентификаторРасширения
		|ПОМЕСТИТЬ ИдентификаторыРасширений
		|ИЗ
		|	&СписокРасширений КАК Расширения
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	СвойстваРасширений.Ответственный КАК Ответственный,
		|	СвойстваРасширений.Комментарий КАК Комментарий,
		|	ИдентификаторыРасширений.ИдентификаторРасширения КАК ИдентификаторРасширения
		|ИЗ
		|	ИдентификаторыРасширений КАК ИдентификаторыРасширений
		|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СвойстваРасширений КАК СвойстваРасширений
		|		ПО ИдентификаторыРасширений.ИдентификаторРасширения = СвойстваРасширений.ИдентификаторРасширения";
	
	Запрос.УстановитьПараметр("СписокРасширений", СписокРасширений.Выгрузить());
	РезультатЗапроса = Запрос.Выполнить();
	
	Выборка = РезультатЗапроса.Выбрать();
	
	Пока Выборка.Следующий() Цикл
		СтруктураДляПоиска = Новый Структура;
		СтруктураДляПоиска.Вставить("ИдентификаторРасширения", Выборка.ИдентификаторРасширения);
		СтрокиРасширений = СписокРасширений.НайтиСтроки(СтруктураДляПоиска);
		ЗаполнитьЗначенияСвойств(СтрокиРасширений[0], Выборка);
		СтрокиРасширений[0].ЕстьКомментарий = ЗначениеЗаполнено(СтрокиРасширений[0].Комментарий);
	КонецЦикла;
	
КонецПроцедуры

&НаКлиенте
Процедура УстановитьЗаголовокЭлементаКомментарий()
	
	Если Элементы.СписокРасширений.ТекущиеДанные = Неопределено Тогда
		 Возврат;
	КонецЕсли;
	
	Элементы.СписокРасширенийКомментарий.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Комментарий для %1'"), Элементы.СписокРасширений.ТекущиеДанные.Синоним);
		
КонецПроцедуры

&НаКлиенте
Процедура УстановитьОтветственногоПослеВыбора(Ответственный, ДополнительныеПараметры) Экспорт
	
	Если Ответственный = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	УстановитьОтветственногоДляВыделенныхРасширений(Ответственный);
	
КонецПроцедуры

&НаСервере
Процедура УстановитьОтветственногоДляВыделенныхРасширений(Ответственный)
	
	Для Каждого ИдентификаторСтроки Из Элементы.СписокРасширений.ВыделенныеСтроки Цикл
		СтрокаСписка = СписокРасширений.НайтиПоИдентификатору(ИдентификаторСтроки);
		Если СтрокаСписка = Неопределено Тогда
			Продолжить;
		КонецЕсли;
		СтрокаСписка.Ответственный = Ответственный;
		СохранитьСвойстваРасширений(СтрокаСписка.ИдентификаторРасширения, СвойстваРасширений(СтрокаСписка));
	КонецЦикла;
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция ЭтоОшибкаИсключительнойБлокировкиИнформационнойБазы(ТекстОшибки)
	ТекстОшибкиИсключительнойБлокировки = НСтр("ru='Ошибка исключительной блокировки информационной базы'");
	Возврат (СтрНайти(ТекстОшибки, ТекстОшибкиИсключительнойБлокировки) <> 0);
КонецФункции

&НаКлиенте
Процедура ОткрытьФормуЗавершенияРаботыПользователей()

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

		ПараметрыФормы = МодульСоединенияИБКлиент.ПараметрыОткрытияФормыОшибкиУстановкиМонопольногоРежима();
		КоличествоКЗагрузке = РасширенияДляПовторногоДобавления.Количество();
		ПараметрыФормы.Заголовок = ?(КоличествоКЗагрузке = 1,
			НСтр("ru = 'Не удалось добавить расширение'"), НСтр("ru = 'Не удалось добавить расширения'"));
		ПараметрыФормы.ТекстСообщенияОбОшибке = ?(КоличествоКЗагрузке = 1, 
			НСтр("ru = 'Не удалось добавить расширение, т.к. с приложением работают пользователи.'"),
			СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Не удалось добавить расширения (%1), т.к. с приложением работают пользователи.'"), КоличествоКЗагрузке));
		ПараметрыФормы.ТекстСообщенияОбОшибкеЗавершенияРаботы = ?(КоличествоКЗагрузке = 1, 
			НСтр("ru = 'Невозможно выполнить добавление расширения, т.к. не удалось завершить работу пользователей:'"),
			СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Невозможно выполнить добавление расширений (%1), т.к. не удалось завершить работу пользователей:'"), КоличествоКЗагрузке));
		ПараметрыФормы.СообщениеПриВходеВПриложение = НСтр("ru = 'Приложение заблокировано для добавления расширения.'");
		ПараметрыФормы.ЗавершатьВсеСеансыКромеТекущего = Истина;
		ПараметрыФормы.ЗавершатьСеансКонфигуратора = Истина;
		ПараметрыФормы.ПериодБлокировки = 60;
		
		МодульСоединенияИБКлиент.ПриОткрытииФормыОшибкиУстановкиМонопольногоРежима(Оповещение, ПараметрыФормы);
	Иначе
		СтандартныеПодсистемыКлиент.ОткрытьСписокАктивныхПользователей();
	КонецЕсли;

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

&НаКлиенте
Процедура ПослеУстановкиМонопольногоРежима(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Ложь Тогда // Монопольный режим установлен.
		ПоказатьДлительнуюОперацию();
		ПодключитьОбработчикОжидания("ПовторноеДобавлениеРасширенияСДанными", 0.1, Истина);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПовторноеДобавлениеРасширенияСДанными()
	
	Если РасширенияДляПовторногоДобавления = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	НеподключенныеРасширения = "";
	РасширенияИзменены = Ложь;
	ПодтверждениеЗаменыИмени = Новый Структура("СтароеИмя, НовоеИмя", "", "");
	ИзменитьРасширенияНаСервере(РасширенияДляПовторногоДобавления.ВыгрузитьЗначения(), Неопределено, НеподключенныеРасширения,
		РасширенияИзменены, ПодтверждениеЗаменыИмени);
		
	ПодключитьОбработчикОжидания("СкрытьДлительнуюОперацию", 0.1, Истина);
	Если РасширенияДляПовторногоДобавления.Количество() > 0 Тогда
		ОткрытьФормуЗавершенияРаботыПользователей();
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти