Записать информацию шифровании. Помещает шифрованные файлы в базу и ставит признак Зашифрован файлу и всем версиям.
// Помещает шифрованные файлы в базу и ставит признак Зашифрован файлу и всем версиям.
//
// Параметры:
// ФайлСсылка - СправочникСсылка.Файлы - файл.
// Зашифровать - Булево - зашифровать файл, если Истина - иначе расшифровать.
// МассивДанныхДляЗанесенияВБазу - массив структур.
// УникальныйИдентификатор - УникальныйИдентификатор - уникальный идентификатор формы.
// ИмяРабочегоКаталога - Строка - рабочий каталог.
// МассивФайловВРабочемКаталогеДляУдаления - Массив - файлы, которые надо удалить из регистра.
// МассивОтпечатков - Массив - массив отпечатков сертификатов, использованных для шифрования.
//
Процедура ЗаписатьИнформациюОШифровании(ФайлСсылка, Зашифровать, МассивДанныхДляЗанесенияВБазу, УникальныйИдентификатор,
ИмяРабочегоКаталога, МассивФайловВРабочемКаталогеДляУдаления, МассивОтпечатков) Экспорт
НачатьТранзакцию();
Попытка
АдресВременногоХранилищаТекстаТекущейВерсии = "";
АдресВременногоХранилищаОсновногоФайла = "";
Для Каждого ДанныеДляЗаписиНаСервере Из МассивДанныхДляЗанесенияВБазу Цикл
Если ТипЗнч(ДанныеДляЗаписиНаСервере.ВерсияСсылка) <> Тип("СправочникСсылка.ВерсииФайлов") Тогда
АдресВременногоХранилищаОсновногоФайла = ДанныеДляЗаписиНаСервере.АдресВременногоХранилища;
Продолжить;
КонецЕсли;
АдресВременногоХранилища = ДанныеДляЗаписиНаСервере.АдресВременногоХранилища;
ВерсияСсылка = ДанныеДляЗаписиНаСервере.ВерсияСсылка;
АдресВременногоХранилищаТекста = ДанныеДляЗаписиНаСервере.АдресВременногоХранилищаТекста;
Если ВерсияСсылка = ФайлСсылка.ТекущаяВерсия Тогда
АдресВременногоХранилищаТекстаТекущейВерсии = АдресВременногоХранилищаТекста;
КонецЕсли;
ПолноеИмяФайлаВРабочемКаталоге = "";
ВРабочемКаталогеНаЧтение = Истина; // не используется
ВРабочемКаталогеВладельца = Истина;
ПолноеИмяФайлаВРабочемКаталоге = РаботаСФайламиСлужебныйВызовСервера.ПолучитьПолноеИмяФайлаИзРегистра(ВерсияСсылка,
ИмяРабочегоКаталога, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца);
Если Не ПустаяСтрока(ПолноеИмяФайлаВРабочемКаталоге) Тогда
МассивФайловВРабочемКаталогеДляУдаления.Добавить(ПолноеИмяФайлаВРабочемКаталоге);
КонецЕсли;
РаботаСФайламиСлужебныйВызовСервера.УдалитьИзРегистра(ВерсияСсылка);
СведенияОФайле = РаботаСФайламиКлиентСервер.СведенияОФайле("ФайлСВерсией");
СведенияОФайле.ИмяБезРасширения = ВерсияСсылка.ПолноеНаименование;
СведенияОФайле.Комментарий = ВерсияСсылка.Комментарий;
СведенияОФайле.АдресВременногоХранилищаФайла = АдресВременногоХранилища;
СведенияОФайле.РасширениеБезТочки = ВерсияСсылка.Расширение;
СведенияОФайле.ВремяИзменения = ВерсияСсылка.ДатаСоздания;
СведенияОФайле.ВремяИзмененияУниверсальное = ВерсияСсылка.ДатаМодификацииУниверсальная;
СведенияОФайле.Размер = ВерсияСсылка.Размер;
СведенияОФайле.ВремяИзмененияУниверсальное = ВерсияСсылка.ДатаМодификацииУниверсальная;
СведенияОФайле.НовыйСтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен;
СведенияОФайле.Зашифрован = Зашифровать;
СведенияОФайле.ХранитьВерсии = Ложь;
ОбновитьВерсиюФайла(ФайлСсылка, СведенияОФайле, ВерсияСсылка, УникальныйИдентификатор);
// Для варианта с хранением файлов на диске (на сервере) удаляем Файл из временного хранилища после получения.
Если Не ПустаяСтрока(ДанныеДляЗаписиНаСервере.АдресФайла) И ЭтоАдресВременногоХранилища(ДанныеДляЗаписиНаСервере.АдресФайла) Тогда
УдалитьИзВременногоХранилища(ДанныеДляЗаписиНаСервере.АдресФайла);
КонецЕсли;
КонецЦикла;
БлокировкаДанных = Новый БлокировкаДанных;
ЭлементБлокировкиДанных = БлокировкаДанных.Добавить(Метаданные.НайтиПоТипу(ТипЗнч(ФайлСсылка)).ПолноеИмя());
ЭлементБлокировкиДанных.УстановитьЗначение("Ссылка", ФайлСсылка);
БлокировкаДанных.Заблокировать();
ФайлОбъект = ФайлСсылка.ПолучитьОбъект();
ЗаблокироватьДанныеДляРедактирования(ФайлСсылка, , УникальныйИдентификатор);
ФайлОбъект.Зашифрован = Зашифровать;
ФайлОбъект.ТекстХранилище = Новый ХранилищеЗначения("");
ФайлОбъект.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен;
// Чтобы прошла запись ранее подписанного объекта.
ФайлОбъект.ДополнительныеСвойства.Вставить("ЗаписьПодписанногоОбъекта", Истина);
Если Зашифровать Тогда
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда
МодульЭлектроннаяПодписьСлужебный = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодписьСлужебный");
МодульЭлектроннаяПодписьСлужебный.ДобавитьСертификатыШифрования(ФайлСсылка, МассивОтпечатков);
КонецЕсли;
Иначе
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда
МодульЭлектроннаяПодписьСлужебный = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодписьСлужебный");
МодульЭлектроннаяПодписьСлужебный.ОчиститьСертификатыШифрования(ФайлСсылка);
КонецЕсли;
КонецЕсли;
МетаданныеФайла = Метаданные.НайтиПоТипу(ТипЗнч(ФайлСсылка));
ИспользованиеПолнотекстовогоПоиска = Метаданные.СвойстваОбъектов.ИспользованиеПолнотекстовогоПоиска.Использовать;
Если Не Зашифровать И АдресВременногоХранилищаТекстаТекущейВерсии <> "" Тогда
Если МетаданныеФайла.ПолнотекстовыйПоиск = ИспользованиеПолнотекстовогоПоиска Тогда
РезультатИзвлеченияТекста = ИзвлечьТекст(АдресВременногоХранилищаТекстаТекущейВерсии);
ФайлОбъект.СтатусИзвлеченияТекста = РезультатИзвлеченияТекста.СтатусИзвлеченияТекста;
ФайлОбъект.ТекстХранилище = РезультатИзвлеченияТекста.ТекстХранилище;
Иначе
ФайлОбъект.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен;
ФайлОбъект.ТекстХранилище = Новый ХранилищеЗначения("");
КонецЕсли;
КонецЕсли;
МетаданныеФайла = Метаданные.НайтиПоТипу(ТипЗнч(ФайлСсылка));
ВозможностьХранитьВерсии = ОбщегоНазначения.ЕстьРеквизитОбъекта("ТекущаяВерсия", МетаданныеФайла);
Если Не ФайлОбъект.ХранитьВерсии Или (ВозможностьХранитьВерсии И Не ЗначениеЗаполнено(ФайлОбъект.ТекущаяВерсия)) Тогда
ОбновитьДвоичныеДанныеФайлаНаСервере(ФайлОбъект, АдресВременногоХранилищаОсновногоФайла);
КонецЕсли;
ФайлОбъект.Записать();
РазблокироватьДанныеДляРедактирования(ФайлСсылка, УникальныйИдентификатор);
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
ЗаписатьСертификатыШифрования (БСП)
ЗаписатьИнформациюВЖурналРегистрации (БСП)
Канал FastCode 1C в Телеграм! Шаблоны кода, статьи, полезные советы, курсы по 1С (8К участников)