ЗаписатьИнформациюОШифровании (БСП)

Автор: 1С
ОбщийМодуль.РаботаСФайламиСлужебный
БСП

Записать информацию шифровании. Помещает шифрованные файлы в базу и ставит признак Зашифрован файлу и всем версиям.

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

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

Рекомендации

Похожие публикации

ЗаписатьСертификатыШифрования (БСП)

ЗаписатьИнформациюВЖурналРегистрации (БСП)

ЗанестиИнформациюФайлаВРегистр (БСП)

ЗаписатьКонтактнуюИнформацию (БСП)

1С Менеджер конфигураций