Помогите с последовательностью действий в УФ при копировании картинок на FTP

1. jimli 6 16.10.20 11:54 Сейчас в теме
Задача: закидывать картинки номенклатуры на FTP
Не понимаю методологически, УФ
Необходимо на основании запроса находить список номенклатуры для заброса. Далее забирать картинку, преобразовывать ее имя (артикул, латиницей), закидывать на ФТП, далее делать отметку в доп.реквизите номенклатуры - сохранять путь до картинки и новое имя на FTP.
У меня получается, что из серверной процедуры надо вызвать клиентскую :-((( Помогите, как правильно сделать?
На форме кнопка

&НаКлиенте
Процедура ЗагрузитьПоОтбору(Команда)
	Если КаталогДляПолученияФайлов="" Тогда		
	    сообщить("Не выбрана папка для сохранения фоток!");
		Возврат;
	КонецЕсли;
	Если НумерацияПапокФТП=0 Тогда
	    сообщить("Не выбрана папка ФТП для сохранения фоток!");
		Возврат;
	КонецЕсли;
	
    Соединение = ПодключитьсяКFTPСерверу();
		
	ПолучитьНоменклатуруДляЗабросаКартинок();

КонецПроцедуры

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


Всю работу по FTP взяла из этих примеров
По теме из базы знаний
Найденные решения
2. FatPanzer 16.10.20 11:59 Сейчас в теме
////////////////////////////////////////////////////////////­///////
// Здесь логично сохранять картинки на диск и закидывать их на FTP.
// Но вызвать из серверной процедуры клиентскую НЕВОЗМОЖНО
////////////////////////////////////////////////////////////­­///////

1. Сделайте это функцией. Возвращайте обратно на клиент массив из структур.
2. На клиенте перебираете этот массив и для каждой структуры производите необходимые действия...

И еще совет.
Делайте все последовательно. Нафига вам создавать соединение с ФТП, если у вас еще не получены данные для отправки? Вдруг там и данных-то никаких не будет, и отправлять нечего, а вы уже зачем-то всю инфраструктуру приготовили...
14. nomad_irk 72 16.10.20 13:31 Сейчас в теме
(12)Вам необходимо воспользоваться конфигурационными процедурами/функциями для получения двоичных данных файла, потому что файл может хранится как в самой БД, так и на диске - это зависит от настроек.

Смотрите общий модуль РаботаСФайлами, там все должно быть.

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

Если все это дело должно происходить на клиенте, то на сервере вы должны получить массив двоичных данных, передать на клиент этот массив, сохранить уже на клиенте каждые двоичные данные из массива в файл и далее отправлять файлы на фтп.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. nomad_irk 72 16.10.20 12:08 Сейчас в теме
(1)Для чего вам требуется с сервера вызывать клиентскую процедуру/функцию?

Сохраняйте в файл на сервере, передавайте на FTP так же на сервере.
5. FatPanzer 16.10.20 12:14 Сейчас в теме
(3)
Для чего вам требуется с сервера вызывать клиентскую процедуру/функцию?
Я так понял, что ФТП только на клиенте есть, а сервак закрыт (обычная ситуация).
Хотя более велика вероятность, что автор просто в примерах увидел реализацию ФТП именно на клиенте, и решил что так и должно быть.
6. jimli 6 16.10.20 12:24 Сейчас в теме
(5)
Хотя более велика вероятность, что автор просто в примерах увидел реализацию ФТП именно на клиенте, и решил что так и должно быть.

Точно, примеры &НаКлиенте, поэтому и делаю &НаКлиенте. Пробовала перенести на сервер: открывала соединение на клиенте, в параметре к функции &НаСервере передавала соединение - получала ошибку.
А все полностью на сервере даже не пробовала.
Спасибо, реализую один из вариантов.
7. FatPanzer 16.10.20 12:26 Сейчас в теме
(6)
в параметре к функции &НаСервере передавала соединение - получала ошибку.
Естественно. Вы не можете интернет-соединение со своего компьютера передать на сервер. У него свой интернет.
2. FatPanzer 16.10.20 11:59 Сейчас в теме
////////////////////////////////////////////////////////////­///////
// Здесь логично сохранять картинки на диск и закидывать их на FTP.
// Но вызвать из серверной процедуры клиентскую НЕВОЗМОЖНО
////////////////////////////////////////////////////////////­­///////

1. Сделайте это функцией. Возвращайте обратно на клиент массив из структур.
2. На клиенте перебираете этот массив и для каждой структуры производите необходимые действия...

И еще совет.
Делайте все последовательно. Нафига вам создавать соединение с ФТП, если у вас еще не получены данные для отправки? Вдруг там и данных-то никаких не будет, и отправлять нечего, а вы уже зачем-то всю инфраструктуру приготовили...
4. FatPanzer 16.10.20 12:12 Сейчас в теме
(2) Хотя, если на сервере есть нормальный доступ в интернет - то можно сделать и на сервере...
8. jimli 6 16.10.20 12:56 Сейчас в теме
Прониклась, что у сервера должен быть доступ к временной папки для сохранения файлов. Переделываю на клиента. Сделала структуру. Теперь ошибка при сохранении файла на диск :-(

Адрес = ПолучитьНавигационнуюСсылку(Элт.ФайлКартинки);		//,"ФайлКартинки");
ПолучитьФайл(Адрес, КаталогДляПолученияФайлов + "\" + Элт.Артикул + "." + Элт.ФайлКартинки.Расширение, Ложь);


{ВнешняяОбработка.ФотоНоменклатурыНаFTP_УФ.Форма.Форма.Форма(70)}: Ошибка при вызове метода контекста (ПолучитьФайл)
ПолучитьФайл(Адрес, КаталогДляПолученияФайлов + "\" + Элт.Артикул + "." + Элт.ФайлКартинки.Расширение, Истина);
по причине:
Неправильный путь к файлу 'e1c://filev/E/bases/Trade21 — копия/e1cib/data/Справочник.НоменклатураПрисоединенныеФайлы?ref=9439000c29cf9a3e11e8f163a80e7ba3'


Кстати, возможно ли сохранять файлы сразу на фтп? Я пытаюсь сохранить на локальный диск и затем передать на фтп, затем удаляю с лок.диска
9. FatPanzer 16.10.20 13:04 Сейчас в теме
(8) С чего вы взяли, что АдресНафигационнойСсылки = ПутьКФайлу? Путь к файлу - это диск, папки, имя и расширение файла.
Вы сами-то посмотрите - можно ли это назвать путем файла 'e1c://filev/E/bases/Trade21 — копия/e1cib/data/Справочник.НоменклатураПрисоединенныеФайлы?ref=9439000c29cf9a3e11e8f163a80e7ba3' ?

Вам нужно получить сам файл из справочника присоединенных файлов - либо в виде реального пути при хранении в томах, либо в виде двоичных данных. И вот уже двоичные данные вы можете сохранять под нужным вам именем во временную папку и отправлять на ФТП (хоть на сервере, хоть на клиенте).
10. jimli 6 16.10.20 13:06 Сейчас в теме
(9)
(8) С чего вы взяли, что АдресНафигационнойСсылки = ПутьКФайлу? Путь к файлу - это диск, папки, имя и расширение файла.


ПолучитьФайл(<Адрес>, <ИмяФайла>, <Интерактивно>)
Параметры:

<Адрес> (обязательный)

Тип: Строка.
Расположение данных во временном хранилище или в информационной базе.

<ИмяФайла> (необязательный)

Тип: Строка.
Путь к файлу, в который будут сохранены данные из информационной базы, или только имя файла с расширением.
В неинтерактивном режиме необходимо указать значение параметра, иначе будет вызвано исключение.
В интерактивном режиме может быть не задан.
Значение по умолчанию: Пустая строка.
<Интерактивно> (необязательный)

Тип: Булево.
Истина - режим, в котором пользователю показывается диалог, в котором он может выбрать действие с получаемым файлом: запустить его или сохранить по выбранному расположению.
В веб-клиенте параметр должен быть равен Истина. В противном случае будет сгенерировано сообщение об ошибке.
На мобильной платформе параметр игнорируется и диалоговое окно выбора файла не отображается.
Значение по умолчанию: Истина.
11. FatPanzer 16.10.20 13:15 Сейчас в теме
(10) И? Теперь вы считаете, что АдресВременногоХранилища = НавигационнаяСсылка?
Вам надо получить файл из справочника ПрисоединенныеФайлы.
Файл.
А не ссылку на элемент справочника с описанием файла.

А ПолучитьФайл - это вообще не из этой оперы.
12. jimli 6 16.10.20 13:23 Сейчас в теме
(11) Адрес = Элт.ФайлКартинки.ПолучитьОбъект();
А дальше? Подскажите, не понимаю.
я должна передать что сохранить и куда. С куда проблем не возникает. Как передать саму картинку? Как получить файл в БД?
Переделываю с обычных форм на управляемые... Раньше все было просто:
	Пока рез.следующий Цикл
		Картинка = рез.ОсновноеИзображение.Получить();
		Если ТипЗнч(Картинка) = Тип("Картинка") Тогда
		  Картинка.Записать(КаталогДляПолученияФайлов + "\" + рез.Код + ".jpg");
		КонецЕсли;

13. FatPanzer 16.10.20 13:27 Сейчас в теме
(12) РаботаСФайлами.ДвоичныеДанныеФайла()
14. nomad_irk 72 16.10.20 13:31 Сейчас в теме
(12)Вам необходимо воспользоваться конфигурационными процедурами/функциями для получения двоичных данных файла, потому что файл может хранится как в самой БД, так и на диске - это зависит от настроек.

Смотрите общий модуль РаботаСФайлами, там все должно быть.

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

Если все это дело должно происходить на клиенте, то на сервере вы должны получить массив двоичных данных, передать на клиент этот массив, сохранить уже на клиенте каждые двоичные данные из массива в файл и далее отправлять файлы на фтп.
Оставьте свое сообщение

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