Заготовка для загрузки файлов по ftp

3 процедуры и 1 макет

Кусок моей реализации обмена по 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

5 Comments

  1. AnryMc

    «+» за анимацию, лично я ещё здесь вроде не видел…

    Внимание привлекает!

    Reply
  2. anig99

    (1) у меня ещё кот (живой) есть на одной обработке.

    Reply
  3. Algiz

    на заметку возьму

    Reply
  4. NAKIS

    Можно юзнуть для обмена данными между филиалами, а то менеджеры и бухи вечно жалуются на почту…

    Reply
  5. NAKIS

    Спасибо, кстати)

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *