Получение файла на сервере и скопировать его в другой том хранения

1. user1304317 19.05.20 09:30 Сейчас в теме
Доброго времени суток! У меня возник, и я был бы признателен вашим советам. Не судите строго мой вопрос.
Ситуация такова:
1) Есть два тома хранения по присоединенным файлам.
2) Нужно из тома хранения скопировать файлы в нужный том хранения
3) Мне предоставили экзельку, в которой указан список файлов и расположение файлов

Что я сделал:
1) Через внешнюю обработку прочитал файл экзельку
2) Создал запрос, с двумя параметрами : по виду ПФ и тому хранения
ВЫБРАТЬ
	БИТ_СТ_ГруппыНоменклатурыВКаталогеПрисоединенныеФайлы.Ссылка КАК Ссылка,
	БИТ_СТ_ГруппыНоменклатурыВКаталогеПрисоединенныеФайлы.ВладелецФайла КАК ВладелецФайла,
	БИТ_СТ_ГруппыНоменклатурыВКаталогеПрисоединенныеФайлы.ПутьКФайлу КАК ПутьКФайлу,
	БИТ_СТ_ГруппыНоменклатурыВКаталогеПрисоединенныеФайлы.Том КАК Том,
	БИТ_СТ_ГруппыНоменклатурыВКаталогеПрисоединенныеФайлы.СТ_ХФ_ВидПрисоединенногоФайла КАК СТ_ХФ_ВидПрисоединенногоФайла,
	БИТ_СТ_ГруппыНоменклатурыВКаталогеПрисоединенныеФайлы.Представление КАК Представление
ИЗ
	Справочник.БИТ_СТ_ГруппыНоменклатурыВКаталогеПрисоединенныеФайлы КАК БИТ_СТ_ГруппыНоменклатурыВКаталогеПрисоединенныеФайлы
ГДЕ
	БИТ_СТ_ГруппыНоменклатурыВКаталогеПрисоединенныеФайлы.СТ_ХФ_ВидПрисоединенногоФайла = &СТ_ХФ_ВидПрисоединенногоФайла
	И БИТ_СТ_ГруппыНоменклатурыВКаталогеПрисоединенныеФайлы.Том = &Том
Показать


В каком направлении мне сейчас нужно идти? Мне больше всего интересует процесс получения и копирования файлов на сервере.
Буду рад вашим советам.
Спасибо!
Прикрепленные файлы:
КудиновФайлы.xlsx
По теме из базы знаний
Ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
36. AlexandrSmith 68 21.05.20 22:46 Сейчас в теме
(1) Ну, я вам хотел бы посоветовать воспользоваться стандартными обработками. Конвертации и выгрузки, загрузки данных. Там везде подробно, добротно сделано копирование данных с одного сервера на другой. Да даже посмотрите устройство синхронизации. Там подробно со всеми обработками ошибок хорошо работает алгоритм, копирования, замещения, сжатия файлов. Ну все как в задачах наших бухгалтеров.
37. AlexandrSmith 68 21.05.20 22:49 Сейчас в теме
(1) Вот статья ИТС, что может быть лучше, чем подробно описанные все глюки 1С при доступе к файловой системе в сети и на локальном компьютере.
https://its.1c.ru/db/v8std#content:542:hdoc
Доступ к файловой системе из кода конфигурации
38. AlexandrSmith 68 21.05.20 22:50 Сейчас в теме
(1)(37)
1. При обращении из кода конфигурации к файлам и каталогам файловой системы следует иметь в виду, что доступ к ним ограничен правами пользователя операционной системы, от имени которого запущено приложение.

1.1. Если доступ к файловой системе осуществляется из кода, выполняемого на клиенте, то он выполняется под правами пользователя, от имени которого запущено приложение (тонкий, толстый или веб-клиент). Как правило, это текущий пользователь операционной системы.

1.2. Если доступ к файловой системе осуществляется из кода, выполняемого на сервере, то:

при использовании клиент-серверной информационной базы, доступ ограничен правами пользователя, от имени которого запущен сервер 1С:Предприятия (*);
при использовании файловой базы, опубликованной на веб-сервере, доступ ограничен правами пользователя, от имени которого запущен веб-сервер.
* Рабочие процессы могут быть также запущены от имени другого пользователя, отличного от того, под которым запускается агент сервера. Подробнее см. руководство администратора клиент-серверного варианта, описание служебного файла swpuser.ini

Область применения (уточнение): управляемое приложение, обычное приложение.

2. Запрещается выполнять запись каких-либо файлов в каталог исполняемых файлов 1С:Предприятия, получаемого с помощью метода КаталогПрограммы. Использование метода КаталогПрограммы допустимо только для чтения или запуска файлов. Например, при работе в ОС Windows, для запуска копии тонкого клиента 1С:Предприятия текущей версии, допустимо использовать:

ЗапуститьПриложение(КаталогПрограммы() + "1cv8s.exe");

3. Даже если не планируется локализация конфигурации на другие языки, следует обеспечивать переносимость файлов, сформированных из кода конфигурации, между различными операционными системами с различными кодировками. Для этого необходимо:

3.1. В именах файлов, автоматически формируемых из кода конфигурации, указывать только английские буквы, а также цифры, а в качестве кодировки текстовых файлов использовать только UTF-8 (именно этот формат предпочтителен, т.к. только с ним корректно работает операционная система macOS).

Это ограничение распространяется на файлы сообщений обмена, выгрузки данных, электронных документов и пр., которые автоматические формируются системой, в том числе на файлы, упакованные в архивы (например, zip). Исключение составляют случаи, когда на формат файлов невозможно повлиять, например, это формат сторонней системы.

3.2. В тех случаях, когда имя файла не генерируется системой, а его явно вводит пользователь, разрешить ввод русскоязычных имен, но при этом дать возможность транслитерировать его в англоязычное имя. По умолчанию, если это технически возможно и не снижает удобство работы, рекомендуется предлагать англоязычное имя файла, а для текстовых файлов – сохранение в кодировке UTF-8.

Также эти рекомендации по выбору имени и кодировки файла следует разместить в справке к тем местам программы, где пользователь имеет возможность сохранять файлы и выбирать кодировку.

В конфигурациях на базе Библиотеки стандартных подсистем для транслитерации имен файлов рекомендуется использовать функцию СтроковыеФункцииКлиентСервер.СтрокаЛатиницей.
Показать
user1304317; +1 Ответить
41. user1304317 22.05.20 08:52 Сейчас в теме
42. AlexandrSmith 68 22.05.20 09:10 Сейчас в теме
(41) Я очень надеюсь, что мои ответы были лучшими.
user1304317; +1 Ответить
43. user1304317 22.05.20 09:22 Сейчас в теме
(42) Ответы были очень интересными. Если вам интересно, я могу вложить обработку и вы можете увидеть, что я сделал.
Прикрепленные файлы:
ExternalFiles.epf
2. Serega-artem 16 19.05.20 10:46 Сейчас в теме
Если правильно понимаю вопрос, надо:

1. Через КопироватьФайл(Откуда,Куда) физически перенести сами файлы. Либо же сделать это другими средствами, не через 1с. Что в принципе будет, наверное, проще.
2. В справочнике заменить пути файлов на правильные.
user1304317; +1 Ответить
3. user1304317 19.05.20 10:48 Сейчас в теме
(2) Что касается второго пункта, то пути файлов верные. Просто ЦОД неправильно загрузил файлы. Вот теперь эти файлы нужно перенести.
А по поводу 1го пункта, то могли бы Вы пояснить?
4. Serega-artem 16 19.05.20 11:19 Сейчас в теме
Давайте разберемся. У вас в справочнике пути файлов верные, но по факту они лежат не там где надо. В таблице у вас фактические пути. Вам надо перенести файлы от туда, где они сейчас, туда где они должны быть (по путям справочника). Всё верно? Если всё происходит на оном физ. сервере (и 1с запущена и файлы лежат) то циклом идете по списку файлов и выполняете:

КопироватьФайл(ПутьИзТаблицы,ПутьИзФайла)


Если я что-то не правильно пониманию, рассказывайте, уточняйте - будем разбираться!
user1304317; +1 Ответить
5. user1304317 19.05.20 11:22 Сейчас в теме
(4) Да, все верно, просто как видите во вложенном файле таблицы, ссылки на расположения тома странные, например :
\\lux.ltcompany.com\ALL\1CExtenalFiles\Request_to_spend_money_form__BIT_/201­70412/000000396_albatros ntk 20.png.png",
Двойное расширение имени файла.
Это никак не повлияет?
9. Serega-artem 16 19.05.20 12:09 Сейчас в теме
(5) Не сразу заметил это сообщение, но в принципе внизу написал о том же. У Вас есть физическая возможность зайти в каталог с файлами и посмотреть какое реальное имя файла? т.е. оно действительно 000000396_albatros ntk 20.png.png или же 000000396_albatros ntk 20.png ?
10. user1304317 19.05.20 12:42 Сейчас в теме
(9) Да, физически могу зайти.
11. Serega-artem 16 19.05.20 12:58 Сейчас в теме
(10) Ну вот, давайте проверим что в реальности у нас там с именами.
12. user1304317 19.05.20 13:14 Сейчас в теме
(11) Проверил, его там нет. Теперь нужно как-то добавить проверку
6. user1304317 19.05.20 11:35 Сейчас в теме
(4) Вот так?

&НаСервере
Процедура ВыполнитьКопированиеФайловНаСервере()
	Для Каждого Стр Из СписокФайлов Цикл
		КопироватьФайл(Стр.РасположениеФайла, Стр.НовыйПутьХранения);	
	КонецЦикла;
КонецПроцедуры

Показать
7. user1304317 19.05.20 11:38 Сейчас в теме
(6) Ошибка доступа к файлу
Прикрепленные файлы:
8. Serega-artem 16 19.05.20 11:51 Сейчас в теме
(7)Судя по скриншоту, у вас какие-то ошибки в путях/именах. В исходном пути расширение два раза указано, а в конечном вообще не указано имя файла и расширение.
13. user1304317 19.05.20 13:56 Сейчас в теме
(8) Что необходимо сделать?
14. user1304317 19.05.20 14:04 Сейчас в теме
(8)Я добавил проверку на существование файла.
15. Serega-artem 16 19.05.20 15:52 Сейчас в теме
(14) Нет конкретного файла, или вообще нет там файлов? Ну проверка на существование это правильно. Если файл есть, перемещаем, если нет, то нет.
16. user1304317 19.05.20 15:58 Сейчас в теме
(15) Теперь ошибка с правами на уровне сервера.
17. Serega-artem 16 19.05.20 16:00 Сейчас в теме
(16) Ну соответственно проверять, что у пользователя, под которым запускается 1с (в случае сервера - под которым запускается агент сервера) есть права на работу с файлами в этих директориях.
18. user1304317 19.05.20 16:35 Сейчас в теме
19. Serega-artem 16 19.05.20 20:04 Сейчас в теме
(18) Какая конкретно ошибка?
20. user1304317 20.05.20 09:46 Сейчас в теме
(19) Пользователь видит решение данной темы иначе :
1) Если у файла нет владельца, то тогда скидывать файл в архивную папку
2) Если у файла есть владелец, то тогда скопировать его в ту папку нужную, и поменять том хранения
21. Serega-artem 16 20.05.20 09:50 Сейчас в теме
(20) Под владельцем имеется ввиду владелец в 1с или в файловой системе?
22. user1304317 20.05.20 10:01 Сейчас в теме
(21) В 1С-ке. Вот думаю, как это все сделать правильно.
23. Serega-artem 16 20.05.20 10:41 Сейчас в теме
(22) А в чем конкретно проблема то? Идем по списку файлов, проверяем на владельца, если есть - копируем в путь из таблицы, если нет, копируем в путь архива. А лучше более простой вариант - два запроса. Первым получаем всех без владельца и копируем в архив, вторым с владельцем и копируем по нужному пути.
24. user1304317 20.05.20 11:31 Сейчас в теме
(23) А как из строки \\lux.ltcompany.com\ALL\1CExtenalFiles\Request_to_spend_money_form__BIT_\201­81226\GLOSS LED8.png

получить "GLOSS LED8"
25. Serega-artem 16 20.05.20 11:50 Сейчас в теме
Можно вот так:

Функция ИмяФайлаИзСтроки(Стр)  
	МСтр = СтрЗаменить(Стр,"\",Символы.ПС); 
	НомерСТроки =СтрЧиСлоСТрок(МСтр);
	Возврат СтрПолучитьСтроку(МСтр,НомерСТроки); 
КонецФункции 



А можно так

Файл = Новый Файл(ПолныйПутьКИмениФайла); 
Файл.Имя //  GLOSS LED8.png
Файл.ИмяБезРасширения //GLOSS LED8 
user1304317; +1 Ответить
26. Serega-artem 16 20.05.20 12:09 Сейчас в теме
Немного дополню предыдущий ответ. Первый метод - это чисто работа со строкой, он более универсальный, но в теории менее точный. Второй более правильный, но он не сработает если файл НЕ существует по данному пути.
user1304317; +1 Ответить
27. user1304317 20.05.20 13:00 Сейчас в теме
(26) Спасибо!

Вот добавил функцию:
&НаСервере
Функция НаличиеВладельцаФайла(СсылкаФайл)
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	БИТ_СТ_ГруппыНоменклатурыВКаталогеПрисоединенныеФайлы.ВладелецФайла КАК ВладелецФайла,
		|	БИТ_СТ_ГруппыНоменклатурыВКаталогеПрисоединенныеФайлы.Ссылка
		|ИЗ
		|	Справочник.БИТ_СТ_ГруппыНоменклатурыВКаталогеПрисоединенныеФайлы КАК БИТ_СТ_ГруппыНоменклатурыВКаталогеПрисоединенныеФайлы
		|ГДЕ
		|	БИТ_СТ_ГруппыНоменклатурыВКаталогеПрисоединенныеФайлы.СТ_ХФ_ВидПрисоединенногоФайла В (&СТ_ХФ_ВидПрисоединенногоФайла)
		|	И БИТ_СТ_ГруппыНоменклатурыВКаталогеПрисоединенныеФайлы.Том = &Том
		|	И БИТ_СТ_ГруппыНоменклатурыВКаталогеПрисоединенныеФайлы.Ссылка = &СсылкаФайл";
	
	МассивВидыПФ = Новый Массив;
	МассивВидыПФ.Добавить(Справочники.СТ_ХФ_ВидыПрисоединенныхФайлов.ГруппыНоменклатурыВКаталоге_Изображение);
	МассивВидыПФ.Добавить(Справочники.СТ_ХФ_ВидыПрисоединенныхФайлов.ГруппыНоменклатурыВКаталоге_ИнструкцияПоМонтажу);
	МассивВидыПФ.Добавить(Справочники.СТ_ХФ_ВидыПрисоединенныхФайлов.ГруппыНоменклатурыВКаталоге_Чертеж);
	
	Запрос.УстановитьПараметр("СсылкаФайл", СсылкаФайл);
	Запрос.УстановитьПараметр("СТ_ХФ_ВидПрисоединенногоФайла", МассивВидыПФ);
	Запрос.УстановитьПараметр("Том", Справочники.ТомаХраненияФайлов.НайтиПоКоду("000000002"));
	
	РезультатЗапроса = Запрос.Выполнить();
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		Возврат ВыборкаДетальныеЗаписи.ВладелецФайла;
	КонецЦикла;
КонецФункции
Показать
28. Serega-artem 16 20.05.20 13:26 Сейчас в теме
(27) Не вижу всей картины, но так думаю, что у вас запрос будет в цикле? Что-то вроде:

Пока ТекФайл из Файлы цикл 
ВашаФункция(ТекФайл); 
КонецЦикла; 


Если это так - это не очень гуд, в плане производительности. Я бы пошел по другому. Подготовил бы массив ссылок на файлы и сделал бы

И БИТ_СТ_ГруппыНоменклатурыВКаталогеПрисоединенныеФайлы.Ссылка = В (&СсылкаФайл)


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

Но повторюсь, я всей картины не вижу, могу только предполагать.
29. user1304317 20.05.20 14:04 Сейчас в теме
(28) Мне нужно из списка выбрать файлы с владельцами по виду и поменять в карточке ПФ новый путь и том
30. Serega-artem 16 20.05.20 16:14 Сейчас в теме
(29) В принципе, ваша функция вполне рабочая. Тем более выполнять то один раз. Если всё получается - оставляйте как есть.
31. user1304317 20.05.20 16:41 Сейчас в теме
(30) Архитекторы сказали, что я верно ищу владельца. Оказывается нужно искать по пути файла. А точнее если берем
\\lux.ltcompany.com\ALL\1CExtenalFiles\Request_to_spend_money_form__BIT_\201­­81226\GLOSS LED8.png, то искать по 201­81226\GLOSS LED8.png.
32. user1304317 21.05.20 09:59 Сейчас в теме
(30) Добрый день! Я кое-что сделал. Не против обсудить?
33. Serega-artem 16 21.05.20 10:15 Сейчас в теме
(32) Добрый, пишите, конечно!
34. user1304317 21.05.20 12:13 Сейчас в теме
(33) Вот что я сделал, все работает, кроме копирования:

&НаСервере
Процедура ПроверкаКодаНаСервере()
	УстановитьПривилегированныйРежим(Истина);
	Для Каждого Стр ИЗ СписокФайлов Цикл
		ПутьКФайлу 		= ИмяФайлаИзСтроки(Стр.РасположениеФайла);
		НовыйПутьКФайлу = Стр.НовыйПутьХранения; 
		Попытка
			НаличиеВладельцаФайла(ПутьКФайлу, НовыйПутьКФайлу);
			КопироватьФайл(Стр.РасположениеФайла, НовыйПутьКФайлу);
		Исключение
			Сообщить(ОписаниеОшибки());
		КонецПопытки;
	КонецЦикла;
КонецПроцедуры

#КонецОбласти

#Область РаботаСФайлами

&НаСервере
Функция НаличиеВладельцаФайла(ПутьКФайлу, НовыйПутьКФайлу)
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	БИТ_СТ_ГруппыНоменклатурыВКаталогеПрисоединенныеФайлы.ВладелецФайла КАК ВладелецФайла,
		|	БИТ_СТ_ГруппыНоменклатурыВКаталогеПрисоединенныеФайлы.Ссылка
		|ИЗ
		|	Справочник.БИТ_СТ_ГруппыНоменклатурыВКаталогеПрисоединенныеФайлы КАК БИТ_СТ_ГруппыНоменклатурыВКаталогеПрисоединенныеФайлы
		|ГДЕ
		|	БИТ_СТ_ГруппыНоменклатурыВКаталогеПрисоединенныеФайлы.СТ_ХФ_ВидПрисоединенногоФайла В(&СТ_ХФ_ВидПрисоединенногоФайла)
		|	И БИТ_СТ_ГруппыНоменклатурыВКаталогеПрисоединенныеФайлы.Том = &Том
		|	И БИТ_СТ_ГруппыНоменклатурыВКаталогеПрисоединенныеФайлы.ПутьКФайлу ПОДОБНО &ПутьКФайлу";
	
	МассивВидыПФ = Новый Массив;
	МассивВидыПФ.Добавить(Справочники.СТ_ХФ_ВидыПрисоединенныхФайлов.ГруппыНоменклатурыВКаталоге_Изображение);
	МассивВидыПФ.Добавить(Справочники.СТ_ХФ_ВидыПрисоединенныхФайлов.ГруппыНоменклатурыВКаталоге_ИнструкцияПоМонтажу);
	МассивВидыПФ.Добавить(Справочники.СТ_ХФ_ВидыПрисоединенныхФайлов.ГруппыНоменклатурыВКаталоге_Чертеж);
	
	Запрос.УстановитьПараметр("ПутьКФайлу", ПутьКФайлу);
	Запрос.УстановитьПараметр("СТ_ХФ_ВидПрисоединенногоФайла", МассивВидыПФ);
	Запрос.УстановитьПараметр("Том", Справочники.ТомаХраненияФайлов.НайтиПоКоду("000000002"));
	
	РезультатЗапроса = Запрос.Выполнить();
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		Элемент = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
		Элемент.Том = ПолучитьТомХраненияФайлов(НовыйПутьКФайлу);
		Элемент.Записать();
	КонецЦикла;
КонецФункции

&НаСервере
Функция ПолучитьТомХраненияФайлов(ПолныйПутьWindows)
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ТомаХраненияФайлов.Ссылка
		|ИЗ
		|	Справочник.ТомаХраненияФайлов КАК ТомаХраненияФайлов
		|ГДЕ
		|	ТомаХраненияФайлов.ПолныйПутьWindows ПОДОБНО &ПолныйПутьWindows";
	
	Запрос.УстановитьПараметр("ПолныйПутьWindows", ПолныйПутьWindows);
	РезультатЗапроса = Запрос.Выполнить();
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		Возврат ВыборкаДетальныеЗаписи.Ссылка;
	КонецЦикла;
		
КонецФункции

Показать
35. Serega-artem 16 21.05.20 16:32 Сейчас в теме
(34) Какую ошибку выдает при копировании?
39. AlexandrSmith 68 21.05.20 22:52 Сейчас в теме
https://its.1c.ru/db/metod8dev/content/2523/hdoc
Как скопировать файл?
Для копирования, перемещения, удаления и прочих действий с файлами, существуют процедуры и функции работы с файлами глобального контекста. В частности, копирование файла может быть выполнено функцией КопироватьФайл():

Копировать в буфер обмена
КопироватьФайл("C:/Test.txt","C:/CopyOfTest.txt");

Эта функция копирует файл-источник в файл-приемник. Допускается перезапись файла-приемника. Файл-приемник при создании будет иметь права доступа, аналогичные назначаемым при создании новых файлов (т.е. права доступа к файлу-источнику не копируются). Допускается использование схем http, https и ftp для адресации файлов. При использовании этих схем в адресах необходимо указывать прямые слеши '/', а не обратные '\'.

Встроенный язык содержит также и другие средства для работы с файлами: объекты Файл и ДиалогВыбораФайла. Объект Файл позволяет читать и устанавливать некоторые параметры существующих файлов, а объект ДиалогВыбораФайла предоставляет средства доступа к специальному диалогу, в котором пользователь выполняет интерактивный выбор каталога, файлов для открытия, или файла для сохранения.
40. AlexandrSmith 68 21.05.20 22:54 Сейчас в теме
Вот ссылка на нашем инфостарте
Как в 1С 8.x скопировать файл с клиента на сервер в два клика?
В статье рассмотрен удобный и элегантный способ переноса файлов с клиентского дискового пространства на сервер, где установлено 1С: Предприятие
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)