СконвертироватьФайлыВПрисоединенные (БСП)

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

Сконвертировать файлы присоединенные. Переносит файлы из справочника Файлы в присоединенные файлы при объекте-владельце файлов и помечает

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

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

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

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

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

ОбновитьПрисоединенныйФайл (БСП)

КоличествоПрисоединенныхФайлов (БСП)

ДанныеПрисоединенныхФайловПисьма (БСП)

ПриПолученииПрисоединенныхФайлов (БСП)

КомандаУправленияПрисоединеннымиФайлами (БСП)

СкопироватьПрисоединенныеФайлы (БСП)

ПриЗаписиПрисоединенногоФайлаСервер (БСП)

ЗаполнитьПрисоединенныеФайлыКОбъекту (БСП)

ВсеПодчиненныеФайлы (БСП)

TurboConf - расширение Конфигуратора 1С