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

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

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

Также помогло редактирование etc\hosts, после чего заработало соединение из публикации Отправка HTTP-строки с обработкой ответа

Попытка 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

Про winscp помогла публикация Выгрузка файлов на SFTP

На сервере может быть отключена расшифровка 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 КоманднаяСтрока = "" ВозвращаемоеЗначение = 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: ************@***********************
transfer ascii
discount.txt
D:\temp\discount.txt | 42 KiB | 39,1 KiB/s | ascii | 100%
Session "****************@***************" closed.
No session.

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

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

После того как Вы установили программу, Вам нужно добавить сессию, там все просто, прописываете узел, порт, логин и пароль к серверу.

Так же посоветую Вам вести логи данной программы, что бы потом можно было в любой момент посмотреть из-за чего не произошел обмен данными или проверять лог на успех или не успех синхронизации файлов. Для того что бы у Вас создавался лог нужно зайти на закладку «Журнализация» установить флажок записывать у файл и выбрать путь, имя файл советую сделать таким образом!S!Y!M!D.txt, это означает, что каждый день будет создаваться новый файл для лога с таким наименованием S - имя сессии, Y - год, M - месяц, D - день, то есть Вам потом будет намного удобнее считывать данные из логов.

Теперь приступим непосредственно к программирования в 1с и для этого нам нужно только знать основные команды WinSCP, весь список которых можно посмотреть на сайте программы. А я Вам приведу только те команды которые использовал я и которых на мой взгляд хватит для того что бы 1с успешно обменивалось данными с sFTP или FTPs серверами. Также я напишу что, зачем и в какой последовательности делал:

1. Перед тем как делать синхронизацию данных, нужно проверить есть ли вообще соединение с сервером, для этого мы делаем следующее:

ПроверимСоединение = """" + ПутьWinSCP + """" + " /console /command " + """option batch abort"" " + """open " + ПрофильWinSCP + """ " + " ""close"" ""exit""";

net.Run(ПроверимСоединение, 0, Истина);

где ПутьWinSCP - строка - путь к программе (c:\Program Files (x86)\WinSCP\WinSCP.com, ОБРАТИТЕ внимание, что расширение файла должно быть com), ПрофильWinSCP - строка - профиль сессии, то как Вы назвали Вашу сессию, к примеру test_sFTP.

2. После тога как мы выполнили предыдущую команду, настоятельно рекомендую делать следующее, искать по дате лог WinSCP и проверять его, не было ли ошибки в соединении, вариантов как это сделать много, но я делал так: с конца текста искал строку «Failed», до тех пор, пока не находил «Session name: " + ПрофильWinSCP», после этого поиск прерываем, ну и собственно если была обнаружена строка «Failed», то при подключении была ошибка.

3. Делаем синхронизацию файлов:

СтрокаСинхронизация = """" + ПутьWinSCP + """" + " /console /command " + """option batch abort"" " + """open " + ПрофильWinSCP + """ " + """synchronize both " + КаталогНаСервере1С + " " + КаталогНаSFTPСервере + """ " + """ close"" ""exit""";

net = Новый COMОбъект("WScript.Shell");

net.Run(СтрокаСинхронизация, 0, Истина);

После этого снова проверяем лог.

Остальные команды которые могут Вам понадобится:

Запись файла на SFTP сервер:

СтрокаПрограммы = """" + ПутьWinSCP + """" + " /console /command " + """option batch abort"" " + """open " + ПрофильWinSCP + """ " + """put " + КаталогНаСервере1С + "\" +ИмяФайла + " " + КаталогНаSFTPСервере + "/" + ИмяФайла + """ " + """close"" ""exit""";

net = Новый COMОбъект("WScript.Shell");

Скопировать файл с SFTP сервера:

СтрокаПрограммы = """" + ПутьWinSCP + """" + " /console /command " + """option batch abort"" " + """open " + ПрофильWinSCP + """ " + """get " + КаталогНаSFTPСервере + "/" + ИмяФайлаСтр + " " + КаталогНаСервере1С + "\" + """ " + """close"" ""exit""";

net = Новый COMОбъект("WScript.Shell");

net.Run(СтрокаПрограммы, 0, Истина);

Получить список файлов на SFTP серверу и записать его в файл:

СтрокаПрограммы = "cmd.exe /c """"" + ПутьWinSCP + """ /console /command " + """option batch abort"" " + """open " + ПрофильWinSCP + """ " + """ls " + КаталогНаSFTPСервере + """""" + """ " + """ close""" + " > FMfiles.txt 2>&1" + """ " + """ exit""";

ЗапуститьПриложение(СтрокаПрограммы, ПутьКЛогам, Истина, КодВозврата);


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

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

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

Также помогло редактирование etc\hosts, после чего заработало соединение из публикации Отправка HTTP-строки с обработкой ответа

Попытка 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

Про winscp помогла публикация Выгрузка файлов на SFTP

На сервере может быть отключена расшифровка 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 КоманднаяСтрока = "" ВозвращаемоеЗначение = 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: ************@***********************
transfer ascii
discount.txt
D:\temp\discount.txt | 42 KiB | 39,1 KiB/s | ascii | 100%
Session "****************@***************" closed.
No session.

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


Close