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

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

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

	Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда
		
		Элементы.Описание.Высота = 0;
		Элементы.Наименование.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Верх;
		Элементы.ГруппаСведенияЧасть1.ВыравниваниеЭлементовИЗаголовков =
			ВариантВыравниванияЭлементовИЗаголовков.ЭлементыПравоЗаголовкиЛево;
		Элементы.ГруппаСведенияЧасть2.ВыравниваниеЭлементовИЗаголовков =
			ВариантВыравниванияЭлементовИЗаголовков.ЭлементыПравоЗаголовкиЛево;
		Элементы.ГруппаХарактеристикиФайла.ВыравниваниеЭлементовИЗаголовков =
			ВариантВыравниванияЭлементовИЗаголовков.ЭлементыПравоЗаголовкиЛево;
		
	КонецЕсли;
	
	ИнтеграцияПодсистемБСП.ПриСозданииФормыЭлементаФайлов(ЭтотОбъект);
	РаботаСФайламиПереопределяемый.ПриСозданииФормыЭлементаФайлов(ЭтотОбъект);
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура СертификатыШифрованияВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	ОткрытьСертификатШифрования(Неопределено);
	
КонецПроцедуры

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

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

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

&НаКлиенте
Процедура ПоказатьВСписке(Команда)
	
	ОбъектФормы = ЭтотОбъект["Объект"]; // ОпределяемыйТип.ПрисоединенныйФайлОбъект
	СтандартныеПодсистемыКлиент.ПоказатьВСписке(ОбъектФормы.Ссылка, Неопределено);
	
КонецПроцедуры

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

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

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

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

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

// СтандартныеПодсистемы.Свойства

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

// Конец СтандартныеПодсистемы.Свойства

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

#Область ОбработчикиКомандЭПИШифрования

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура УстановитьМодифицированность()
	Если Элементы.ФормаЗаписатьИЗакрыть.Видимость И Элементы.ФормаЗаписатьИЗакрыть.Доступность Тогда
		Модифицированность = Истина;
	КонецЕсли;
КонецПроцедуры

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

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

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

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

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

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

&НаКлиенте
Процедура УстановитьДоступностьКомандСпискаЭП()
	
	РаботаСФайламиСлужебныйКлиент.УстановитьДоступностьКомандСпискаЭлектронныхПодписей(ЭтотОбъект, ЭтоНовый());
	
КонецПроцедуры

&НаКлиенте
Процедура УстановитьДоступностьКомандСпискаШифрования()
	
	РаботаСФайламиСлужебныйКлиент.УстановитьДоступностьКомандСпискаСертификатовШифрования(ЭтотОбъект);
	
КонецПроцедуры

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

#Область ОбработчикиКомандДляПоддержкиСовместнойРаботыСФайлами

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

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

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

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

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

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

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

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

// СтандартныеПодсистемы.Свойства

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

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

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

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

// Конец СтандартныеПодсистемы.Свойства

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

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

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

&НаКлиенте
Процедура ПечатьСоШтампом(Команда)
	
	Если ЗначениеЗаполнено(Объект.Ссылка) Или Записать() Тогда
		
		РаботаСФайламиСлужебныйКлиент.НапечататьФайлСоШтампом(Объект.Ссылка, УникальныйИдентификатор);
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура Удалить(Команда)
	
	РаботаСФайламиСлужебныйКлиент.УдалитьДанные(
		Новый ОписаниеОповещения("ПослеУдаленияДанных", ЭтотОбъект),
		Объект.Ссылка, УникальныйИдентификатор);
	
КонецПроцедуры

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

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

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

&НаСервере
Процедура ОбновитьЗаголовок()
	
	Если ТипЗнч(Объект.ВладелецФайла) = Тип("СправочникСсылка.ПапкиФайлов") Тогда
		ТипФайла = НСтр("ru = 'Файл'");
	Иначе
		ТипФайла = НСтр("ru = 'Присоединенный файл'");
	КонецЕсли;
	
	Если ЗначениеЗаполнено(Объект.Ссылка) Тогда
		Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = '%1 (%2)'"), Строка(Объект.Ссылка), ТипФайла);
	Иначе
		Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = '%1 (Создание)'"), ТипФайла);
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиентеНаСервереБезКонтекста
Процедура СделатьКомандыЭПНедоступными(Знач ИменаКоманд)
	
	СделатьКомандуНедоступной(ИменаКоманд, "Подписать");
	СделатьКомандуНедоступной(ИменаКоманд, "ДобавитьЭПИзФайла");
	СделатьКомандуНедоступной(ИменаКоманд, "СохранитьВместеСЭП");
	
КонецПроцедуры

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

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

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

&НаСервере
Процедура ОбновитьОбъект()
	
	Прочитать();
	ДатаМодификации = МестноеВремя(Объект.ДатаМодификацииУниверсальная);
	УстановитьДоступностьКнопок(ЭтотОбъект, Элементы);
	
КонецПроцедуры

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

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

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

&НаСервереБезКонтекста
Процедура РазблокироватьОбъект(Знач Ссылка, Знач УникальныйИдентификатор)
	
	РазблокироватьДанныеДляРедактирования(Ссылка, УникальныйИдентификатор);
	
КонецПроцедуры

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

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

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

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

&НаКлиенте
Процедура ПрочитатьИУстановитьДоступностьЭлементовФормы(Результат, ДополнительныеПараметры) Экспорт
	
	ОбновитьОбъект();
	
КонецПроцедуры

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

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

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

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

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

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

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

&НаСервере
Процедура ОбновитьПояснениеОблачногоСервиса(ПрисоединенныйФайл)
	
	ВидимостьПояснения = Ложь;
	
	Если ПолучитьФункциональнуюОпцию("ИспользоватьСинхронизациюФайлов") Тогда
		
		СведенияОСинхронизации = РаботаСФайламиСлужебный.СведенияОСинхронизации(Объект.ВладелецФайла);
		Если СведенияОСинхронизации <> Неопределено Тогда
			
			УчетнаяЗапись = СведенияОСинхронизации.УчетнаяЗапись;
			ВидимостьПояснения = Истина;
			
			Элементы.ДекорацияПояснение.Заголовок = СтроковыеФункции.ФорматированнаяСтрока(
				НСтр("ru = 'Файл доступен только для просмотра, работа с ним ведется в облачном сервисе <a href=""%1"">%2</a>.'"),
				СведенияОСинхронизации.АдресПапкиВОблачномСервисе, СведенияОСинхронизации.УчетнаяЗаписьНаименование);
			Элементы.ДекорацияКартинкаСтатусСинхронизации.Видимость = НЕ СведенияОСинхронизации.Синхронизирован;
			Элементы.ДекорацияДатаСинхронизации.Заголовок = СтроковыеФункции.ФорматированнаяСтрока(
				НСтр("ru = 'Синхронизирован: <a href=""%1"">%2</a>'"),
				"OpenJournal", Формат(СведенияОСинхронизации.ДатаСинхронизации, "ДЛФ=DD"));
			
		КонецЕсли;
		
	КонецЕсли;
	
	Элементы.ГруппаПояснениеОблачногоСервиса.Видимость = ВидимостьПояснения;
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция ДанныеОтбораЖурналаРегистрации(УчетнаяЗапись)
	Возврат РаботаСФайламиСлужебный.ДанныеОтбораЖурналаРегистрации(УчетнаяЗапись);
КонецФункции

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

		ЗаполнитьЗначенияСвойств(ТекущаяСтрока, Результат);
		ЗаполнитьЗначенияСвойств(ТекущаяСтрока.РезультатПроверки, Результат);
		МодульЭлектроннаяПодписьКлиентСервер.ЗаполнитьСтатусПодписи(ТекущаяСтрока, ОбщегоНазначенияКлиент.ДатаСеанса());
		
	КонецЦикла;
	
	УстановитьМодифицированность();
КонецПроцедуры

// СтандартныеПодсистемы.ПодключаемыеКоманды

&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
	МодульПодключаемыеКомандыКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПодключаемыеКомандыКлиент");
	МодульПодключаемыеКомандыКлиент.НачатьВыполнениеКоманды(ЭтотОбъект, Команда, Объект);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ПродолжитьВыполнениеКомандыНаСервере(ПараметрыВыполнения, ДополнительныеПараметры) Экспорт
	ВыполнитьКомандуНаСервере(ПараметрыВыполнения);
КонецПроцедуры

&НаСервере
Процедура ВыполнитьКомандуНаСервере(ПараметрыВыполнения)
	МодульПодключаемыеКоманды = ОбщегоНазначения.ОбщийМодуль("ПодключаемыеКоманды");
	МодульПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, ПараметрыВыполнения, Объект);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
	МодульПодключаемыеКомандыКлиентСервер = ОбщегоНазначенияКлиент.ОбщийМодуль("ПодключаемыеКомандыКлиентСервер");
	МодульПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
КонецПроцедуры

// Конец СтандартныеПодсистемы.ПодключаемыеКоманды

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

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