Кусок моей реализации обмена по ftp. Сначала получает список файлов на ftp, анализируется, загружали ли его ранее (некоторые ftp не позволяют удалять файлы), а потом загружаются новые файлы и сохраняются в хранилище файлов. Далее файлы обрабатываются (здесь этих процедур уже нет) и при удачной обработке помечаются уже как загруженные. Если файл пришел пустой или неполный (а с ftp такое бывает), то файл помечается как битый и в следующий сеанс обмена снока загружается уже штатно. Как-то так.
Процедура ПолучитьФайлыЗаказовFTP() Экспорт
СоздатьКаталог(КаталогВременныхФайлов()+П_Настройки.ПапкаОбмена);
ИмяЛогаFTP = КаталогВременныхФайлов()+"ftp1cList.log";
ВыполнитьНаFTP("Список файлов",,ИмяЛогаFTP);
СписокФайловНаFTP = СписокФайловДляПолученияFTP(ИмяЛогаFTP);
УдалитьФайлы(ИмяЛогаFTP);
Если СписокФайловНаFTP.Количество() = 0 Тогда
Возврат;
КонецЕсли;
Для Каждого ИмяФайлаНаFTP из СписокФайловНаFTP Цикл //при желании можно добавить индикацию
ВыполнитьНаFTP("Получить файлы",ИмяФайлаНаFTP);
КонецЦикла;
СписокФайлов = НайтиФайлы(КаталогВременныхФайлов()+П_Настройки.ПапкаОбмена,"*.txt");
Для Каждого Файл из СписокФайлов Цикл
ХранилищеФайла = Справочники.ХранилищеДополнительнойИнформации.СоздатьЭлемент();
ХранилищеФайла.Объект = Контрагент;
ХранилищеФайла.ВидДанных = Перечисления.ВидыДополнительнойИнформацииОбъектов.Файл;
ХранилищеФайла.ИмяФайла = Файл.Имя;
ХранилищеФайла.Хранилище = Новый ХранилищеЗначения(Новый ДвоичныеДанные(Файл.ПолноеИмя));
ХранилищеФайла.Наименование = "Заявка - не загружена";
Попытка
ХранилищеФайла.Записать();
ВыполнитьНаFTP("Удалить файл",Файл.Имя);
УдалитьФайлы(КаталогВременныхФайлов()+П_Настройки.ПапкаОбмена+"\" + Файл.Имя);
Исключение
Сообщить("Не удалось записать в базу или удалить с ftp файл заказа "+Файл.Имя,СтатусСообщения.Важное);
КонецПопытки;
КонецЦикла;
КонецПроцедуры
//Файл лога нужен только для получения списка файлов на ftp
//Действие - далее в тексте процедуры видно какие значения может принимать и за что отвечает
//ИмяФайлов - строка, содержащая имя файла (может и несколько, только синтаксис ftp.exe не помню, а на практике лучше получать по одному)
//ФайлЛога - ну тут ясно
//П_Настройки - структура, которая хранится в глобальной переменной и заполняется ранее
Процедура ВыполнитьНаFTP(Действие,ИмяФайлов = "",ФайлЛога = "С:\ftp1c.log")
выбПорт = "";
П_Настройки.Свойство("Порт",выбПорт);
Если Не ЗначениеЗаполнено(выбПорт) Тогда
выбПорт = 21;
КонецЕсли;
выбЛогин = "";
П_Настройки.Свойство("Логин",выбЛогин);
выбПароль = "";
П_Настройки.Свойство("Пароль",выбПароль);
выбСервер = П_Настройки.АдресОбмена;
выбПуть = "";
П_Настройки.Свойство("КаталогОбмена",выбПуть);
BatFile = Новый ТабличныйДокумент();
МакетФайла = ЭтотОбъект.ПолучитьМакет("bat_FTP");
ТекОбласть = МакетФайла.ПолучитьОбласть("ОбластьФайла");
ТекОбласть.Параметры.Адрес = выбСервер+" "+выбПорт;
ТекОбласть.Параметры.Логин = выбЛогин;
ТекОбласть.Параметры.Пароль = выбПароль;
ТекОбласть.Параметры.Каталог = выбПуть;
ТекОбласть.Параметры.ЛокальныйКаталог = Символ(34)+КаталогВременныхФайлов()+П_Настройки.ПапкаОбмена+Символ(34);
Если Действие = "Получить файлы" Тогда
ТекОбласть.Параметры.Действие = "mget "+ИмяФайлов;
ИначеЕсли Действие = "Удалить файл" Тогда
ТекОбласть.Параметры.Действие = "del "+ИмяФайлов; //не всегда дает удалять с ftp
ИначеЕсли Действие = "Список файлов" Тогда
ТекОбласть.Параметры.Действие = "ls . " + Символ(34) + ФайлЛога + Символ(34);
//ТекОбласть.Параметры.ВыводВФайл = " >>"+ФайлЛога;
КонецЕсли;
BatFile.Вывести(ТекОбласть);
ИмяBatФайла = КаталогВременныхФайлов()+"FTP_.bat";
BatFile.Записать(ИмяBatФайла,ТипФайлаТабличногоДокумента.ANSITXT);
WshShell=Новый ComОбъект("WScript.Shell");
КодВозвр=WshShell.Run("cmd /C " + Символ(34)+ ИмяBatФайла + Символ(34),0,-1);
УдалитьФайлы(ИмяBatФайла);
КонецПроцедуры
//Проверим список уже загруженных файлов, чтобы не загружать их снова
//ИмяЛогаFTP - список файлов раннее был получен с помощью батника (в другой процедуре) и помещен в этот файл.
Функция СписокФайловДляПолученияFTP(ИмяЛогаFTP)
Запрос = Новый Запрос();
Запрос.Текст = "ВЫБРАТЬ
| ХранилищеДополнительнойИнформации.Ссылка
|ИЗ
| Справочник.ХранилищеДополнительнойИнформации КАК ХранилищеДополнительнойИнформации
|ГДЕ
| ХранилищеДополнительнойИнформации.Объект = &Контрагент
| И ХранилищеДополнительнойИнформации.ИмяФайла ПОДОБНО &ИмяФайла";
Запрос.УстановитьПараметр("Контрагент",Контрагент);
Лог = Новый ТекстовыйДокумент();
Лог.Прочитать(ИмяЛогаFTP);
ФайлыДляПолучения = Новый Массив();
Для НомерСтроки = 1 по Лог.КоличествоСтрок() Цикл
Строка = Лог.ПолучитьСтроку(НомерСтроки);
ИмяФайла = СтрЗаменить(Строка,"./","");
Запрос.УстановитьПараметр("ИмяФайла",ИмяФайла);
Результат = Запрос.Выполнить().Выбрать();
Если Результат.Следующий() Тогда
Продолжить;
КонецЕсли;
ФайлыДляПолучения.Добавить(Символ(34) + ИмяФайла + Символ(34));
КонецЦикла;
Возврат(ФайлыДляПолучения);
КонецФункции
Макет тоже простой. Каждая строчка в отдельной строке. Надеюсь разберетесь, где параметр, а где шаблон?
@echo off | |
ftp -s:%0 [ФайлЛог] | |
goto done | |
open [Адрес] | |
Логин | |
Пароль | |
cd [Каталог] | |
binary | |
prompt | |
lcd [ЛокальныйКаталог] | |
Действие | |
bye | |
:done |