#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область СлужебныеПроцедурыИФункции
Функция ПараметрыПереносаФайлов() Экспорт
Результат = Новый Структура("Действие,ПереноситьВТом,ТомХраненияПриемник");
Возврат Результат;
КонецФункции
Функция ВыполнитьПереносФайлов(ФайлыДляПереноса, Параметры) Экспорт
ОшибкиПереноса = Новый Массив;
Если Параметры.Действие = "ПеренестиМеждуТомами" Тогда
ДействиеДляЖурнала = НСтр("ru = 'между томами на сервере.'");
ИначеЕсли Параметры.Действие = "ПеренестиВТома" Тогда
ДействиеДляЖурнала = НСтр("ru = 'в тома на сервере.'")
Иначе
ДействиеДляЖурнала = НСтр("ru = 'в информационную базу.'")
КонецЕсли;
ЗаписьЖурналаРегистрации(НСтр("ru = 'Файлы.Начало переноса файлов.'", ОбщегоНазначения.КодОсновногоЯзыка()),
УровеньЖурналаРегистрации.Информация,,,
НСтр("ru = 'Начат перенос файлов'") + " " + ДействиеДляЖурнала);
ФайловКПереносу = ФайлыДляПереноса.Количество();
СвойстваТома = Новый Структура("ПутьКТому, МаксимальныйОбъемТома");
СвойстваТома.Вставить("ТекущийОбъемТома", 0);
Если Параметры.ПереноситьВТом Тогда
СвойстваТома.ПутьКТому = РаботаСФайламиВТомахСлужебный.ПолныйПутьТома(Параметры.ТомХраненияПриемник);
СвойстваТома.ТекущийОбъемТома = РаботаСФайламиВТомахСлужебный.ОбъемТома(Параметры.ТомХраненияПриемник);
СвойстваТома.МаксимальныйОбъемТома = 1024*1024 * ОбщегоНазначения.ЗначениеРеквизитаОбъекта(
Параметры.ТомХраненияПриемник, "МаксимальныйРазмер");
КонецЕсли;
ПеренесеноФайлов = 0;
Для Каждого Файл Из ФайлыДляПереноса Цикл
ПеренестиФайл(Файл, СвойстваТома, Параметры, ОшибкиПереноса, ПеренесеноФайлов);
КонецЦикла;
ТекстЗаписиОЗавершении = НСтр("ru = 'Завершен перенос файлов %1
|Перенесено файлов: %2'");
ТекстЗаписиОЗавершении = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
ТекстЗаписиОЗавершении, ДействиеДляЖурнала, Формат(ПеренесеноФайлов, "ЧН=0; ЧГ="));
Если ПеренесеноФайлов < ФайловКПереносу Тогда
ТекстЗаписиОЗавершении = ТекстЗаписиОЗавершении + "
|" + НСтр("ru = 'Количество ошибок при переносе: %1'");
ТекстЗаписиОЗавершении = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
ТекстЗаписиОЗавершении, Формат(ФайловКПереносу - ПеренесеноФайлов, "ЧН=0; ЧГ="));
КонецЕсли;
ЗаписьЖурналаРегистрации(НСтр("ru = 'Файлы.Завершение переноса файлов.'", ОбщегоНазначения.КодОсновногоЯзыка()),
УровеньЖурналаРегистрации.Информация,,, ТекстЗаписиОЗавершении);
Возврат Новый Структура("ПеренесеноФайлов,ОшибкиПереноса", ПеренесеноФайлов, ОшибкиПереноса);
КонецФункции
Процедура ПеренестиФайл(Файл, СвойстваТома, Параметры, ОшибкиПереноса, ПеренесеноФайлов)
ФайлСсылка = Файл.Ссылка;
СвойстваФайла = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ФайлСсылка, "Наименование, Расширение, Размер");
НачатьТранзакцию();
Попытка
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировкиДанных = Блокировка.Добавить(ФайлСсылка.Метаданные().ПолноеИмя());
ЭлементБлокировкиДанных.УстановитьЗначение("Ссылка", ФайлСсылка);
Блокировка.Заблокировать();
ФайлОбъект = ФайлСсылка.ПолучитьОбъект();
ВыброситьИсключениеПриПревышенииРазмераТома(СвойстваТома, ФайлОбъект, Параметры);
Если Параметры.Действие = "ПеренестиМеждуТомами" Тогда
ПеренестиМеждуТомами(ФайлОбъект, СвойстваТома, Параметры);
ИначеЕсли Параметры.Действие = "ПеренестиВТома" Тогда
ПеренестиВТома(ФайлОбъект, СвойстваТома, Параметры);
ИначеЕсли Параметры.Действие = "ПеренестиВБазу" Тогда
ПеренестиВБазу(ФайлОбъект, СвойстваТома, Параметры);
Иначе
ВызватьИсключение НСтр("ru='Неподдерживаемая операция.'");
КонецЕсли;
ПеренесеноФайлов = ПеренесеноФайлов + 1;
СвойстваТома.ТекущийОбъемТома = СвойстваТома.ТекущийОбъемТома + СвойстваФайла.Размер;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ИмяДляЖурнала = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением(СвойстваФайла.Наименование,
СвойстваФайла.Расширение);
Ошибка = ОшибкаПереноса(ФайлСсылка, ИнформацияОбОшибке());
Ошибка.ИмяФайла = ИмяДляЖурнала;
ОшибкиПереноса.Добавить(Ошибка);
ЗаписьЖурналаРегистрации(НСтр("ru = 'Файлы.Ошибка переноса файла.'", ОбщегоНазначения.КодОсновногоЯзыка()),
УровеньЖурналаРегистрации.Ошибка,, ФайлСсылка,
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Не удалось перенести файл %1
|%2
|по причине:
|%3"".'"),
ОбщегоНазначения.ПредметСтрокой(ФайлСсылка),
ИмяДляЖурнала, Ошибка.ПодробноеПредставлениеОшибки));
КонецПопытки;
КонецПроцедуры
Процедура ПеренестиМеждуТомами(ФайлОбъект, СвойстваТома, Параметры)
СвойстваФайла = РаботаСФайламиВТомахСлужебный.СвойстваФайлаВТоме();
ЗаполнитьЗначенияСвойств(СвойстваФайла, ФайлОбъект);
Если ТипЗнч(ФайлОбъект) = Тип("СправочникОбъект.ВерсииФайлов") Тогда
СвойстваФайла.ВладелецФайла = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(
ФайлОбъект.Владелец, "ВладелецФайла");
КонецЕсли;
ТекущийПутьКФайлу = РаботаСФайламиВТомахСлужебный.ПолноеИмяФайлаВТоме(СвойстваФайла);
ФайлНаДиске = Новый Файл(ТекущийПутьКФайлу);
Если Не ФайлНаДиске.Существует() Тогда
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Файл ""%1"" не найден.'"), ТекущийПутьКФайлу);
КонецЕсли;
СвойстваФайла.Том = Параметры.ТомХраненияПриемник;
СвойстваФайла.ПутьКФайлу = "";
НовыйПутьКФайлу = РаботаСФайламиВТомахСлужебный.ПолноеИмяФайлаВТоме(СвойстваФайла, ФайлОбъект.ДатаМодификацииУниверсальная);
КопироватьФайл(ТекущийПутьКФайлу, НовыйПутьКФайлу);
ФайлОбъект.Том = Параметры.ТомХраненияПриемник;
ФайлОбъект.ПутьКФайлу = Сред(НовыйПутьКФайлу, СтрДлина(СвойстваТома.ПутьКТому) + 1);
ФайлОбъект.Записать();
РаботаСФайламиВТомахСлужебный.УдалитьФайл(ТекущийПутьКФайлу);
КонецПроцедуры
Процедура ПеренестиВТома(ФайлОбъект, СвойстваТома, Параметры)
ДанныеФайла = РаботаСФайлами.ДвоичныеДанныеФайла(ФайлОбъект.Ссылка);
ФайлОбъект.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске;
РаботаСФайламиВТомахСлужебный.ДобавитьФайл(ФайлОбъект, ДанныеФайла,
ФайлОбъект.ДатаМодификацииУниверсальная, , ?(Параметры.ПереноситьВТом, Параметры.ТомХраненияПриемник, Неопределено));
Если ФайлОбъект.ТипХраненияФайла <> Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда
РегистрыСведений.ХранилищеФайлов.УдалитьДвоичныеДанные(ФайлОбъект.Ссылка);
КонецЕсли;
ФайлОбъект.Записать();
КонецПроцедуры
Процедура ПеренестиВБазу(ФайлОбъект, СвойстваТома, Параметры)
ДанныеФайла = РаботаСФайламиВТомахСлужебный.ДанныеФайла(ФайлОбъект.Ссылка);
РаботаСФайламиСлужебный.ЗаписатьФайлВИнформационнуюБазу(ФайлОбъект.Ссылка, ДанныеФайла);
ПутьКФайлу = РаботаСФайламиВТомахСлужебный.ПолноеИмяФайлаВТоме(
Новый Структура("Том, ПутьКФайлу", ФайлОбъект.Том, ФайлОбъект.ПутьКФайлу));
ФайлОбъект.Том = Неопределено;
ФайлОбъект.ПутьКФайлу = "";
ФайлОбъект.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе;
ФайлОбъект.Записать();
РаботаСФайламиВТомахСлужебный.УдалитьФайл(ПутьКФайлу);
КонецПроцедуры
Функция ОшибкаПереноса(ФайлСсылка, ИнформацияОбОшибке)
ОписаниеОшибки = Новый Структура;
ОписаниеОшибки.Вставить("ИмяФайла","");
ОписаниеОшибки.Вставить("Ошибка", "");
ОписаниеОшибки.Вставить("ПодробноеПредставлениеОшибки", "");
ОписаниеОшибки.Вставить("Версия", ФайлСсылка);
ОписаниеОшибки.Ошибка = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке);
ОписаниеОшибки.ПодробноеПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке);
Возврат ОписаниеОшибки;
КонецФункции
Процедура ВыброситьИсключениеПриПревышенииРазмераТома(Знач СвойстваТома, Знач ФайлОбъект, Знач Параметры)
Если Параметры.ПереноситьВТом
И СвойстваТома.МаксимальныйОбъемТома > 0
И СвойстваТома.ТекущийОбъемТома + ФайлОбъект.Размер > СвойстваТома.МаксимальныйОбъемТома Тогда
ВызватьИсключение НСтр("ru = 'Превышен максимальный размер тома.'");
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#КонецЕсли