Имя: Пароль:
1C
 
1C 77 и FTP
0 FEAS
 
27.08.10
12:07
Мне нжуно выгружать и загружать из 1С файлы на FTP и обратно.
Прочитал тут http://www.mista.ru/articles1c/hare/article.26.html
вроде сделал но что то не получается
роцедура Сформировать()
   
   // генерируем текст скрипта
   
   Текст=СоздатьОбъект("Текст");
   
   Текст.ДобавитьСтроку("use NET::Ftp;");
   Текст.ДобавитьСтроку("$ftp = Net::FTP->new(""192.168.8.110"",Firewall => ""192.168.1.100"");");
   Текст.ДобавитьСтроку("$ftp->login('ftp','Asdpass') || die $!;");
   
   
   Текст.ДобавитьСтроку("$ftp->cwd('upload');");
   Текст.ДобавитьСтроку("$ftp->cwd('Морки');");  
   Текст.ДобавитьСтроку("$ftp->get('1C.doc','C:\1C.doc');");
   
   Текст.ДобавитьСтроку("@list=$ftp->dir();");
   Текст.ДобавитьСтроку("foreach (@list) {");
   Текст.ДобавитьСтроку("$dir.=""$_\n"";");
   Текст.ДобавитьСтроку("}");
   Текст.ДобавитьСтроку("open TXT,'>c:\ftp_dir.txt';");
   Текст.ДобавитьСтроку("|print TXT $dir;");
   Текст.ДобавитьСтроку("close TXT;");
   Текст.ДобавитьСтроку("$ftp->quit();");
   
   // записываем на диск
   Текст.Записать(КаталогИБ()+"connect.pl");
   
   // запускаем на выполнение
   КомандаСистемы(КаталогИБ()+"connect.pl");
   
   // удаляем, чтоб не засорять место
   ФС.УдалитьФайл(КаталогИБ()+"connect.pl");
   
КонецПроцедуры  

Вроде запускается проходит Но не совсем понял на счет каталогов как на фтп в каталог и что такое заголовки может там не правильно.
1 FEAS
 
27.08.10
12:12
мне нужно вот здесь взять файл или туда залить /upload/Морки/
Файл 1С.doc

вот это не знаю нужно или нет изменять
Текст.ДобавитьСтроку("@list=$ftp->dir();");
   Текст.ДобавитьСтроку("foreach (@list) {");
   Текст.ДобавитьСтроку("$dir.=""$_\n"";");
   Текст.ДобавитьСтроку("}");
   Текст.ДобавитьСтроку("open TXT,'>c:\ftp_dir.txt';");
   Текст.ДобавитьСтроку("|print TXT $dir;");
   Текст.ДобавитьСтроку("close TXT;");
2 Sadovnikov
 
27.08.10
12:16
90) А не проще DialMail взять?
3 FEAS
 
27.08.10
12:18
а как черех него?
4 Sadovnikov
 
27.08.10
14:11
(3) Там объект FTP есть
5 mishaPH
 
27.08.10
14:21
+4 и мозг не компостировать
6 trdm
 
30.08.10
13:23
Прикольно, там даже файло для интеллиценз в каталоге есть :)
Как раз надо пофтпукать...
7 xl
 
31.08.10
15:11
команда=КаталогИБ()+"ftp\winscp.exe /console /script="+КаталогИБ()+"ftp\"+"script.tmp /parameter "+КаталогИБ()+"ftp\"+имяфаила;

ключевое слово winscp.exe
8 smaharbA
 
31.08.10
15:13
это чо перл заради фтп ставить ?
9 Aleksey_3
 
31.08.10
15:27
Функция ВыгрузитьВФТП()
  //подготавливаем файл с командами ftp
  ВременныйСкриптФайл="InetFTP.tmp";
  Т=СоздатьОбъект("Текст");
  Т.ДобавитьСтроку("open "+Сокрлп(База.АдресСервера));
  Т.ДобавитьСтроку(Сокрлп(База.Логин));
  Т.ДобавитьСтроку(Сокрлп(База.Пароль));
  Т.ДобавитьСтроку("prompt");
  Т.ДобавитьСтроку("binary");                        
  Если База.ПассивныйРежим=1 тогда
     Т.ДобавитьСтроку("literal pasv");  
  КонецЕсли;
  Т.ДобавитьСтроку("mkdir "+Сокрлп(База.КаталогВыгрузки));
  Т.ДобавитьСтроку("cd "+Сокрлп(База.КаталогВыгрузки));
  Т.ДобавитьСтроку("put flag.mod"); //посылаем проверочный флаг
  Т.ДобавитьСтроку("mput *.mod");//get
  Т.ДобавитьСтроку("mput *.7z");//get
  Т.ДобавитьСтроку("get flag.mod flag2.mod");//считываем - его
  Т.ДобавитьСтроку("quit");//выход
   
  Т.Записать(ПутьКБазеПриВыгрузке+"\"+ВременныйСкриптФайл);
   
  ФайлФлага=ПутьКБазеПриВыгрузке+"\flag.mod";
  ФайлФлага2=ПутьКБазеПриВыгрузке+"\flag2.mod";
  Т=СоздатьОбъект("Текст");
  Т.ДобавитьСтроку("=Проверка связи=");
  Т.Записать(ФайлФлага);
  Если ФС.СуществуетФайл(ФайлФлага2)=1 Тогда
     ФС.УдалитьФайл(ФайлФлага2);
  КонецЕсли;
   
  Фс.УстТекКаталог(ПутьКБазеПриВыгрузке);
  Команда="ftp -s:"""+ВременныйСкриптФайл+""">ftp_out.log";
  КомандаСистемы(Команда);
  Фс.УдалитьФайл(ПутьКБазеПриВыгрузке+"\"+ВременныйСкриптФайл);
  Рез=ФС.СуществуетФайл(ФайлФлага2); //если файл существует, то соединение было успешное
  ФС.УстТекКаталог(КаталогИБ());
  Возврат Рез;
КонецФункции
10 Aleksey_3
 
31.08.10
15:30
Функция ЗагрузитьИзФТП()
  //подготавливаем файл с командами ftp
  ВременныйСкриптФайл="InetFTP.tmp";
  Т=СоздатьОбъект("Текст");
  Т.ДобавитьСтроку("open "+Сокрлп(База.АдресСервера));
  Т.ДобавитьСтроку(Сокрлп(База.Логин));
  Т.ДобавитьСтроку(Сокрлп(База.Пароль));
  Т.ДобавитьСтроку("prompt");
  Т.ДобавитьСтроку("binary");  
  Если База.ПассивныйРежим=1 тогда
     Т.ДобавитьСтроку("literal pasv");  
  КонецЕсли;    
  Т.ДобавитьСтроку("mkdir "+Сокрлп(База.КаталогЗагрузки));
  Т.ДобавитьСтроку("cd "+Сокрлп(База.КаталогЗагрузки));
  Т.ДобавитьСтроку("put _flag.mod"); //посылаем проверочный флаг
  Т.ДобавитьСтроку("get _flag.mod _flag2.mod");//считываем - его
  Т.ДобавитьСтроку("mget *");
  Т.ДобавитьСтроку("quit");//выход
  Т.Записать(ПутьКБазеПриЗагрузке+"\"+ВременныйСкриптФайл);
   
  ФайлФлага=ПутьКБазеПриЗагрузке+"\_flag.mod";
  ФайлФлага2=ПутьКБазеПриЗагрузке+"\_flag2.mod";
  Т=СоздатьОбъект("Текст");
  Т.ДобавитьСтроку("=Проверка связи=");
  Т.Записать(ФайлФлага);
  Если ФС.СуществуетФайл(ФайлФлага2)=1 Тогда
     ФС.УдалитьФайл(ФайлФлага2);
  КонецЕсли;

  Фс.УстТекКаталог(ПутьКБазеПриЗагрузке);
  Команда="ftp -s:"""+ВременныйСкриптФайл+""">ftp_in.log";
  КомандаСистемы(Команда);
   
  Рез=ФС.СуществуетФайл(ФайлФлага2); //если файл существует, то соединение было успешное
  Если Рез=1 Тогда //надо очистить каталог ftp
     ВременныйСкриптФайл="InetFTP.tmp";
     Т=СоздатьОбъект("Текст");
     Т.ДобавитьСтроку("open "+Сокрлп(База.АдресСервера));
     Т.ДобавитьСтроку(Сокрлп(База.Логин));
     Т.ДобавитьСтроку(Сокрлп(База.Пароль));
     Т.ДобавитьСтроку("prompt");
     Т.ДобавитьСтроку("binary");  
     Если База.ПассивныйРежим=1 тогда
        Т.ДобавитьСтроку("literal pasv");  
     КонецЕсли;    
           
     Т.ДобавитьСтроку("mkdir "+Сокрлп(База.КаталогЗагрузки));
     Т.ДобавитьСтроку("cd "+Сокрлп(База.КаталогЗагрузки));
     Т.ДобавитьСтроку("mdelete *");
     Т.ДобавитьСтроку("quit");//выход
     Т.Записать(ПутьКБазеПриЗагрузке+"\"+ВременныйСкриптФайл);
       
     Команда="ftp -s:"""+ВременныйСкриптФайл+""">ftp_del.log";
     КомандаСистемы(Команда);
  КонецЕсли;
  Фс.УдалитьФайл(ПутьКБазеПриЗагрузке+"\"+ВременныйСкриптФайл);
   
  ФС.УстТекКаталог(КаталогИБ());
  Возврат Рез;
КонецФункции
11 Sadovnikov
 
31.08.10
15:31
(9), (10) Ну и нафига столько кода, если ВК?
12 Sadovnikov
 
31.08.10
15:32
+(11) "если ВК?" = "если есть ВК?"
13 Aleksey_3
 
31.08.10
15:32
(11) Да нуфиг ставить какое-то левое ВК, еще не известно, как оно под новую систему работать будет
14 Sadovnikov
 
31.08.10
15:33
(13) Ну-ну.
15 Aleksey_3
 
31.08.10
15:36
(14) Есть гарантия, что ВК будет одинаково работать и под win2k0 х32 и под win2k8 х64?
16 Sadovnikov
 
31.08.10
15:38
(15) Работает. По под win2k8 х64 еще рано говорить - только второй месяц эксплуатации.
17 Mikeware
 
31.08.10
15:42
(13) ставь "родное 1совское" 1cv7ftp.dll
18 Aleksey_3
 
31.08.10
15:43
(16) Можно и на перле организовать, как в (0). В данном случае применять ВК, ради ВК смысла большого не вижу
19 le_
 
31.08.10
15:45
Можно без всяких ВК и таких скриптов, как в (0)

Есть простенький клиент WinSCP.
Этот клиент кушает INI-файлы типа:
# Вывод лога на экран
option echo on
# Автоматическое подтверждение действия по умолчанию
option confirm off
# Соединяемся с сервером
open ftp://login:pass@server -passive
# Загружаем файл
put "D:\Work\xz.zip" xz.zip
# Отсоединяемся от сервера
close
# Закрываем WinSCP
exit

Запускается так:
winscp.exe /script=FileName.ini
20 Aleksey_3
 
31.08.10
15:45
(17) Да без разницы, хоть через
Шел=СоздатьОбъект("shell.application")
Папка=Шел.Namespace("ftp://"+Пользователь+":"+Пароль+"@"+ПутьФТП);

Сообщить(Папка.Items().Count);
21 Sadovnikov
 
31.08.10
15:50
(18) У применения ВК всегда единственный смысл - удобство прогера.
22 Aleksey_3
 
31.08.10
15:53
(21) И не только. Например теже "плюсики" в 7-ке. Штатными средставми это получиться через одно место и будет долго отрабатывать. А через ёксель в лет
23 le_
 
31.08.10
15:53
+ (19)
Можно запускать в режиме консольки, чтобы было видно, что происходит:
winscp.exe /console /script=FileName.ini

Отходя от темы: у меня таким образом обмен УРБД организован. Сколько работает -  никогда сбоев не было.
24 Sadovnikov
 
31.08.10
15:57
(22) Я к тому, что и без ВК можно практически всё сделать. Абрахамс не даст соврать :)
Если есть ВК - прогер быстрее реализует, не "через одно место". В результате, и для пользователя может оказаться лучше - красивее, быстрее и т.д.
25 le_
 
31.08.10
16:01
И, кстати, вместо перлового скрипта, если уж на то пошло можно обычный батник для ftp.exe (который в system32 валяется) наваять.
Ставить перл для отправки файла на FTP из 1С-ки как-то... не очень.
26 Злопчинский
 
31.08.10
16:04
(22) +ики в семерке реализуются повешением одной кнопки на панель инструментов - подхватывает отчеты и преобразует в плюсики...
27 Sadovnikov
 
31.08.10
16:07
(26) Чёкаво? В смысле - поясни?
28 Злопчинский
 
31.08.10
16:08
//****************************************************************************************************************************
   //БЛОК ВЫГРУЗКИ НА ФТП *******************************************************************************************************
   //****************************************************************************************************************************
   ТекстВыгрузки = СоздатьОбъект("Текст");
   ТекстВыгрузки.ДобавитьСтроку("open " + "тутадрес");
   ТекстВыгрузки.ДобавитьСтроку("логин");
   ТекстВыгрузки.ДобавитьСтроку("пароль");
   ТекстВыгрузки.ДобавитьСтроку("cd office");
   ТекстВыгрузки.ДобавитьСтроку("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");
   Исключение
       тПротокол = ТекущееВремя()+" ПРОИЗОШЛА ОШИБКА ВО ВРЕМЯ ЗАГРУЗКИ СФОРМИРОВАННОГО ФАЙЛА НА СЕРВЕР ИНЕТРНЕТ-МАГАЗИНА"+РазделительСтрок+тПротокол;
       тПротокол = ТекущееВремя()+ИмяПрайса+РазделительСтрок+тПротокол;
       Форма.Обновить();
       ТекстВыгрузки.Показать();
       ТекстВыгрузки = "";
   КонецПопытки;    
   //****************************************************************************************************************************
   //БЛОК ВЫГРУЗКИ НА ФТП *******************************************************************************************************
   //****************************************************************************************************************************
29 le_
 
31.08.10
16:08
+(25)
Содержимое ftp.bat:
@echo off
ftp -s:commands.txt -i 192.168.26.113


Содержимое commands.txt:
MyLogin
MyPass
cd Papka
mput d:\base\*.dbf
quit
30 Злопчинский
 
31.08.10
16:09
31 Sadovnikov
 
31.08.10
16:11
(30) Ага, понял. Шикарно :)
32 Aleksey_3
 
31.08.10
16:11
(26) Для этого нужно ставить как минимум 2 вк,а formex у меня в терминале не прижился
33 Sadovnikov
 
31.08.10
16:14
(32) А почему не прижился? Как давно это было?
34 Aleksey_3
 
31.08.10
16:21
(33) Давно. Не прижилось, потому что по умолчанию там включено отслеживание мышки, клавы, таймер и куча всего, и в терминале когда много юзеров (а у меня меньше 70 не бывает), начинает все тормозить и грузить проц. Т.е. 10-15 юзеров все ОК. Более 50 - попа
35 Aleksey_3
 
31.08.10
16:22
Т.е. достаточно было просто загрузить formex, как все юзеры это замечали, потому что база начинала тормозить
36 Sadovnikov
 
31.08.10
16:23
(34) Ясно. С тех пор воды много утекло...
37 Aleksey_3
 
31.08.10
16:23
Может и утекло, но осадок остался. Поэтому пока что стараюсь без нее обходиться
38 Sadovnikov
 
31.08.10
16:26
(37) Многих интересных вещей лишаешься...
39 Sadovnikov
 
31.08.10
16:27
Просто пример. Живет в классе ТДокумент - базовый класс для всех документов конфигурации.

Функция ПриОтжатииКнопкиКлавиатуры(КодКлавиши, Alt, Shift, Ctrl, Символ, ФСО) Экспорт

   Если КодКлавиши = VK_F11 Тогда
       Если ((Alt+Ctrl) = 2) И (Shift = 0) Тогда
           сзПараметры = СоздатьОбъект("СписокЗначений");
           сзПараметры.Установить("Документ", Сам(Контекст).ТекущийДокумент());
           ОткрытьФорму("Отчет.обрДвиженияДокумента", сзПараметры);
           Возврат 1;
       КонецЕсли;
   ИначеЕсли Alt = 1 Тогда
       Если КодКлавиши = КодСимв("A") Тогда
           ВыбратьФирму();
           ФСО = 0;
           Возврат 1;
       КонецЕсли;
       
   ИначеЕсли Ctrl = 1 Тогда
       Если КодКлавиши = КодСимв("S") Тогда
           Если Сам(Контекст).Форма.ТолькоПросмотр() = 1 Тогда
               Возврат 1;
           КонецЕсли;
           
           Сам(Контекст).ПриНажатииКнопкиОК(0);
           ФСО = 0;
           Возврат 1;
       КонецЕсли;
   КонецЕсли;
   
   Возврат 0;
КонецФункции
40 Злопчинский
 
31.08.10
16:31
у мну на старой работе все в терминале, активных - юзверей 17, формекс. Все ок.
41 Злопчинский
 
31.08.10
16:31
(31) да, я вовсю пользую. работает нормуль. автору - респектище неимоверное...
42 Aleksey_3
 
31.08.10
16:33
(40) Вот и я о том же. Мы тогда с автором переписывались, и он подтвердил, что такой эффект наблюдается, только с большим количество юзверей
43 Злопчинский
 
31.08.10
16:35
(42) да, я помню, читал.
другой момент, что использовать надо там, где надо использовать, а не чохом...
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.