Имя: Пароль:
1C
 
v7: Помогите с ftp
0 bastard
 
24.10.06
14:16
проблема с ftp /
задача.Передать по маске файл на фтп ,забрать по маске файла с фтп.
Отследить ошибки.Все это в 7.7.
Я попытался ипользовать ftp.exe делаю командный файл

open retail                       ругается что нет такого пользователя
user medm  в ручном режиме все проходит без проблем,в чем ошибка
Password bastard
cd ..\1
lcd C:\ftp
mput st*.*
quit
1 gr13
 
24.10.06
14:26
забрать можно) и проследить тоже
но вот пока не сделал как отправить и проследить(
мыло дай я тебе пошлю статью не выложенную
2 gr13
 
24.10.06
14:32
Обмен данными для УРИБ 1С:Предприятие 7.7

Задача: Сделать обмен данными УРИБ через FTP, с целью минимизировать действия оператора. Обработка должна самостоятельно выкладывать данные на FTP, забирать оттуда, работать на Windows 98, 2000 Prof, ХР (выбор систем обоснован наличием в магазинах их).
Решение:
Вполне возможно использовать ВК ftp.dll, но у меня более 30 удаленных точек, и ездить во все мне мягко сказать лениво, поэтому этот вариант отпал сам собой. Остается использовать либо типовые функции 1С, либо типовые Windows, к сожалению с типовыми функциям 1С я пока так и не разобрался, поэтому осталось воспользоваться функции Windows. Буквально на днях на miste запостили пример по обмену используя Internet Explorer, но на момент разработки мне попался только пример, с использованием ftp.exe. Сразу оговорюсь, что это не единственное решение, шеф требовал, чтобы оператору можно было видеть результат загрузки-выгрузки, что на тот момент было не ясно как сделать, но на этом моменте мы остановимся позже. Мне почему-то вариант с ftp.exe импонировал больше всего, поэтому на нем и остановимся.
Итак с чего начать? Создадим внешнюю обработку, и назовем ее, обмен.ert (к примеру). На ней сделаем 2 кнопочки: «Получить файл загрузки» и «Отправить файл выгрузки». После этого я начал с того, что определился с путями до файлов, где они непосредственно лежат на дисках и с основными переменными, итак:
Определимся с пользователями на FTP (у меня через Константу определяется текущий склад, т.е. магазин к которому относится данная ПБ):
ftpuser            =  Константа.ОсновнойСклад.Наименование;
ftppwd            = ftpuser;
Для справки, если у Вас нет такой переменной, то можно воспользоваться возможностями УРИБ: ТекущаяИБКод()
Если Вы не знаете Пользователей и Паролей доступа к FTP, то Вы можете уточнить данный вопрос у своего СисАдмина.
ПутьКБазе        = КаталогИБ();
ПутьКПлатформе    = КаталогПрограммы();
Здесь необходимо указать путь до FTP сервера, к которому необходимо подключаться. У меня первоначально было 2 сервера на базе и центральный, сейчас от второго уже отказываемся, но у меня сохранилось:
ftpserver        = "xxx.xxx.xxx.xxx";
ftpserverBase        = " xxx.xxx.xxx.xxx ";
Теперь укажем локальные каталоги. У меня все находится в d:\change, но сисадмин решил как-то раз сделать систему без диска с, поэтому появилась переменная ТекДиск(здесь принцип выбора по диску не существенен, поэтому не указываю):
// локальные каталоги
ТекДиск        = "d:";
locPc            = ТекДиск + "\change\pc\";    //выгрузка
locCp            = ТекДиск + "\change\cp\";    //загрузка
locTr            = ТекДиск + "\change\tr\";    // транзитов
Здесь укажем удаленные каталоги так как они выглядят на FTP сервере. По поводу транзитов и для чего они нужны это отдельный разговор, который к обмену FTP не имеет отношения.
//удаленные каталоги
RemotePc        = "pc";//загрузка
RemoteCp        = "cp";//выгрузка
RemoteTr001        = "tr001"; // транзитов 001
RemoteTr111        = "tr111"; // транзитов 111
И наконец задаем имена файлов, которые необходимо переслать.
// зададим имена файлов
LoadFile        = СокрЛП(Константа.ОсновнойСклад.Наименование) + "0.zip"; // файл загрузки
UnLoadFile        = СокрЛП(Константа.ОсновнойСклад.Наименование) + "1.zip"; // файл выгрузки

Теперь необходимо сделать соответствующие переменные общими, в свойствах каждой кнопочки на форме определимся с процедурами, или как сделал я- в одной процедуре сформировать выбираем нужную процедуру, либо выполняем нужные действия:
Процедура Сформировать(Параметр)
   Если Параметр = "1" Тогда      // получить файл загрузки
       //получаем с торга
       ЗагрузкаFTP(ftpserver,locCp,RemoteCp,LoadFile ,"loadftp.txt");
   ИначеЕсли Параметр = "4" Тогда // отправить файл выгрузки
       ПослатьФайл(ftpserver,locPc,RemotePc,UnLoadFile,"sendftp.txt");
   КонецЕсли;
КонецПроцедуры
Почему Параметр равен «1» и «4», просто у меня обработка являлась универсальной и в п.2,3 предназначены для выполнения процедур пакетного запуска 1С с целью Загрузки и Выгрузки Периферийной Базы.
Теперь, когда мы подготовили все необходимое рассмотрим процедуру загрузки c FTP файла загрузки. Данная процедура готовит ini файл для запуска команды ftp, с параметрами:

// ЗагрузкаFTP()
// предназначена для загрузки файлов с фтп
// параметры
// ФТПсервер        - собственно сервер ФТП откуда загружать
// ПутьЛокальный    - путь к локальному файлу
// ПутьУдаленный    - путь к удаленному файлу (на фтп) /"cp", либо "pc", либо "tr001", либо "tr111"
// ЛогФайл        - имя файла куда будет сохраняться лог загрузки с FTP и последующего анализа
Процедура ЗагрузкаFTP(ФТПсервер,ПутьЛокальный,ПутьУдаленный,ИмяФайла ,ЛогФайл)
   СommandFtpload(ФТПсервер,ПутьЛокальный,ПутьУдаленный,ИмяФайла);
   КомандаСистемы("ftp -v -s:" + ПутьКБазе + "load.ini >" + ПутьКБазе + ЛогФайл);
КонецПроцедуры

Теперь сформируем сам ini файл для загрузки с FTP. В данной процедуре формируется файл load.ini. Команды файла можно посмотреть в документации, поэтому подробно на самом файле останавливаться не будем.
// формируем файл команд загрузки ftp
// предназначена для формирования файла загрузки
// будем каждый раз формировать заного
// параметры
// ФТПсервер        - собственно сервер ФТП откуда загружать
// ПутьЛокальныйФайл    - путь к локальному файлу
// ПутьУдаленныйФайл    - путь к удаленному файлу (на фтп) (с именем файла)
// необходимо учесть, что "change" по умолчанию
// ИмяФайла        - собственно имя удаленного файла на фтп...
Процедура СommandFtpload(ФТПсервер,ПутьЛокальныйФайл,ПутьУдаленный,ИмяФайла)
   Если ФС.СуществуетФайл(ПутьКБазе + "load.ini")=1 Тогда
       ФС.УдалитьФайл(ПутьКБазе + "load.ini");
   КонецЕсли;
   Текст = СоздатьОбъект("Текст");
   Текст.ДобавитьСтроку("open " + СокрЛП(ftpserver));
   Текст.ДобавитьСтроку(СокрЛП(ftpuser));
   Текст.ДобавитьСтроку(СокрЛП(ftppwd));
   Текст.ДобавитьСтроку("prompt ");
   Текст.ДобавитьСтроку("ascii ");
   Текст.ДобавитьСтроку("verbose ");
   Текст.ДобавитьСтроку("cd "+"change");// к сожалению фтп содержит доп каталог
   Текст.ДобавитьСтроку("cd " + ПутьУдаленный);
   Текст.ДобавитьСтроку("get ");
   Текст.ДобавитьСтроку(ИмяФайла);
   Текст.ДобавитьСтроку(ПутьЛокальныйФайл+ИмяФайла);
   Текст.ДобавитьСтроку("bye");
   Текст.Записать(ПутьКБазе + "load.ini");
КонецПроцедуры

Вот собственно и все. Файл загружен с FTP. Данные процедура работают на 98, ХР, 2003 server (на 2000 Prof еще не проверял лично, но жалоб не поступало).

Теперь рассмотрим вопрос с выгрузкой (upload) файла на FTP.
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// ПослатьФайл()
// предназначена для загрузки файлов с фтп
// параметры
// ФТПсервер    - собственно сервер ФТП откуда загружать
// ПутьЛокальный- путь к локальному файлу
// ПутьУдаленный- путь к удаленному файлу (на фтп) /"cp", либо "pc", либо "tr001", либо "tr111"

Процедура ПослатьФайл(ФТПсервер,ПутьЛокальный,ПутьУдаленный,ИмяФайла,ЛогФайл)
   ФайлВыгруз    = "send.ini";
   Если ФС.СуществуетФайл(ПутьКБазе + ФайлВыгруз)=1 Тогда
       ФС.УдалитьФайл(ПутьКБазе + ФайлВыгруз);
   КонецЕсли;
       Текст = СоздатьОбъект("Текст");
       Текст.ДобавитьСтроку("open " + СокрЛП(ФТПсервер));
       Текст.ДобавитьСтроку(СокрЛП(ftpuser));
       Текст.ДобавитьСтроку(СокрЛП(ftppwd));  
       Текст.ДобавитьСтроку("prompt ");
       Текст.ДобавитьСтроку("binary ");
       Текст.ДобавитьСтроку("cd "+"change");// к сожалению фтп содержит доп каталог        
       Текст.ДобавитьСтроку("cd "+СокрЛП(ПутьУдаленный));
       Текст.ДобавитьСтроку("put ");
       Текст.ДобавитьСтроку(ПутьЛокальный + ИмяФайла);
       Текст.ДобавитьСтроку(ИмяФайла);
       Текст.ДобавитьСтроку("bye");
       Текст.Записать(ПутьКБазе + ФайлВыгруз);
   КомандаСистемы("ftp -v -s:" + ПутьКБазе + "send.ini >" + ПутьКБазе + ЛогФайл);
КонецПроцедуры    // ПослатьФайл

Как Вы видите все оказалось простым, как впрочем, и все в программировании, кроме того, что еще сам не делал. Очень многое можно найти в Интернете, правда потом остается еще работа по приведению этого к своим нуждам, да и буквально на днях получилось решить задачу анализа результата и в случае не удачной загрузки файла выводилось предупреждение (с загрузкой в принципе тоже требуется сделать лога, но пока руки не дошли). Итак, приступим:

Создадим переменную ФайлЛог, в которую откром файл лога.
ФайлЛог = СоздатьОбъект("Текст");
ФайлЛог.Открыть(ПутьКБазе + ФайлЛога);
ДлинаФайла = ФайлЛог.КоличествоСтрок();
Для Ном = 1 По ДлинаФайла Цикл
 ТекСтр = ДлинаФайла - Ном + 1;
Получим строку:
 стр            = СокрЛП(ФайлЛог.ПолучитьСтроку(ТекСтр));
Опеределимся с кодом ошибки (коды ошибок можно найти в Интернете, либо на википедии, на русском их не оказалось есть только на английском http://en.wikipedia.org/wiki/List_of_FTP_server_return_codes):
 КодОшибкиСтрока    = Лев(стр,3);
 КодОшибки        = Число(КодОшибкиСтрока);
 Если Строка(КодОшибки) = КодОшибкиСтрока Тогда
Отсечем код закрытия соединения
Если КодОшибки = 221 Тогда //закрытие соединения
Продолжить;
КонецЕсли;
Радуемся с того, что все завершилось успешно:
Если КодОшибки = 226 Тогда
// Уря! завершилось удачно
Сообщить("Файл загружен удачно");
Прервать;
Иначе
Предупреждаем оператора о том, что был не был загружен (и для справки выведем саму ошибку)
Предупреждение("Файл не был загружен пожалуйста повторите");
Сообщить("Файл не был загружен повторите. Возможная ошибка " + стр);
Если КодОшибки = 550 Тогда
Если ошибка 550, следовательно, удаленный файл просто не был найден, о чем и сообщаем оператору:
 Сообщить("Возможно файл не был сформирован, попросите сформировать файл");
 КонецЕсли;
Прервать;
Дальше корректно завершаем условия и цикл.
Обработка требует дальнейшего развития, о чем впоследствии сообщу в исправлениях.
Вот и все. Не прошло и 3 лет, как мы сделали обмен данными. Буду рад, если кому-нибудь поможет данная статья.
3 smaharbA
 
24.10.06
14:38
Просче через InternetExplorer или Explorer (Shell.Application)
4 gr13
 
24.10.06
14:41
(3) не знаю) пока так) напиши статью, я мож ее выложу( когда с++ выучу(
5 gr13
 
24.10.06
14:46
не доработки
1. не проверяет наличие интернета (не выводит информацию об этом) но можно догадаться читая файл лога)
2. нельзя проверить информацию об успешном или не успешной выгрузки на ФТП
3. возможно добавить обработчик ошибок, с основными командами) их у меня на лист в распечатке)