Задача: закидывать картинки номенклатуры на FTP
Не понимаю методологически, УФ
Необходимо на основании запроса находить список номенклатуры для заброса. Далее забирать картинку, преобразовывать ее имя (артикул, латиницей), закидывать на ФТП, далее делать отметку в доп.реквизите номенклатуры - сохранять путь до картинки и новое имя на FTP.
У меня получается, что из серверной процедуры надо вызвать клиентскую :-((( Помогите, как правильно сделать?
На форме кнопка
&НаКлиенте
Процедура ЗагрузитьПоОтбору(Команда)
Если КаталогДляПолученияФайлов="" Тогда
сообщить("Не выбрана папка для сохранения фоток!");
Возврат;
КонецЕсли;
Если НумерацияПапокФТП=0 Тогда
сообщить("Не выбрана папка ФТП для сохранения фоток!");
Возврат;
КонецЕсли;
Соединение = ПодключитьсяКFTPСерверу();
ПолучитьНоменклатуруДляЗабросаКартинок();
КонецПроцедуры
&НаСервере
Процедура ПолучитьНоменклатуруДляЗабросаКартинок()
Запрос = новый запрос;
Запрос.Текст="ВЫБРАТЬ ПЕРВЫЕ 100
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.Наименование КАК Наименование,
| Номенклатура.ФайлКартинки КАК ФайлКартинки,
| Номенклатура.Артикул КАК Артикул
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.ФайлКартинки <> ЗНАЧЕНИЕ(Справочник.НоменклатураПрисоединенныеФайлы.ПустаяСсылка)";
Рез = запрос.Выполнить();
если не рез.Пустой() тогда
выборка = рез.Выбрать();
Пока выборка.Следующий() цикл
///////////////////////////////////////////////////////////////////
// Здесь логично сохранять картинки на диск и закидывать их на FTP.
// Но вызвать из серверной процедуры клиентскую НЕВОЗМОЖНО
///////////////////////////////////////////////////////////////////
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаСервере
///////////////////////////////////////////////////////////////////
// Здесь логично сохранять картинки на диск и закидывать их на FTP.
// Но вызвать из серверной процедуры клиентскую НЕВОЗМОЖНО
///////////////////////////////////////////////////////////////////
1. Сделайте это функцией. Возвращайте обратно на клиент массив из структур.
2. На клиенте перебираете этот массив и для каждой структуры производите необходимые действия...
И еще совет.
Делайте все последовательно. Нафига вам создавать соединение с ФТП, если у вас еще не получены данные для отправки? Вдруг там и данных-то никаких не будет, и отправлять нечего, а вы уже зачем-то всю инфраструктуру приготовили...
(12)Вам необходимо воспользоваться конфигурационными процедурами/функциями для получения двоичных данных файла, потому что файл может хранится как в самой БД, так и на диске - это зависит от настроек.
Смотрите общий модуль РаботаСФайлами, там все должно быть.
Вам необходимо получить двоичные данные файла, затем сохранить их в файл на диске и уже потом выполнять копирование файлов на FTP.
Если все это дело должно происходить на клиенте, то на сервере вы должны получить массив двоичных данных, передать на клиент этот массив, сохранить уже на клиенте каждые двоичные данные из массива в файл и далее отправлять файлы на фтп.
Для чего вам требуется с сервера вызывать клиентскую процедуру/функцию?
Я так понял, что ФТП только на клиенте есть, а сервак закрыт (обычная ситуация).
Хотя более велика вероятность, что автор просто в примерах увидел реализацию ФТП именно на клиенте, и решил что так и должно быть.
Хотя более велика вероятность, что автор просто в примерах увидел реализацию ФТП именно на клиенте, и решил что так и должно быть.
Точно, примеры &НаКлиенте, поэтому и делаю &НаКлиенте. Пробовала перенести на сервер: открывала соединение на клиенте, в параметре к функции &НаСервере передавала соединение - получала ошибку.
А все полностью на сервере даже не пробовала.
Спасибо, реализую один из вариантов.
///////////////////////////////////////////////////////////////////
// Здесь логично сохранять картинки на диск и закидывать их на FTP.
// Но вызвать из серверной процедуры клиентскую НЕВОЗМОЖНО
///////////////////////////////////////////////////////////////////
1. Сделайте это функцией. Возвращайте обратно на клиент массив из структур.
2. На клиенте перебираете этот массив и для каждой структуры производите необходимые действия...
И еще совет.
Делайте все последовательно. Нафига вам создавать соединение с ФТП, если у вас еще не получены данные для отправки? Вдруг там и данных-то никаких не будет, и отправлять нечего, а вы уже зачем-то всю инфраструктуру приготовили...
Прониклась, что у сервера должен быть доступ к временной папки для сохранения файлов. Переделываю на клиента. Сделала структуру. Теперь ошибка при сохранении файла на диск :-(
(8) С чего вы взяли, что АдресНафигационнойСсылки = ПутьКФайлу? Путь к файлу - это диск, папки, имя и расширение файла.
Вы сами-то посмотрите - можно ли это назвать путем файла 'e1c://filev/E/bases/Trade21 — копия/e1cib/data/Справочник.НоменклатураПрисоединенныеФайлы?ref=9439000c29cf9a3e11e8f163a80e7ba3' ?
Вам нужно получить сам файл из справочника присоединенных файлов - либо в виде реального пути при хранении в томах, либо в виде двоичных данных. И вот уже двоичные данные вы можете сохранять под нужным вам именем во временную папку и отправлять на ФТП (хоть на сервере, хоть на клиенте).
Тип: Строка.
Расположение данных во временном хранилище или в информационной базе.
<ИмяФайла> (необязательный)
Тип: Строка.
Путь к файлу, в который будут сохранены данные из информационной базы, или только имя файла с расширением.
В неинтерактивном режиме необходимо указать значение параметра, иначе будет вызвано исключение.
В интерактивном режиме может быть не задан.
Значение по умолчанию: Пустая строка.
<Интерактивно> (необязательный)
Тип: Булево.
Истина - режим, в котором пользователю показывается диалог, в котором он может выбрать действие с получаемым файлом: запустить его или сохранить по выбранному расположению.
В веб-клиенте параметр должен быть равен Истина. В противном случае будет сгенерировано сообщение об ошибке.
На мобильной платформе параметр игнорируется и диалоговое окно выбора файла не отображается.
Значение по умолчанию: Истина.
(10) И? Теперь вы считаете, что АдресВременногоХранилища = НавигационнаяСсылка?
Вам надо получить файл из справочника ПрисоединенныеФайлы.
Файл.
А не ссылку на элемент справочника с описанием файла.
(11) Адрес = Элт.ФайлКартинки.ПолучитьОбъект();
А дальше? Подскажите, не понимаю.
я должна передать что сохранить и куда. С куда проблем не возникает. Как передать саму картинку? Как получить файл в БД?
Переделываю с обычных форм на управляемые... Раньше все было просто:
Пока рез.следующий Цикл
Картинка = рез.ОсновноеИзображение.Получить();
Если ТипЗнч(Картинка) = Тип("Картинка") Тогда
Картинка.Записать(КаталогДляПолученияФайлов + "\" + рез.Код + ".jpg");
КонецЕсли;
(12)Вам необходимо воспользоваться конфигурационными процедурами/функциями для получения двоичных данных файла, потому что файл может хранится как в самой БД, так и на диске - это зависит от настроек.
Смотрите общий модуль РаботаСФайлами, там все должно быть.
Вам необходимо получить двоичные данные файла, затем сохранить их в файл на диске и уже потом выполнять копирование файлов на FTP.
Если все это дело должно происходить на клиенте, то на сервере вы должны получить массив двоичных данных, передать на клиент этот массив, сохранить уже на клиенте каждые двоичные данные из массива в файл и далее отправлять файлы на фтп.