В этом примере мы рассмотрим возможность получения файлов с сервера с помощью прямого копирования методом глобального контекста НачатьКопированиеФайла().
Поскольку доступ к FTP-ресурсам будет осуществляться напрямую, а не через FTP-соединение, то полный путь на сервере должен включать помимо каталога на сервере также и имя самого сервера, и имя и пароль пользователя на сервере вида: ftp://<ИмяПользователя>:<ПарольПользователя>@<Сервер>/<КаталогНаСервере>.
Обработчик команды для копирования файлов с FTP-сервера может выглядеть следующим образом (листинг 1.146).
Листинг 1.146. Процедура «КопироватьФайлыССервера»
&НаКлиенте
Процедура КопироватьФайлыССервера(Команда)
ПутьНаСервере = "ftp://" + ИмяПользователя + ":" + ПарольПользователя + "@" + Сервер + КаталогНаСервере;
// Найти файлы в нужном каталоге по указанной маске.
МаскаФайлов = "*.png";
НачатьПоискФайлов(Новый ОписаниеОповещения("КопироватьФайлыССервераЗавершение", ЭтотОбъект),
ПутьНаСервере, МаскаФайлов);
КонецПроцедуры
Как и в предыдущем примере, поиск файлов на FTP-сервере мы будем выполнять с помощью немодального метода НачатьПоискФайлов(). В этот метод первым параметром мы передаем описание оповещения, указывающее на экспортную процедуру КопироватьФайлыССервераЗавершение(), которая будет вызвана по окончании поиска файлов (листинг 1.147). А также мы передаем в эту процедуру полный путь на FTP-сервере для доступа к файлам и маску для поиска файлов.
Листинг 1.147. Процедура «КопироватьФайлыССервераЗавершение»
&НаКлиенте
Процедура КопироватьФайлыССервераЗавершение(МассивФайлов, Дополнительно ) Экспорт
Сообщение = Новый СообщениеПользователю;
Для Каждого Файл Из МассивФайлов Цикл
Сообщение.Текст = "Считывается файл - " + Файл.Имя;
Сообщение.Сообщить();
КопироватьФайлыВЛокальныйКаталог(Новый ОписаниеОповещения("КопироватьФайлыЛокальноЗавершение", ЭтотОбъект), Файл.Имя);
КонецЦикла;
КонецПроцедуры
В этой процедуре мы обходим в цикле массив найденных файлов, содержащихся в параметре МассивФайлов, и для каждого файла вызываем процедуру КопироватьФайлыВЛокальныйКаталог(), в которую передаем описание оповещения, указывающее на экспортную процедуру КопироватьФайлыЛокальноЗавершение(), которая вернет процесс копирования файлов к следующему шагу цикла, а также имя копируемого файла.
Процедуру КопироватьФайлыВЛокальныйКаталог() заполним следующим образом (листинг 1.148).
Листинг 1.148. Процедура «КопироватьФайлыВЛокальныйКаталог»
&НаКлиенте
Процедура КопироватьФайлыВЛокальныйКаталог(Оповещение, ИмяФайла)
Сообщение = Новый СообщениеПользователю;
ПутьНаСервере = "ftp://" + ИмяПользователя + ":" + ПарольПользователя + "@" + Сервер + КаталогНаСервере;
ДопПараметры = Новый Структура("ИмяФайла, Оповещение", ИмяФайла, Оповещение);
Попытка
// Копировать файл в локальный каталог.
НачатьКопированиеФайла(Новый ОписаниеОповещения("КопироватьФайлыЗавершение", ЭтотОбъект, ДопПараметры.Оповещение),
ПутьНаСервере + ДопПараметры.ИмяФайла, ЛокальныйКаталог + ДопПараметры.ИмяФайла);
Исключение
Сообщение.Текст = ОписаниеОшибки();
Сообщение.Сообщить();
Возврат;
КонецПопытки;
КонецПроцедуры
В этой процедуре мы сначала упаковываем в структуру имя файла и имя процедуры оповещения, содержащиеся в параметрах ИмяФайла и Оповещение. Затем вызываем процедуру НачатьКопированиеФайла(), в которую передаем описание оповещения, указывающее на экспортную процедуру КопироватьФайлыЗавершение(), которая будет вызвана по окончании копирования файла (листинг 1.149). А также мы передаем в эту процедуру полный путь на FTP-сервере для доступа к файлу и полный путь на локальном компьютере, по которому будет скопирован FTP-ресурс.
Листинг 1.149. Процедура «КопироватьФайлыЗавершение»
&НаКлиенте
Процедура КопироватьФайлыЗавершение(СкопированныйФайл, ДополнительныеПараметры) Экспорт
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Файл скопирован - " + СкопированныйФайл;
Сообщение.Сообщить();
ВыполнитьОбработкуОповещения(ДополнительныеПараметры);
КонецПроцедуры
В этой процедуре после окончания копирования файла мы вызываем процедуру оповещения КопироватьФайлыЛокальноЗавершение(), имя которой содержится в параметре ДополнительныеПараметры (листинг 1.150).
Листинг 1.150. Процедура «КопироватьФайлыЛокальноЗавершение»
&НаКлиенте
Процедура КопироватьФайлыЛокальноЗавершение(Результат, Дополнительно) Экспорт
Возврат;
КонецПроцедуры
В результате мы вернемся в цикл копирования найденных файлов с FTP-сервера (см. листинг 1.147) в процедуре КопироватьФайлыССервераЗавершение().