В этой статье представлены способы обхода ошибок интернет-соединений, которыми я пользуюсь на практике.
В моем случае проблема решалась редактированием файла C:\WINDOWS\system32\drivers\etc\hosts "192.168.0.1 доменноеимясайта" на клиенте или на сервере - там, где работает регламентное задание. После этого заработали встроенные интернет-соединения 1С:
КаталогФайловОбмена = "D:\temp\";
ИмяФайлаОтвета = КаталогФайловОбмена + "cards.xml";
Заголовки = "discount.php";
ПроксиК = Неопределено;
Попытка
ПроксиК = Новый ИнтернетПрокси;
ПроксиК.Установить("http", ПроксиК.Сервер("http"), ПроксиК.Порт("http"));
Исключение
КонецПопытки;
ПроксиК.Пользователь = "**********";
ПроксиК.Пароль = "************";
Коннект = Новый HTTPСоединение("доменноеимясайта",,,,ПроксиК);
Попытка
Коннект.Получить(Заголовки,ИмяФайлаОтвета);
Коннект = Неопределено;
Исключение
Ошибка = ОписаниеОшибки();
Ф = Новый ТекстовыйДокумент;
Ф.ДобавитьСтроку(Ошибка);
Ф.Записать(ИмяФайлаОтвета);
Ф = "";
КонецПопытки;
Также помогло редактирование etc\hosts, после чего заработало соединение из публикации Отправка 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/
Мой способ:
- winscp загружается файл (работает даже без правки etc\hosts)
- 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 //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 //infostart.ru/public/145717/