Есть у меня программка по архивации, и вот потребовалось выгружать архивы на FTP, а файлы большие - 4Гб, соединение нестабильное, и средствами 1С сделать это не получилось.
Нашел обходной путь через виндовую curl, вот она умеет докачивать при обрыве, а не начинать заново, код простой, свое лишнее убирать не стал, знающий да разберется.
&НаСервере
Функция ОтправкаНаСервере(Сервер,Логин,Пароль,ИмяПапкиНаFTP,ИмяФайла,ВременноеИмя,ЛокальныйФайл,ПутьКЛогу)
//Сервер = "************";
//Логин = "**************";
//Пароль = "*************";
//ИмяПапкиНаFTP = "Archive1C";
//ИмяФайла = "Archive1C.zip";
//ВременноеИмя = ИмяФайла + ".tmp";
//ЛокальныйФайл = "C:\achiv1C\2025_12_11_20_15_bp_ip.dt";
//ПутьКЛогу = "C:\achiv1C\ftpcopy.log";
логтекст = Строка(ТекущаяДата()) + " загрузка dt" + Символы.ПС;
фтплог = СтрЗаменить(ПутьКЛогу,"ftp_copy","ftp_log_" + ЛокальныйФайл);
ФайлTXT= Новый ТекстовыйДокумент;
ФайлTXT.ВставитьСтроку(1,логтекст);
ФайлTXT.Записать(фтплог);
// ЗАГРУЗКА
ШаблонЗагрузки = "curl.exe -T ""%1"" ""ftp://%2/%3/%4"" -u ""%5:%6"" --ftp-pasv -C - --retry 5 --connect-timeout 30 --stderr ""%7""";
СтрокаЗагрузки = СтрШаблон(ШаблонЗагрузки, ЛокальныйФайл, Сервер, ИмяПапкиНаFTP, ВременноеИмя, Логин, Пароль, ПутьКЛогу);
КодВозврата = Неопределено;
Для к = 1 по 10 Цикл
Если не к = 1 Тогда
//делаем паузу 30сек
КомандаWindows = "Timeout /T " + Строка(30) + " /NoBreak";
ЗапуститьПриложение(КомандаWindows,,Истина);
КонецЕсли;
ЗапуститьПриложение(СтрокаЗагрузки, , Истина, КодВозврата);
Если КодВозврата = 0 Тогда
Прервать;
Иначе
логтекст = логтекст + Строка(ТекущаяДата()) + " прервано попытка " + Строка(к) + Символы.ПС;
ФайлTXT.ВставитьСтроку(1,логтекст);
ФайлTXT.Записать(фтплог);
КонецЕсли;
КонецЦикла;
// ПЕРЕИМЕНОВАНИЕ НА FTP
Если КодВозврата = 0 Тогда
логтекст = логтекст + Строка(ТекущаяДата()) + " загрузка завершена " + Строка(к) + Символы.ПС;
ФайлTXT.ВставитьСтроку(1,логтекст);
ФайлTXT.Записать(фтплог);
// Формируем пути для FTP-команд переименования
ПутьОткуда = "/" + ИмяПапкиНаFTP + "/" + ВременноеИмя;
ПутьКуда = "/" + ИмяПапкиНаFTP + "/" + ИмяФайла;
// Шаблон команды переименования через -Q (quote)
ШаблонПереименования = "curl.exe ftp://%1 -u ""%2:%3"" -Q ""RNFR %4"" -Q ""RNTO %5"" --stderr ""%6""";
СтрокаПереименования = СтрШаблон(ШаблонПереименования, Сервер, Логин, Пароль, ПутьОткуда, ПутьКуда, ПутьКЛогу);
КодВозвратаПереименования = Неопределено;
ЗапуститьПриложение(СтрокаПереименования, , Истина, КодВозвратаПереименования);
Если КодВозвратаПереименования = 0 Тогда
// Все прошло успешно, подчищаем локальный лог
УдалитьФайлы(ПутьКЛогу);
КонецЕсли;
Иначе
логтекст = логтекст + Строка(ТекущаяДата()) + " ошибка при загрузке файл не загружен " + Строка(к) + Символы.ПС;
ФайлTXT.ВставитьСтроку(1,логтекст);
ФайлTXT.Записать(фтплог);
КонецЕсли;
Возврат КодВозврата;
КонецФункции
Проверялось на платформе 8.3.27.1859.
Вступайте в нашу телеграмм-группу Инфостарт