Кусок моей реализации обмена по 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 |
«+» за анимацию, лично я ещё здесь вроде не видел…
Внимание привлекает!
(1) у меня ещё кот (живой) есть на одной обработке.
на заметку возьму
Можно юзнуть для обмена данными между филиалами, а то менеджеры и бухи вечно жалуются на почту…
Спасибо, кстати)