Доброго времени суток! Столкнулся для себя, с проблемой : Написал обработку по копированию файлов между каталогами.
Пользователь загружает Excel - файл, в котором прописаны пути файлов и прописан путь, куда файл нужно будет скопировать.
Проблема заключается в том, что копируются все вложенные каталоги из источника в приемник.
Также, в свойствах файла, установлено свойство "Чтение" для файла. Руками я не могу даже скопировать файл, и типовая функция как, СкопироватьФайл() выдает ошибку , что недостаточно прав.
Возможно, вы предложите более простое решение в данной теме. Буду очень признателен вам за поддержку.
&НаСервере
Процедура СкопироватьКаталог(КаталогИсточник, КаталогПриемник, ПерезаписатьФайл = Ложь, МасштабироватьИзображение = Ложь, МаксШирина = 0, МаксВысота = 0)
МассивФайловДляКопирования = НайтиФайлы(КаталогИсточник,"*.*");
Для каждого ФайлДляКопирования Из МассивФайловДляКопирования Цикл
НовыйПуть = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(КаталогПриемник) + ФайлДляКопирования.Имя;
НовыйПуть = НРег(НовыйПуть);
Если ФайлДляКопирования.ЭтоКаталог() Тогда
НовыйФайл = Новый Файл(НовыйПуть);
Если ПерезаписатьФайл Тогда
Копировать = Истина;
Иначе
Копировать = НЕ НовыйФайл.Существует();
КонецЕсли;
Если Копировать Тогда
СоздатьКаталог(НовыйПуть);
КонецЕсли;
СкопироватьКаталог(ФайлДляКопирования.ПолноеИмя, НовыйПуть, ПерезаписатьФайл, МасштабироватьИзображение, МаксШирина, МаксВысота);
Иначе
Попытка
НовыйФайл = Новый Файл(НовыйПуть);
Если ПерезаписатьФайл Тогда
Копировать = Истина;
Иначе
Копировать = НЕ НовыйФайл.Существует();
КонецЕсли;
Если Копировать Тогда
ПутьКФайлу = ФайлДляКопирования.ПолноеИмя;
Если ФайлДляКопирования.ПолучитьТолькоЧтение() Тогда
ФайлДляКопирования.УстановитьТолькоЧтение(Ложь);
КонецЕсли;
Если НовыйФайл.Существует() И НовыйФайл.ПолучитьТолькоЧтение() Тогда
НовыйФайл.УстановитьТолькоЧтение(Ложь);
КонецЕсли;
Если МасштабироватьИзображение Тогда
Если НЕ БИТ_СТ_ОбщегоНазначенияСервер.МасштабироватьИзображение(ПутьКФайлу, НовыйПуть, МаксШирина, МаксВысота) Тогда
КопироватьФайл(ПутьКФайлу, НовыйПуть);
КонецЕсли;
Иначе
КопироватьФайл(ПутьКФайлу, НовыйПуть);
КонецЕсли;
КонецЕсли;
Исключение
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не удалось скопировать " + ФайлДляКопирования.ПолноеИмя + ": " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаСервере
Функция СкопироватьФайлВКаталог(СсылкаНаФайл, КаталогПриемник, ИмяФайла, ТребуетсяКопироватьВложенныеПапки = Ложь, ПерезаписатьФайл = Ложь, МасштабироватьИзображение = Ложь, МаксШирина = 0, МаксВысота = 0)
НовыйПуть = Неопределено;
Если ЭтоСправочник(СсылкаНаФайл) Тогда
ПутьКФайлу = ФайловыеФункции.ПолныйПутьТома(СсылкаНаФайл.Том) + СсылкаНаФайл.ПутьКФайлу;
Иначе
ПутьКФайлу = СсылкаНаФайл;
КонецЕсли;
КаталогИсточник = ФайловыеФункции.ПолныйПутьТома(СсылкаНаФайл.Том);
Если ЗначениеЗаполнено(ИмяФайла) Тогда
НовыйПуть = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(КаталогПриемник);
Если ТребуетсяКопироватьВложенныеПапки Тогда
МассивПапок = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ИмяФайла, "\");
ВсегоПапок = МассивПапок.Количество() - 1;
Если ВсегоПапок > 0 Тогда
Для Инд = 0 По ВсегоПапок цикл
Если Инд < ВсегоПапок Тогда
НовыйПуть = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(НовыйПуть) + МассивПапок[Инд];
Иначе
НовыйПуть = НРег(НовыйПуть);
НовыйФайл = Новый Файл(ПутьКФайлу);
Если ПерезаписатьФайл Тогда
Копировать = Истина;
Иначе
Копировать = НЕ НовыйФайл.Существует();
КонецЕсли;
Если Копировать Тогда
//СоздатьКаталог(НовыйПуть);
//СкопироватьКаталог(КаталогИсточник, НовыйПуть, ПерезаписатьФайл, МасштабироватьИзображение, МаксШирина, МаксВысота);
КонецЕсли;
Возврат НовыйПуть;
КонецЕсли;
КонецЦикла;
Иначе
НовыйПуть = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(НовыйПуть) + ИмяФайла;
КонецЕсли;
Иначе
НовыйПуть = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(НовыйПуть) + ИмяФайла;
КонецЕсли;
Попытка
НовыйПуть = НРег(НовыйПуть);
НовыйФайл = Новый Файл(ПутьКФайлу);
Если ПерезаписатьФайл Тогда
Копировать = Истина;
Иначе
Копировать = НЕ НовыйФайл.Существует();
КонецЕсли;
Если Копировать Тогда
ТекФайл = Новый Файл(ПутьКФайлу);
Если ТекФайл.ПолучитьТолькоЧтение() Тогда
ТекФайл.УстановитьТолькоЧтение(Ложь);
КонецЕсли;
Если НовыйФайл.Существует() И НовыйФайл.ПолучитьТолькоЧтение() Тогда
НовыйФайл.УстановитьТолькоЧтение(Ложь);
КонецЕсли;
Если МасштабироватьИзображение Тогда
Если НЕ БИТ_СТ_ОбщегоНазначенияСервер.МасштабироватьИзображение(ПутьКФайлу, НовыйПуть, МаксШирина, МаксВысота) Тогда
КопироватьФайл(ПутьКФайлу, НовыйПуть);
КонецЕсли;
Иначе
КопироватьФайл(ПутьКФайлу, НовыйПуть);
КонецЕсли;
КонецЕсли;
Исключение
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не удалось скопировать " + ПутьКФайлу + ": " + ОписаниеОшибки());
НовыйПуть = Неопределено;
КонецПопытки;
КонецЕсли;
Возврат НовыйПуть;
КонецФункции
&НаСервере
Функция ЭтоСправочник(Значение)
Если Значение = Неопределено Тогда
Возврат Ложь;
КонецЕсли;
Если ТипЗнч(Значение) = Тип("ПланВидовХарактеристикСсылка.СвойстваОбъектов") Тогда
ТипыЗначений = Значение.ТипЗначения.Типы();
Для каждого СтрокаТип из ТипыЗначений цикл
Если Справочники.ТипВсеСсылки().СодержитТип(СтрокаТип) Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
Иначе
Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(Значение)) Тогда
Возврат Истина;
КонецЕсли;
КонецЕсли;
Возврат Ложь;
КонецФункции
Также, в свойствах файла, установлено свойство "Чтение" для файла. Руками я не могу даже скопировать файл, и типовая функция как, СкопироватьФайл() выдает ошибку , что недостаточно прав.
(8) Например Из \\lux.ltcompany.com\ALL\1CExtenalFiles\Request_to_spend_money_form__BIT_\20170405\000001190_orbis_s.png.png в \\msk-dev-11\Bit_exchange\Шапинский\20170405\000001190_orbis_s.png.png
(13) Копирование делается где? На сервере? База файловая или клиент-серверная? Если Клиент-сервер, значит нет прав у учетной записи под которой запускается агент 1С
Примеры использования объекта FileSystemObject (FSO) в 1С Объектная модель FSO позволяет работать с файлами и папками: создавать, изменять, перемещать и удалять. Получать доступ к системным папкам: наличие, расположение. Можно получать информацию о дисках, папках и файлах: их имена, атрибуты, даты создания или изменения и т.д. Кроме того, создание и манипулирование текстовыми файлами (не двоичными!).
FSO имеет следующие объекты:
Времени сейчас разбираться в ваших кодах нет, но копирование файла на 100% позволяет Windows через этот объект.