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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ПерейтиКНастройкеПрограмм(Команда)
	
	Закрыть();
	ЭлектроннаяПодписьКлиент.ОткрытьНастройкиЭлектроннойПодписиИШифрования("Программы");
	
КонецПроцедуры

&НаКлиенте
Процедура УстановитьРасширение(Команда)
	
	ЭлектроннаяПодписьКлиент.УстановитьРасширение(Истина);
	Закрыть();
	
КонецПроцедуры

&НаКлиенте
Процедура ВопросВПоддержку(Команда)
	
	ВыгрузитьТехническуюИнформацию(Ложь);
	
КонецПроцедуры

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

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

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

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

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

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

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

&НаКлиенте
Процедура ПослеВыполненияДействийПодробнее(Результат, Контекст) Экспорт
	Закрыть();
КонецПроцедуры

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

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