gifts2017

Загрузка на FTP когда в 1С Предприятии 8 не работает FTPСоединение и (или) HTTPСоединение (любая конфигурация)

Опубликовал Сергей Космачев (ksnik) в раздел Обмен - Интеграция с WEB

Причины отказа встроенных в 1С Предприятие 8 интернет-соединений могут крыться на стороне прокси-сервера, Kerio Control или в других источниках, которые не всегда просто диагностировать. Например когда отключено разрешение DNS, а замена символьного имени на ip адрес сайта ничего не дает, нужно добавить проблемный сайт в исключения прокси интернет эксплорера (в свойствах обозревателя там где настройка прокси сервера), отредактировать файл C:\WINDOWS\system32\drivers\etc\hosts "ip_адрес_сайта www.example.com" и проблема c HTTP может решиться. Но когда заставить работать штатные средства не удается можно попробовать внешние утилиты - клиент для FTP (s) WinSCP.com (http://sourceforge.net/projects/winscp/), очень функциональный, или универсальная для всех протоколов curl в том числе на основе ssl (http://curl.haxx.se/).

В этой статье представлены способы обхода ошибок интернет-соединений, которыми я пользуюсь на практике. 

В моем случае проблема решалась редактированием файла C:\WINDOWS\system32\drivers\etc\hosts "192.168.0.1 доменноеимясайта" на клиенте или на сервере - там, где работает регламентное задание. После этого заработали встроенные интернет-соединения 1С:

    КаталогФайловОбмена = "D:\temp\";
    ИмяФайлаОтвета = КаталогФайловОбмена + "cards.xml";
    Заголовки = "discount.php";
    ПроксиК = Неопределено;
    Попытка
        ПроксиК = Новый ИнтернетПрокси;
        ПроксиК.Установить("http", ПроксиК.Сервер("http"), ПроксиК.Порт("http"));
    Исключение
    КонецПопытки;
    ПроксиК.Пользователь = "**********";
    ПроксиК.Пароль = "************";
    Коннект = Новый HTTPСоединение("доменноеимясайта",,,,ПроксиК);
    Попытка
        Коннект.Получить(Заголовки,ИмяФайлаОтвета);
        Коннект = Неопределено;    
    Исключение
        Ошибка = ОписаниеОшибки();
        Ф = Новый ТекстовыйДокумент;
        Ф.ДобавитьСтроку(Ошибка);
        Ф.Записать(ИмяФайлаОтвета);
        Ф = "";
    КонецПопытки;

Также помогло редактирование etc\hosts, после чего заработало соединение из публикации Отправка HTTP-строки с обработкой ответа  http://infostart.ru/public/147532/

    Попытка
        XMLHttp = GetCOMObject("", "Microsoft.XMLHTTP");
    Исключение
        Ошибка = ОписаниеОшибки();
        Ф = Новый ТекстовыйДокумент;
        Ф.ДобавитьСтроку(Ошибка);
        Ф.Записать("D:\temp\cards21.txt");
        Ф = "";
        Возврат;
    КонецПопытки;
    Попытка
        XMLHttp.Open("GET", "http://доменноеимясайта/discount.php", Ложь);
    Исключение
        Ошибка = ОписаниеОшибки();
        Ф = Новый ТекстовыйДокумент;
        Ф.ДобавитьСтроку(Ошибка);
        Ф.Записать("D:\temp\cards22.txt");
        Ф = "";
        Возврат;
    КонецПопытки;
    XMLHttp.Send();
    Если XMLHttp.Status = 200 Тогда
        Стр = "";
        Попытка
            Стр = XMLHttp.ResponseText;
        Исключение
            Стр = ОписаниеОшибки();
        КонецПопытки;
        Ф = Новый ТекстовыйДокумент;
        Ф.ДобавитьСтроку(Стр);
        Ф.Записать("D:\temp\cards23.txt");
        Ф = "";
    Иначе
        Ф = Новый ТекстовыйДокумент;
        Ф.ДобавитьСтроку(XMLHttp.Status);
        Ф.Записать("D:\temp\cards24.txt");
        Ф = "";
    КонецЕсли;

Через компоненту dialmail подключение проходит нормально, но заставить его работать не удалось:

//Если ЗагрузитьВнешнююКомпоненту(КаталогИБ() + "DialMail.dll") = 0 Тогда
// Сообщить("Не удалось загрузить компоненту DialMail.dll!");
// СтатусВозврата(0);
// Возврат;
//КонецЕсли;
//Попытка
// FTP = СоздатьОбъект("AddIn.FTP");
// FTP.ИмяЛогФайла = "c:\dialmail_ftp.log";
// FTP.ВестиЛогФайл = 1;
// FTP.ВестиТехническийЛогФайл = 1;
//Исключение
// Сообщить("Не удалось создать объект из компоненты DialMail.dll!");
// СтатусВозврата(0);
// Возврат;
//КонецПопытки;
//FTP.ИмяПользователяПрокси = ИмяПользователяПрокси;
//FTP.ПарольПрокси = ПарольПрокси;
//FTP.ХостПрокси = ХостПрокси;
//FTP.ПортПрокси = ПортПрокси;
//// Если FTP.ИспользоватьПрокси = 0 тогда
//// все вышевведенные параметры не учитываются
//FTP.ИспользоватьПрокси = 2;
//FTP.ИспользоватьSSL = 0;
//FTP.NewRFC = 0;
//FTP.БинарныйРежим = 0;
//FTP.ВремяДоРазрыва = 1000000; // Timeout
//Если FTP.Подключиться( FTPСервер,
// FTPПорт,
// FTPПользователь,
// FTPПароль, 0) = 0 Тогда
// Предупреждение("Не смогли подключиться к FTP-серверу");
//Иначе
// Подключено = 1;
//КонецЕсли;
//Сообщить(FTP.ВерсияОбъектаСтр);
//ТекФТПКаталог = FTP.ТекущийКаталог();

28.03.13 13:44:01.500 FTP: Подключаемся к сокету
28.03.13 13:44:01.515 FTP: К сокету подключились успешно
28.03.13 13:44:01.671 FTP 28.03.13 13:44:01.671 FTP --> USER 931013677
28.03.13 13:44:01.687 FTP 28.03.13 13:44:01.687 FTP --> PASS *****
28.03.13 13:44:01.703 FTP 28.03.13 13:44:01.703 FTP --> TYPE I
28.03.13 13:44:01.718 FTP 28.03.13 13:44:01.718 FTP --> STRU F
28.03.13 13:44:01.734 FTP 28.03.13 13:44:01.734 FTP --> REST 0
28.03.13 13:44:01.734 FTP 28.03.13 13:44:01.750 FTP --> REST 1
28.03.13 13:44:01.750 FTP 28.03.13 13:44:01.765 FTP --> REST 0
28.03.13 13:44:01.765 FTP 28.03.13 13:44:01.781 FTP --> PWD
28.03.13 13:44:01.781 FTP 28.03.13 13:44:02.968 FTP --> PWD
28.03.13 13:44:02.984 FTP 28.03.13 13:44:02.984 FTP --> PASV
28.03.13 13:44:03.000 FTP28.03.13 13:44:03.000 FTP --> LIST

при попытке загрузить файл на сервер идут ошибки сокета 10054 

Socket Error # 10054 Connection reset by peer

В интернет об этой ошибке dialmail написано немного, в основном что она встречается, без способа решения. На сайте Гилева об этой ошибке написано, что она встречается в платформе: http://www.gilev.ru/10054/

Мой способ:

  1. winscp загружается файл (работает даже без правки etc\hosts)
  2. curl-ом дергается http-ссылка  (хотя curl не работает без правки etc\hosts)

Вот перечень основных принципиальных вопросов при решении практической задачи использования интернет-соединения с помощью внешнего клиента, на которые оказалось важно обратить внимание...

Про curl узнал у специалистов pradata.com
curl is a command line tool for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, Telnet and TFTP. curl supports SSL certificates, HTTP POST, HTTP PUT, FTP uploading, HTTP form based upload, proxies, cookies, user+password authentication (Basic, Digest, NTLM, Negotiate, kerberos...), file transfer resume, proxy tunneling and a busload of other

дернуть ссылку можно например так: curl -g http://доменноеимя/discount.php

Про winscp помогла публикация Выгрузка файлов на SFTP http://infostart.ru/public/145717/

Скачиваем FTP клиент http://sourceforge.net/projects/winscp/?source=directory

http://citylan.dl.sourceforge.net/project/winscp/WinSCP/4.3.9/winscp439.zip

На сервере может быть отключена расшифровка dns адреса (как в моем случае), поэтому вместо доменного имена сайта - цифровой ай пи адрес.

Текст процедуры, которая у меня реально работает (перезаписываю файл во временном локальном каталоге и заливаю на сервер):
Процедура Отчет(ТабДок, ДатаКон, ДатаНач) Экспорт
    Ф = Новый ТекстовыйДокумент;
    Ф.ДобавитьСтроку("ШтрихКод;Период;СуммаПокупки");
    Файл="d:\temp\discount.txt";
    Ф.Записать(Файл);

    // http://programna1c.narod.ru/docs/WSH/1C_WSH_WshShell.html
    //Run(, , ) Выполняет команду. Основным достоинством является наличие ожидания окончания работы выполняемой команды.
    //Параметры:
    // - выполняемая команда. Задается в формате DOS и длинные имена не поддерживает.
    // - число, в котором указывается вариант показа окна, запускаемого приложения. Не обязателен. Возможные значения:
    //0 - Скрывает окно и активирует другое;
    //1 - Активизирует и показывает окно. Если окно минимизировано или максимизировано, система восстанавливает его к оригинальному размеру и положению. Используется при первом открытии окна программы.
    //2 - Активизирует окно в свернутом режиме.
    //3 - Активизирует окно и разворачивает на весь экран.
    //4 - Показывает окно в его новом размере и положении. Активным остается текущее окно.
    //5 - Активизирует окно и показывает его в текущем размере.
    //6 - Минимизирует окно и активизирует следующее на панеле задач.
    //7 - Показывает окно как минимизированное. Активное окно остается активным.
    //8 - Показывает окно в его текущем состоянии. Активное окно остается активным.
    //9 - Активизирует и показывает окно. Если окно минимизировано или максимизировано, система восстанавливает его к оригинальному размеру и положению. Используется для восстановления минимизированного окна.
    //10 - показывает окно в том-же состоянии, что и окно вызывающей программы.
    // - флаг ожидания завершения процесса. Возможные значения: 0 - не ждать окончания выполнения команды; -1 - ждать окончания выполнения команды. Не обязателен. По умолчанию 0.
    //Замечание: Запускать можно как приложение, так и любую команду (аналогично Пуск->Выполнить).
    //Пример:
    //WshShell = Новый COMОбъект("WScript.Shell");
    //WshShell.Run("notepad",7,-1);


    WshShell = Новый COMОбъект("wscript.Shell");
    //Содержимое файла ap.ini
    //open ftp://******:********@******************
    //rm discount.txt
    //option transfer ascii
    //put D:\temp\discount.txt
    //close
    //exit
    КоманднаяСтрока = "D:\temp\WinSCP.com /script=D:\temp\ap.ini"
    ВозвращаемоеЗначение = WshShell.Run(КоманднаяСтрока, 1);
    WshShell = Неопределено;
КонецПроцедуры

Вот то, что относится ко внешнему ftp клиенту:

Команда для запуска скрипта:

D:\temp\WinSCP.com /script=D:\temp\ap.ini

Текст скрипта:

open ftp://**************:**************@*********************  // после собаки ай пи адрес, а не доменное имя
option transfer ascii
rm discount.txt
put D:\temp\discount.txt
close
exit

Результат выполнения этого скрипта:

D:\temp>D:\temp\WinSCP.com /script=D:\temp\ap.ini
Connecting to ***************** ...
Connected with *********************. Waiting for welcome message...
Connected
Starting the session...
Reading remote directory...
Session started.
Active session: [1] ************@***********************
transfer        ascii
discount.txt
D:\temp\discount.txt      |         42 KiB |   39,1 KiB/s | ascii  | 100%
Session '****************@***************' closed.
No session.

D:\temp>

Я решил свои проблемы применением клиента WinSCP.com, благодаря публикации Выгрузка файлов на SFTP http://infostart.ru/public/145717/

Скачать файлы

Наименование Файл Версия Размер
Обработка выгрузки 43
.erf 8,90Kb
24.08.12
43
.erf 8,90Kb Скачать
winscp.com 8
.com 93,67Kb
24.08.12
8
.com 93,67Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Александр Шкураев (salexdv) 24.08.12 11:18
Думается мне, что в неработоспособности встроенного FTPСоединение виноват ваш прокси сервер.
Не увидел в скрипте D:\temp\ap.ini настроек прокси. Как WinSCP без него коннектится?
2. GIS 24.08.12 11:20
Зачем городить огород со сторонними клиентами?
Когда я столкнулся с непонятными глюками FTPСоединения, я просто использовал встроенный виндовый ФТП клиент
3. Сергей Космачев (ksnik) 24.08.12 12:02
(1) salexdv, он был настроен через gui и вероятно использует установки, записанные в файл WinSCP.ini при настройке графического клиента WinSCP.exe (который нормально настраивается и работает, когда запускается отдельным приложением, но не работает через WshShell.Run).
Но не исключено, что я авторизован на прокси другим способом, например средствами операционной системы.
4. Сергей Космачев (ksnik) 24.08.12 12:06
(2) GIS, я посмотрел ссылку - принцип тот же, только моя обработка делает 1 запуск WinSCP.exe через WshShell.Run и отрабатывает скрипт из нескольких команд, а в Вашем случае потребуется многократные запуски. Спасибо большое, я не знал раньше как обращаться с Microsoft command-line FTP client, можете дать пример исходников?
5. Александр Шкураев (salexdv) 24.08.12 12:14
(3) Попробуйте использовать FTPСоединение в обход прокси. Мне кажется, что проблема все таки в этом. Понимаю, что это не выход, когда нельзя менять конфигурацию сети. Чисто так, ради интереса и докапывания до истины...
6. Сергей Космачев (ksnik) 24.08.12 12:21
(5) salexdv, я пробовал, не в этом. В 1Ске нет никаких сообщений об ошибках, но она не наботает.
7. GIS 24.08.12 12:53
(4) Синтатксис самого клиента в моей ссылке выше, а из 1С его можно вызывать используя функцию КомандаСистемы.
8. Сергей Космачев (ksnik) 24.08.12 13:14
(7) GIS, КомандаСистемы вызывается многократно, не тормозит? Как быть, если придется работать через интернет прокси-сервер с авторизацией, где пароль прокси-сервера каждый раз вводить надо?
9. GIS 24.08.12 13:25
(8) Тормозит ровно также,как если бы вы вводили эти команды в командной строке. Про прокси серверы ничего не скажу - не сталкивался.
10. Сергей Космачев (ksnik) 24.08.12 13:37
(9) GIS, моя разработка появилась как раз из=за проблем с прокси-сервером. Жаль, что при решении моих проблем нельзя использовать Microsoft command-line FTP client. Однако Ваш способ мне тоже нравится, известно ли Вам как ведет себя 1Ска во время выполнения команды системы из регламентного задания на сервере (работает или проставивает)?
11. GIS 24.08.12 13:52
(10) насколько я помню, выполнение синхронное - т.е. пока КомандаСистемы не вернет 1С код возврата, 1С ждет.
12. Сергей Космачев (ksnik) 24.08.12 14:00
(11) GIS, интересно как ведут себя такие вот ftp-выгрузки именно как регламентное задание, ато надо выполнять их по расписанию и пользователей много.
13. GIS 24.08.12 14:07
(12) у меня все это по расписанию отлично работало
14. Сергей Космачев (ksnik) 24.08.12 14:14
(13) GIS, жаль, что нет возможности посмотреть исходник(
15. Сергей Космачев (ksnik) 26.08.12 16:09
Нормально работает как регламентное задание, текст процедуры:

Запрос = Новый Запрос;
Запрос.Текст =
"**********";
Запрос.УстановитьПараметр("ДатаКон", КонецДня(ТекущаяДата()));
Запрос.УстановитьПараметр("ДатаНач", ДобавитьМесяц(ТекущаяДата(),-1));
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
ВыборкаДетальныеЗаписиКоличествоСтрок = ВыборкаДетальныеЗаписи.Количество();
Ф = Новый ТекстовыйДокумент;
Ф.ДобавитьСтроку("ШтрихКод;Период;СуммаПокупки");
Сч = 0;
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сч = Сч + 1;
ФШтрихКод = ВыборкаДетальныеЗаписи.ШтрихКод;
ФПериод = ВыборкаДетальныеЗаписи.Период;
ФСуммаПокупки = ВыборкаДетальныеЗаписи.СуммаПокупки;
Ф.ДобавитьСтроку(""+ ФШтрихКод + ";" + ФПериод + ";" + Формат(ФСуммаПокупки,"ЧГ=0"));
КонецЦикла;
Файл="d:\temp\discount.txt";
Ф.Записать(Файл);
WshShell = Новый COMОбъект("wscript.Shell");
КоманднаяСтрока = "D:\temp\WinSCP.com /script=D:\temp\ap.ini";
ВозвращаемоеЗначение = WshShell.Run(КоманднаяСтрока, 1);
WshShell = Неопределено;
16. Сергей Космачев (ksnik) 13.09.12 09:07
*В публикации вместо строчки "192.168.0.1 skosmachev.mshome.net" из файла C:\WINDOWS\system32\drivers\etc\hosts нужно написать "ip_адрессайта доменноеимясайта"
17. Алексей (devel0per) 24.11.12 22:08
Надо пакетным режимом пользоваться.
ftp -s:script.txt ftp.server.com

где script.txt примерно такого содержания:

OPEN
ftpserver
Username
Password
bin
cd /files
put file1
put file2
bye

Т.е. Сначала формируете в 1С-ке файлик script.txt
затем, выполняете команду пакетного запуска ftp -s:script.txt ВашСерверФТП
18. Константин Юрин (kostyaomsk) 28.01.16 19:04
Хорошие шаблоны для связи с внешним миром через интернет. Нужно будет запомнить.