#29 1C отправка данных через ftp клиент WINSCP

Дата: 06.12.2025 00:07:05
1C
FTP
WinScp
Комментарий:
0
Конфигурация:
Любая
Формы:
Любые
Описание:

Бывают моменты когда штатный механизм отправка файла по ftp очень долго выполняет свою работу ! В данной реализации использовался Winscp все очень быстро отправляется и все хорошо работает !

Код:
                        
Процедура ОтправитьПоFTPWinSCP(ПутьКФайлу, НазваниеФайла)
	
	ПутьКWinSCP = "C:\Program Files (x86)\WinSCP\WinSCP.com"; 
	
	// Данные FTP
	Хост     = "";
	Логин    = "";
	Пароль   = "";
	Порт     = "21"; // 22 для SFTP, 21 для FTP
	Протокол = "ftp"; // sftp или ftp
	
	УдаленнаяПапка = "/";
	
	// 2. Создаем текст скрипта
	Текст = Новый ТекстовыйДокумент;
	Текст.ДобавитьСтроку("option batch abort");
	Текст.ДобавитьСтроку("option confirm off");
	
	// Строка подключения
	СтрокаПодкл = СтрШаблон("open ftp://%1:%2@%3:%4", Логин, Пароль, Хост, Порт);
	Текст.ДобавитьСтроку(СтрокаПодкл);
	
	Текст.ДобавитьСтроку("option transfer binary");
	Текст.ДобавитьСтроку("put """ + ПутьКФайлу + """ """ + УдаленнаяПапка + """");
	Текст.ДобавитьСтроку("exit");
	
	// === ВАЖНОЕ ИЗМЕНЕНИЕ ===
	// WinSCP требует UTF-8, если в путях есть русские буквы (Гусейн)
	ИмяСкрипта = ПолучитьИмяВременногоФайла("txt");
	Текст.Записать(ИмяСкрипта, КодировкаТекста.UTF8);
	// ========================
	
	// 3. Запуск
	Команда = СтрШаблон("""%1"" /log=""%2"" /loglevel=0 /script=""%3""", 
	ПутьКWinSCP, ИмяСкрипта + ".log", ИмяСкрипта);
	
	Сообщить("Запуск WinSCP...");
	
	Wsh = Новый COMОбъект("WScript.Shell");
	
	// Используем Run (так проще), но ждем завершения (Истина)
	Код = Wsh.Run(Команда, 0, Истина);
	
	Если Код = 0 Тогда
		Сообщить("Файл успешно отправлен!");
	Иначе
		Сообщить("Ошибка! Код возврата: " + Код);
		
		// Читаем лог, чтобы понять причину (пароль не тот или сервер недоступен)
		Попытка
			ТекстЛога = Новый ТекстовыйДокумент;
			// Лог WinSCP пишет тоже в UTF-8
			ТекстЛога.Прочитать(ИмяСкрипта + ".log", КодировкаТекста.UTF8);
			Сообщить("--- ЛОГ WINSCP ---");
			Сообщить(ТекстЛога.ПолучитьТекст());
		Исключение
			Сообщить("Лог не создан или пуст.");
		КонецПопытки;
	КонецЕсли;
	
	// Удаляем временные файлы
	УдалитьФайлы(ИмяСкрипта);
	УдалитьФайлы(ИмяСкрипта + ".log"); 
	
КонецПроцедуры

                    

Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.


1c-only | Фриланс © 2026