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