// Пробуем подключиться Попытка Соединение = Новый FTPСоединение(FTPСервер,FTPПорт,FTPПользователь,FTPПароль, ,Ложь); Массив = Соединение.НайтиФайлы(FTPКаталогЗагрузки, "*.csv"); Если Не Массив.Количество() = 0 Тогда Для Каждого Стр Из Массив Цикл //Проверяем, есть ли файл в каталоге, если нет - то грузим КаталогНаДиске = Новый Файл(КаталогЗагрузкиДанных+"\"+Стр.Имя); Если НЕ КаталогНаДиске.Существует() Тогда ИмяФайла = КаталогЗагрузкиДанных+"\"+Стр.Имя; Соединение.Получить(Стр.ПолноеИмя, ИмяФайла); КонецЕсли; КонецЦикла; Иначе Сообщить("Нет файлов!"); КонецЕсли; Исключение Сообщить("Ошибка подключения FTP!!!"); КонецПопытки;
Функция ВыгрузитьФайлыИПапкиНаFTP_Рекурсивно(Соединение, НачальныйКаталогВыгрузкиFTP, НачальнаяПапкаВыгрузкиКомп, ТекущаяПапка=Неопределено) Рез = Истина; Если ТекущаяПапка = Неопределено Тогда ТекущаяПапка = НачальнаяПапкаВыгрузкиКомп КонецЕсли; МассивФайлов = НайтиФайлы(ТекущаяПапка, "*"); ТекКаталог = СтрЗаменить(НачальныйКаталогВыгрузкиFTP + СтрЗаменить(СтрЗаменить(ТекущаяПапка, НачальнаяПапкаВыгрузкиКомп, ""), "\", "/"), "//", "/"); Если Прав(ТекКаталог, 1) <> "/" Тогда ТекКаталог = ТекКаталог + "/"; КонецЕсли; Для Каждого НайденныйФайл Из МассивФайлов Цикл Файл = Новый Файл(НайденныйФайл.ПолноеИмя); Если Файл.ЭтоКаталог() Тогда ЕстьТакаяПапка = Соединение.НайтиФайлы(НачальныйКаталогВыгрузкиFTP + СтрЗаменить(СтрЗаменить(НайденныйФайл.Путь, НачальнаяПапкаВыгрузкиКомп + "\", ""), "\", "/"), НайденныйФайл.Имя).Количество() > 0; Если не ЕстьТакаяПапка Тогда НомерПопытки = 1; Успешно = Ложь; Пока НомерПопытки < 4 и не Успешно Цикл Попытка Соединение.УстановитьТекущийКаталог(ТекКаталог); Успешно = Истина; Исключение Сообщить("Попытка №" + НомерПопытки + ", установка каталога " + ТекКаталог + " - " + ОписаниеОшибки()); НомерПопытки = НомерПопытки + 1; КонецПопытки; КонецЦикла; Если Не Успешно Тогда Возврат Ложь; КонецЕсли; НомерПопытки = 1; Успешно = Ложь; Пока НомерПопытки < 4 и не Успешно Цикл Попытка Соединение.СоздатьКаталог(НайденныйФайл.Имя); Успешно = Истина; Исключение Сообщить("Попытка №" + НомерПопытки + ", каталог " + НайденныйФайл.Имя + " - " + ОписаниеОшибки()); НомерПопытки = НомерПопытки + 1; КонецПопытки; КонецЦикла; Если Не Успешно Тогда Возврат Ложь; КонецЕсли; КонецЕсли; НомерПопытки = 1; Успешно = Ложь; Пока НомерПопытки < 4 и не Успешно Цикл Попытка Соединение.УстановитьТекущийКаталог(НачальныйКаталогВыгрузкиFTP + СтрЗаменить(СтрЗаменить(НайденныйФайл.ПолноеИмя, НачальнаяПапкаВыгрузкиКомп + "\", ""), "\", "/") + "/"); Успешно = Истина; Исключение Сообщить("Попытка №" + НомерПопытки + ", установка каталога " + ТекКаталог + " - " + ОписаниеОшибки()); НомерПопытки = НомерПопытки + 1; КонецПопытки; КонецЦикла; Если Не Успешно Тогда Возврат Ложь; КонецЕсли; ВыгрузитьФайлыИПапкиНаFTP_Рекурсивно(Соединение, НачальныйКаталогВыгрузкиFTP, НачальнаяПапкаВыгрузкиКомп, НайденныйФайл.ПолноеИмя); Если не Рез Тогда Возврат Ложь; КонецЕсли; Иначе НомерПопытки = 1; Успешно = Ложь; Пока НомерПопытки < 4 и не Успешно Цикл Попытка Соединение.УстановитьТекущийКаталог(ТекКаталог); Успешно = Истина; Исключение Сообщить("Попытка №" + НомерПопытки + ", установка каталога " + ТекКаталог + " - " + ОписаниеОшибки()); НомерПопытки = НомерПопытки + 1; КонецПопытки; КонецЦикла; Если Не Успешно Тогда Возврат Ложь; КонецЕсли; // почему-то иногда при большой выгрузке глюкает (( // а со второй попытки выкладывается.... странно... НомерПопытки = 1; Успешно = Ложь; Пока НомерПопытки < 4 и не Успешно Цикл Попытка Соединение.Записать(НайденныйФайл.ПолноеИмя, НайденныйФайл.Имя); Успешно = Истина; Исключение Сообщить("Попытка №" + НомерПопытки + ", файл " + НайденныйФайл.ПолноеИмя + " - " + ОписаниеОшибки()); НомерПопытки = НомерПопытки + 1; КонецПопытки; КонецЦикла; Если Не Успешно Тогда Возврат Ложь; КонецЕсли; #Если Клиент Тогда Состояние("Выгрузка файла: " + НайденныйФайл.ПолноеИмя); #КонецЕсли КонецЕсли; КонецЦикла; Возврат Рез; КонецФункции // ПРИМЕР обращения к функции КаталогиДляПередачиНаFTP = Новый Соответствие; // цикл и в нем КаталогиДляПередачиНаFTP.Вставить(СсылкаНаЭлементСправочника); // Конец цикла // Теперь Выгрузим все на FTP Для Каждого Выборка из КаталогиДляПередачиНаFTP Цикл ВыборкаДетальныеЗаписи = Выборка.Ключ; Соединение = Новый FTPСоединение(ВыборкаДетальныеЗаписи.FTPСервер, ВыборкаДетальныеЗаписи.FTPПорт, ВыборкаДетальныеЗаписи.FTPПользователь, ВыборкаДетальныеЗаписи.FTPПароль, ,Ложь); ВыгрузитьФайлыИПапкиНаFTP_Рекурсивно(Соединение, ВыборкаДетальныеЗаписи.FTPКаталогВыгрузки, ВыборкаДетальныеЗаписи.КаталогВыгрузкиДанных); КонецЦикла;
// Передать файл по FTP Процедура ПередатьПоFTP(ИмяФайла,ПутьФТП=Неопределено) Экспорт Если ПутьФТП = Неопределено Тогда ТекПутьФТП = ПараметрыСеанса.FTPПуть; Иначе ТекПутьФТП = ПутьФТП; КонецЕсли; //создаем скрипт для соединения и отправки Скрипт=Новый ТекстовыйДокумент; Скрипт.ДобавитьСтроку("open "+ПараметрыСеанса.FTP); Скрипт.ДобавитьСтроку("user"); Скрипт.ДобавитьСтроку(ПараметрыСеанса.FTPЛогин); Скрипт.ДобавитьСтроку(ПараметрыСеанса.FTPПароль); Скрипт.ДобавитьСтроку("binary"); //при необходимости входим в каталог, возможно, таких команд будет несколько Скрипт.ДобавитьСтроку("cd "+ТекПутьФТП); Скрипт.ДобавитьСтроку("put "+ПараметрыСеанса.ПутьКФайлуОбраза+"\"+ИмяФайла); Скрипт.ДобавитьСтроку("bye"); //записываем скрипт на диск Файл = Новый Файл(ПараметрыСеанса.ПутьКФайлуОбраза+"\"+"ftp.txt"); Скрипт.Записать(ПараметрыСеанса.ПутьКФайлуОбраза+"\"+"ftp.txt", "windows-1251"); //а теперь запускаем его выполнение КомандаСистемы("ftp -n -s:"+ПараметрыСеанса.ПутьКФайлуОбраза+"\ftp.txt"); КонецПроцедуры // Получить файл по FTP Процедура ПолучитьПоFTP(ИмяФайла,ПутьФТП=Неопределено) Экспорт Если ПутьФТП = Неопределено Тогда ТекПутьФТП = ПараметрыСеанса.FTPПуть; Иначе ТекПутьФТП = ПутьФТП; КонецЕсли; //создаем скрипт для соединения и отправки Скрипт=Новый ТекстовыйДокумент; Скрипт.ДобавитьСтроку("open "+ПараметрыСеанса.FTP); Скрипт.ДобавитьСтроку("user"); Скрипт.ДобавитьСтроку(ПараметрыСеанса.FTPЛогин); Скрипт.ДобавитьСтроку(ПараметрыСеанса.FTPПароль); Скрипт.ДобавитьСтроку("binary"); //при необходимости входим в каталог, возможно, таких команд будет несколько Скрипт.ДобавитьСтроку("cd "+ТекПутьФТП); Скрипт.ДобавитьСтроку("get"); Скрипт.ДобавитьСтроку(ИмяФайла); Скрипт.ДобавитьСтроку(ПараметрыСеанса.ПутьКФайлуОбраза+"\"+ИмяФайла); Скрипт.ДобавитьСтроку("bye"); //записываем скрипт на диск Файл = Новый Файл(ПараметрыСеанса.ПутьКФайлуОбраза+"\"+"ftp.txt"); Скрипт.Записать(ПараметрыСеанса.ПутьКФайлуОбраза+"\"+"ftp.txt", "windows-1251"); //а теперь запускаем его выполнение КомандаСистемы("ftp -n -s:"+ПараметрыСеанса.ПутьКФайлуОбраза+"\ftp.txt"); КонецПроцедуры
// Пример от 0xFFFFFF // Может быть проблема в том, что 1С естественно не дожидается окончания перемещения файлов (movehere) // и пока копируются файлы, код продолжает выполняться далее. Функция ОтправитьФайлыЧерезFTP() //подключаемся, отправляем Попытка Шел=СоздатьОбъект("shell.application"); ПапкаФТП=Шел.namespace("ftp://" +СокрЛП(ФТП_Пользователь)+ ":" +СокрЛП(ФТП_Пароль)+ "@" + СокрЛП(ФТП_УРЛ) + "/" +СокрЛП(ФТП_ПутьИсходящих)); ПапкаИсточник=Шел.namespace(КаталогИсходящих); ПапкаЗагруженных = Шел.namespace(КаталогЗагруженных); Предупреждение("Подключение к FTP серверу...",1); Темы=ПапкаИсточник.items(); ПапкаЗагруженных.copyhere(Темы); //Темы.filter(64,"*.txt"); ПапкаФТП.movehere(Темы); Исключение Предупреждение("Внимание! Не удалось передать файлы адресату через FTP! Возможно, параметры FTP заданы неверно, либо отсутствует связь."); Возврат 0; КонецПопытки; //проверяем ФС.УстТекКаталог(КаталогИсходящих); ПопытокПроверки = 3; Для Сч = 1 По ПопытокПроверки Цикл Если НЕ ((СокрЛП(ФС.НайтиПервыйФайл("*.*"))="") или (СокрЛП(ФС.НайтиПервыйФайл("*.*"))=".")) Тогда Если Сч = ПопытокПроверки Тогда Предупреждение("Внимание! Не удалось передать файлы адресату через FTP! Попробуйте совершить обмен позже."); Возврат 0; КонецЕсли; Предупреждение("Передача файлов....", 3); КонецЕсли; КонецЦикла; Возврат 1; КонецФункции Функция ПолучитьФайлыЧерезFTP() //подключаемся Попытка Шел=СоздатьОбъект("shell.application"); ПапкаФТП=Шел.namespace("ftp://" +СокрЛП(ФТП_Пользователь)+ ":" +СокрЛП(ФТП_Пароль)+ "@" + СокрЛП(ФТП_УРЛ) + "/" +СокрЛП(ФТП_ПутьВходящих)); ПапкаПриемник=Шел.namespace(КаталогВходящих); ПапкаЗагруженных = Шел.namespace(КаталогЗагруженных); Предупреждение("Подключение к FTP серверу...",1); Темы=ПапкаФТП.items(); ПапкаЗагруженных.copyhere(Темы); //Темы.filter(64,"*.txt"); ПапкаПриемник.movehere(Темы); Исключение Предупреждение("Внимание! Не удалось получить файлы через FTP! Возможно, параметры FTP заданы неверно, либо отсутствует связь."); Возврат 0; КонецПопытки; //проверяем ПопытокПроверки = 3; Для Сч = 1 По ПопытокПроверки Цикл Если ПапкаФТП.items().count>0 Тогда Если Сч = ПопытокПроверки Тогда Предупреждение("Внимание! Не удалось получить файлы через FTP! Попробуйте совершить обмен позже."); Возврат 0; КонецЕсли; Предупреждение("Получение файлов....", 3); КонецЕсли; КонецЦикла; Возврат 1; КонецФункции
//БЛОК ВЫГРУЗКИ НА ФТП ТекстВыгрузки.Записать(КаталогПользователя()+(ИмяПрайса+".csv")); ТекстВыгрузки = ""; ТекстВыгрузки = СоздатьОбъект("Текст"); ТекстВыгрузки.ДобавитьСтроку("open " + "192.168.0.1"); //адрес ТекстВыгрузки.ДобавитьСтроку("****"); //логин ТекстВыгрузки.ДобавитьСтроку("*****"); //пароль ТекстВыгрузки.ДобавитьСтроку("put " + КаталогПользователя() + (ИмяПрайса+".csv")); ТекстВыгрузки.ДобавитьСтроку("bye"); ТекстВыгрузки.Записать(КаталогПользователя() + "ftp.txt"); ТекстВыгрузки = ""; КомандаСистемы("ftp -s:" + КаталогПользователя() + "Ftp.txt>> " + (КаталогПользователя() + "report.txt")); ФС.УдалитьФайл(КаталогПользователя() + "ftp.txt"); ТекстВыгрузки = СоздатьОбъект("Текст"); ТекстВыгрузки.Открыть(КаталогПользователя() + "report.txt"); КС = ТекстВыгрузки.КоличествоСтрок()-4; //если все нормально - то в этой строке файла должно быть соотв.сообщение //проверим его Попытка строкаКомплете = ТекстВыгрузки.ПолучитьСтроку(КС); Если Найти(Нрег(строкаКомплете),"226 transfer complete") = 0 Тогда а=1; а=а/0; КонецЕсли; тПротокол = ТекущееВремя()+" файл данных успешно отправлен на сервер интернет-магазина"+РазделительСтрок+тПротокол; Форма.Обновить(); ТекстВыгрузки = ""; ФС.УдалитьФайл(КаталогПользователя() + (ИмяПрайса+".csv")); ФС.УдалитьФайл(КаталогПользователя() + "report.txt"); Исключение тПротокол = ТекущееВремя()+" ПРОИЗОШЛА ОШИБКА ВО ВРЕМЯ ЗАГРУЗКИ СФОРМИРОВАННОГО ФАЙЛА НА СЕРВЕР ИНЕТРНЕТ-МАГАЗИНА"+РазделительСтрок+тПротокол; тПротокол = ТекущееВремя()+ИмяПрайса+РазделительСтрок+тПротокол; Форма.Обновить(); ТекстВыгрузки.Показать(); ТекстВыгрузки = ""; КонецПопытки;