Работа с файлами / Присоединенный файл / Модуль формы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ПоказатьВСписке(Команда)
	
	СтандартныеПодсистемыКлиент.ПоказатьВСписке(ТекущаяСсылкаНаФайл(), Неопределено);
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	ИменаЭлементов = Новый Массив;
	ИменаЭлементов.Добавить("ФормаЗакончитьРедактирование");
	ИменаЭлементов.Добавить("ЗакончитьРедактирование");
	ИменаКоманд.Вставить("ЗакончитьРедактирование", ИменаЭлементов);
	
	ИменаЭлементов = Новый Массив;
	ИменаЭлементов.Добавить("ФормаОсвободить");
	ИменаКоманд.Вставить("Освободить", ИменаЭлементов);
	
	Возврат ИменаКоманд;
КонецФункции

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Функция ТекущееНаименованиеФайла()
	
	ОбъектФормы = ЭтотОбъект.Объект; // СправочникОбъект
	Возврат ОбъектФормы.Наименование;
	
КонецФункции

&НаКлиенте
Функция ТекущаяСсылкаНаФайл()
	
	ОбъектФормы = ЭтотОбъект.Объект; // СправочникОбъект
	Возврат ОбъектФормы.Ссылка;
	
КонецФункции

&НаСервере
Функция ТекущаяСсылкаНаФайлСервер()

	ОбъектФормы = ЭтотОбъект.Объект; // СправочникОбъект
	Возврат ОбъектФормы.Ссылка;

КонецФункции

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

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

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

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

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

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

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

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

Связанные материалы