Не удается провести копирование файлов во вложенных папках между другими каталогами

1. user1304317 31.05.20 09:49 Сейчас в теме
Доброго времени суток! Столкнулся для себя, с проблемой : Написал обработку по копированию файлов между каталогами.

Пользователь загружает Excel - файл, в котором прописаны пути файлов и прописан путь, куда файл нужно будет скопировать.

Проблема заключается в том, что копируются все вложенные каталоги из источника в приемник.
Также, в свойствах файла, установлено свойство "Чтение" для файла. Руками я не могу даже скопировать файл, и типовая функция как, СкопироватьФайл() выдает ошибку , что недостаточно прав.
Возможно, вы предложите более простое решение в данной теме. Буду очень признателен вам за поддержку.

&НаСервере
Процедура СкопироватьКаталог(КаталогИсточник, КаталогПриемник, ПерезаписатьФайл = Ложь, МасштабироватьИзображение = Ложь, МаксШирина = 0, МаксВысота = 0)
	
	МассивФайловДляКопирования = НайтиФайлы(КаталогИсточник,"*.*");
	
	Для каждого ФайлДляКопирования Из МассивФайловДляКопирования Цикл
		
		НовыйПуть = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(КаталогПриемник) + ФайлДляКопирования.Имя;
		НовыйПуть = НРег(НовыйПуть);
		
		Если ФайлДляКопирования.ЭтоКаталог() Тогда
			
			НовыйФайл = Новый Файл(НовыйПуть);
			
			Если ПерезаписатьФайл Тогда
				Копировать = Истина;
			Иначе
				Копировать = НЕ НовыйФайл.Существует();
			КонецЕсли;	
			
			Если Копировать Тогда
				СоздатьКаталог(НовыйПуть);				
			КонецЕсли;
			
			СкопироватьКаталог(ФайлДляКопирования.ПолноеИмя, НовыйПуть, ПерезаписатьФайл, МасштабироватьИзображение, МаксШирина, МаксВысота);
			
		Иначе
			
			Попытка
				
				НовыйФайл = Новый Файл(НовыйПуть);
				
				Если ПерезаписатьФайл Тогда
					Копировать = Истина;
				Иначе
					Копировать = НЕ НовыйФайл.Существует();
				КонецЕсли;	
				
				Если Копировать Тогда
					
					ПутьКФайлу = ФайлДляКопирования.ПолноеИмя;
					
					Если ФайлДляКопирования.ПолучитьТолькоЧтение() Тогда
						ФайлДляКопирования.УстановитьТолькоЧтение(Ложь);
					КонецЕсли;
					
					Если НовыйФайл.Существует() И НовыйФайл.ПолучитьТолькоЧтение() Тогда
						НовыйФайл.УстановитьТолькоЧтение(Ложь);
					КонецЕсли;
										
					Если МасштабироватьИзображение Тогда
						Если НЕ БИТ_СТ_ОбщегоНазначенияСервер.МасштабироватьИзображение(ПутьКФайлу, НовыйПуть, МаксШирина, МаксВысота) Тогда
							КопироватьФайл(ПутьКФайлу, НовыйПуть);
						КонецЕсли;
					Иначе
						КопироватьФайл(ПутьКФайлу, НовыйПуть);
					КонецЕсли;
					
				КонецЕсли;	
				
			Исключение
				ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не удалось скопировать " + ФайлДляКопирования.ПолноеИмя + ": " + ОписаниеОшибки());
			КонецПопытки;
			
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры

&НаСервере
Функция СкопироватьФайлВКаталог(СсылкаНаФайл, КаталогПриемник, ИмяФайла, ТребуетсяКопироватьВложенныеПапки = Ложь, ПерезаписатьФайл = Ложь, МасштабироватьИзображение = Ложь, МаксШирина = 0, МаксВысота = 0)
	
	НовыйПуть = Неопределено;
	
	Если ЭтоСправочник(СсылкаНаФайл) Тогда 			
		
		ПутьКФайлу = ФайловыеФункции.ПолныйПутьТома(СсылкаНаФайл.Том) + СсылкаНаФайл.ПутьКФайлу;
		
	Иначе	
		
		ПутьКФайлу = СсылкаНаФайл;
		
	КонецЕсли;
	
	КаталогИсточник = ФайловыеФункции.ПолныйПутьТома(СсылкаНаФайл.Том);
	
	Если ЗначениеЗаполнено(ИмяФайла) Тогда
			
		НовыйПуть = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(КаталогПриемник);
				
		Если ТребуетсяКопироватьВложенныеПапки Тогда
			
			МассивПапок = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ИмяФайла, "\");
			ВсегоПапок = МассивПапок.Количество() - 1;
			Если ВсегоПапок > 0 Тогда
				
				Для Инд = 0 По ВсегоПапок цикл
					
					Если Инд < ВсегоПапок Тогда
						
						НовыйПуть = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(НовыйПуть) + МассивПапок[Инд];
																					
					Иначе
						
						НовыйПуть = НРег(НовыйПуть);
						НовыйФайл = Новый Файл(ПутьКФайлу);
						
						Если ПерезаписатьФайл Тогда
							Копировать = Истина;
						Иначе
							Копировать = НЕ НовыйФайл.Существует();
						КонецЕсли;	
						
						Если Копировать Тогда							
							//СоздатьКаталог(НовыйПуть);							
							//СкопироватьКаталог(КаталогИсточник, НовыйПуть, ПерезаписатьФайл, МасштабироватьИзображение, МаксШирина, МаксВысота);							
						КонецЕсли;	
						
						Возврат НовыйПуть;
						
					КонецЕсли;
					
				КонецЦикла;
				
			Иначе	
				
				НовыйПуть = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(НовыйПуть) + ИмяФайла;
									
			КонецЕсли;
			
		Иначе	
			
			НовыйПуть = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(НовыйПуть) + ИмяФайла;					
			
		КонецЕсли;
		
		Попытка
			
			НовыйПуть = НРег(НовыйПуть);			
			НовыйФайл = Новый Файл(ПутьКФайлу);
			
			Если ПерезаписатьФайл Тогда
				Копировать = Истина;
			Иначе
				Копировать = НЕ НовыйФайл.Существует();
			КонецЕсли;	
			
			Если Копировать Тогда
				
				ТекФайл = Новый Файл(ПутьКФайлу);				
				Если ТекФайл.ПолучитьТолькоЧтение() Тогда
					ТекФайл.УстановитьТолькоЧтение(Ложь);
				КонецЕсли;
				
				Если НовыйФайл.Существует() И НовыйФайл.ПолучитьТолькоЧтение() Тогда
					НовыйФайл.УстановитьТолькоЧтение(Ложь);
				КонецЕсли;
							
				Если МасштабироватьИзображение Тогда
					Если НЕ БИТ_СТ_ОбщегоНазначенияСервер.МасштабироватьИзображение(ПутьКФайлу, НовыйПуть, МаксШирина, МаксВысота) Тогда
						КопироватьФайл(ПутьКФайлу, НовыйПуть);
					КонецЕсли;
				Иначе
					КопироватьФайл(ПутьКФайлу, НовыйПуть);			
				КонецЕсли;
				
			КонецЕсли;
								
		Исключение	
			ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не удалось скопировать " + ПутьКФайлу + ": " + ОписаниеОшибки());
			НовыйПуть = Неопределено;
		КонецПопытки;
		
	КонецЕсли;
		
	Возврат НовыйПуть;
	
КонецФункции

&НаСервере
Функция ЭтоСправочник(Значение)
	
	Если Значение = Неопределено Тогда
		Возврат Ложь;
	КонецЕсли;
	
	Если ТипЗнч(Значение) = Тип("ПланВидовХарактеристикСсылка.СвойстваОбъектов") Тогда
		
		ТипыЗначений = Значение.ТипЗначения.Типы();
		Для каждого СтрокаТип из ТипыЗначений цикл
			
			Если Справочники.ТипВсеСсылки().СодержитТип(СтрокаТип) Тогда
				Возврат Истина;
			КонецЕсли;	
			
		КонецЦикла;		
		
	Иначе	
		
		Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(Значение)) Тогда
			Возврат Истина;
		КонецЕсли;
		
	КонецЕсли;	
	
	Возврат Ложь;
	
КонецФункции


Показать
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. uriah 17 31.05.20 11:35 Сейчас в теме
(1)
Также, в свойствах файла, установлено свойство "Чтение" для файла. Руками я не могу даже скопировать файл, и типовая функция как, СкопироватьФайл() выдает ошибку , что недостаточно прав.

Что с правами на папку у пользователя?
7. user1304317 31.05.20 12:22 Сейчас в теме
(4) Обработка запускается права служебного пользователя сервера. У него фулл права, но у файлов всех, стоит свойство только чтение.
5. independ 1520 31.05.20 12:07 Сейчас в теме
(1) приложите excel файл и визуально обрисуйте, что и куда копировать
6. user1304317 31.05.20 12:21 Сейчас в теме
(5) Прикладываю файл.
"Снимок" - это отправитель, "Снимок1" - получатель.
Нужно из скопировать папку с вложенными файлами, как указано в экзеле
Прикрепленные файлы:
Книга1.xlsx
8. independ 1520 31.05.20 12:31 Сейчас в теме
(6) из
\\lux.ltcompany.com\ALL\1CExtenalFiles\Request_to_spend_money_form__BIT с подпапками в \\msk-dev-11\Bit_exchange\?
9. user1304317 31.05.20 12:46 Сейчас в теме
(8) Например Из \\lux.ltcompany.com\ALL\1CExtenalFiles\Request_to_spend_money_form__BIT_\201­70405\000001190_orbis_s.png.png в \\msk-dev-11\Bit_exchange\Шапинский\20170405\000001190_orbis_s.png.png
2. user1304317 31.05.20 11:02 Сейчас в теме
Пробовал через эту функцию, все равно копирует все содержимое каталога, и пихает его в приемник

Функция СкопироватьФайл(ИмяФайлаИсточник, ИмяФайлаНазначение, ВыдаватьСообщения = Ложь) Экспорт
	Попытка
		ПозицияСимвола = СтрДлина(ИмяФайлаНазначение);
		Пока ПозицияСимвола >= 1 Цикл
			Если Сред(ИмяФайлаНазначение, ПозицияСимвола, 1) = "\" Тогда
			Возврат ПозицияСимвола; 
			КонецЕсли;
		ПозицияСимвола = ПозицияСимвола - 1;	
		КонецЦикла;
		КаталогФайла=Сред(ИмяФайлаНазначение, 1, ПозицияСимвола - 1); 
		СоздатьКаталог(КаталогФайла);
		КопироватьФайл(ИмяФайлаИсточник, ИмяФайлаНазначение);
	Исключение
		Сообщение = "Ошибка при копировании: " + ОписаниеОшибки() + 
			" (источник: " + ИмяФайлаИсточник + "; приемник: " + ИмяФайлаНазначение + ")";
		Если ВыдаватьСообщения Тогда 
			Сообщить(Сообщение);
		КонецЕсли;					 
		Предупреждение(Сообщение);
		Возврат Ложь;
	КонецПопытки;
	Возврат Истина;
КонецФункции 
Показать
10. independ 1520 31.05.20 12:58 Сейчас в теме
(2) Можно упростить вместо
      ПозицияСимвола = СтрДлина(ИмяФайлаНазначение);
        Пока ПозицияСимвола >= 1 Цикл
            Если Сред(ИмяФайлаНазначение, ПозицияСимвола, 1) = "\" Тогда
            Возврат ПозицияСимвола; 
            КонецЕсли;
        ПозицияСимвола = ПозицияСимвола - 1;    
        КонецЦикла;
        КаталогФайла=Сред(ИмяФайлаНазначение, 1, ПозицияСимвола - 1);  
Показать


        Файл=Новый Файл(ИмяФайлаНазначение);
        КаталогФайла=Файл.Путь;
11. user1304317 31.05.20 13:06 Сейчас в теме
12. user1304317 31.05.20 13:12 Сейчас в теме
(10) Исправил, но пока без изменений.
13. user1304317 31.05.20 13:37 Сейчас в теме
(10)
Прикрепленные файлы:
14. independ 1520 31.05.20 13:55 Сейчас в теме
(13) Копирование делается где? На сервере? База файловая или клиент-серверная? Если Клиент-сервер, значит нет прав у учетной записи под которой запускается агент 1С
15. user1304317 31.05.20 14:11 Сейчас в теме
16. user1304317 31.05.20 17:15 Сейчас в теме
(14) Есть ли у вас предположения, как можно решить эту задачу? Может быть вы уже сталкивались с подобными задачами?
17. independ 1520 31.05.20 17:23 Сейчас в теме
(16) можно код выполнить на клиенте, если у пользователя есть права на каталоги копирования
18. user1304317 31.05.20 17:28 Сейчас в теме
(17) Прав нет, Если на клиенте. Админы не дадут права мне. Вот поэтому и приходится на сервер. Но УЗ серверной фулл права
19. independ 1520 31.05.20 17:40 Сейчас в теме
(18) понятно, но УЗ агента 1С у это не УЗ сервера,
20. user1304317 31.05.20 17:40 Сейчас в теме
(19) я проверил, все три УЗ серверные
Там фулл права
21. independ 1520 31.05.20 17:44 Сейчас в теме
если вы знаете УЗ и пароль админа, тогда проверьте доступность записи под УЗ в копируемые каталоги
22. user1304317 31.05.20 17:59 Сейчас в теме
(21) Ахахах, для админов, это слишком конфиденциальная инфа
3. AlexandrSmith 69 31.05.20 11:34 Сейчас в теме
Попробуйте изучить объект Scripting.FileSystemObject
http://programna1c.narod.ru/docs/WSH/1C_WSH_FSO.html
Примеры использования объекта FileSystemObject (FSO) в 1С
Объектная модель FSO позволяет работать с файлами и папками: создавать, изменять, перемещать и удалять. Получать доступ к системным папкам: наличие, расположение. Можно получать информацию о дисках, папках и файлах: их имена, атрибуты, даты создания или изменения и т.д. Кроме того, создание и манипулирование текстовыми файлами (не двоичными!).
FSO имеет следующие объекты:

Времени сейчас разбираться в ваших кодах нет, но копирование файла на 100% позволяет Windows через этот объект.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот