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

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

    Соединение = ПодключитьсяКFTPСерверу();

    ПолучитьНоменклатуруДляЗабросаКартинок();

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

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

Всю работу по FTP взяла из этих примеров
---
////////////////////////////////////////////////////////////­///////
// Здесь логично сохранять картинки на диск и закидывать их на FTP.
// Но вызвать из серверной процедуры клиентскую НЕВОЗМОЖНО
////////////////////////////////////////////////////////////­­///////
1. Сделайте это функцией. Возвращайте обратно на клиент массив из структур.
2. На клиенте перебираете этот массив и для каждой структуры производите необходимые действия...

И еще совет.
Делайте все последовательно. Нафига вам создавать соединение с ФТП, если у вас еще не получены данные для отправки? Вдруг там и данных-то никаких не будет, и отправлять нечего, а вы уже зачем-то всю инфраструктуру приготовили...
---
Вам необходимо воспользоваться конфигурационными процедурами/функциями для получения двоичных данных файла, потому что файл может хранится как в самой БД, так и на диске - это зависит от настроек.

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

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

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

Сохраняйте в файл на сервере, передавайте на FTP так же на сервере.
---
Для чего вам требуется с сервера вызывать клиентскую процедуру/функцию? Я так понял, что ФТП только на клиенте есть, а сервак закрыт (обычная ситуация).
Хотя более велика вероятность, что автор просто в примерах увидел реализацию ФТП именно на клиенте, и решил что так и должно быть.
---
Хотя более велика вероятность, что автор просто в примерах увидел реализацию ФТП именно на клиенте, и решил что так и должно быть.

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

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

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

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

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

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

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

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

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

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

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

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

А ПолучитьФайл - это вообще не из этой оперы.
---
Адрес = Элт.ФайлКартинки.ПолучитьОбъект();
А дальше? Подскажите, не понимаю.
я должна передать что сохранить и куда. С куда проблем не возникает. Как передать саму картинку? Как получить файл в БД?
Переделываю с обычных форм на управляемые... Раньше все было просто:

```1c
    Пока рез.следующий Цикл
    Картинка = рез.ОсновноеИзображение.Получить();
    Если ТипЗнч(Картинка) = Тип("Картинка") Тогда
    Картинка.Записать(КаталогДляПолученияФайлов + "\" + рез.Код + ".jpg");
    КонецЕсли;
```
---
РаботаСФайлами.ДвоичныеДанныеФайла()
---
Вам необходимо воспользоваться конфигурационными процедурами/функциями для получения двоичных данных файла, потому что файл может хранится как в самой БД, так и на диске - это зависит от настроек.

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

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

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