При работе с протоколом FTP в платформе 1С:Предприятие разработчики нередко сталкиваются с ситуацией, когда инициализация объекта FTPСоединение и выполнение любых базовых операций (получение списка файлов, переход по каталогам, запись файлов) происходят крайне медленно. Задержки могут достигать от десятков секунд до нескольких минут на каждую операцию. Разберем по шагам, почему возникает эта проблема и какие существуют способы ее решения.
Проанализируем сетевую модель взаимодействия 1С с FTP-сервером. Когда клиентское приложение находится за NAT, использование активного режима FTP становится невозможным, и соединение переводится в пассивный режим. Внутренний механизм платформы 1С, отвечающий за работу с FTP, при установке пассивного соединения по умолчанию отправляет серверу команду расширенного пассивного режима EPSV (Extended Passive Mode), описанную в RFC 2428.
Если между клиентом 1С и FTP-сервером установлен межсетевой экран (фаервол), который фильтрует порты и настроен на молчаливый сброс пакетов (правило DROP), происходит следующее:
FTPСоединение отправляет серверу команду EPSV и ожидает ответа.PASV.Важно учитывать, что встроенный объект FTPСоединение не содержит штатных свойств или параметров в строке подключения для принудительного отключения режима EPSV. Рассмотрим подробнее способы устранения задержек как на уровне инфраструктуры, так и на уровне прикладного кода 1С.
Самый эффективный способ решения проблемы без изменения конфигурации 1С — корректировка параметров службы FTP на сервере. Если сервер явно сообщает клиенту о неподдерживаемости расширенного пассивного режима, платформа 1С мгновенно переключается на стандартную команду PASV без ожидания таймаута.
500 Unknown command или 502 Command not implemented, после чего 1С выполнит стандартный вход.pasv_address), чтобы клиенту возвращался корректный адрес для установки соединения данных.Если на межсетевом экране закрыты порты для расширенного пассивного режима, изменим действие по умолчанию для заблокированных пакетов:
DROP используем действие REJECT (с отправкой пакета TCP RST). В этом случае сокет со стороны 1С сразу получит сигнал о недоступности порта, не дожидаясь истечения общего сетевого таймаута.Если доступ к настройкам удаленного FTP-сервера и маршрутизатора отсутствует, штатный механизм FTPСоединение можно заменить вызовом консольной утилиты (например, curl или WinSCP), которая позволяет гибко управлять параметрами протокола.
Посмотрим на пример загрузки файла через утилиту curl с отключением расширенного пассивного режима с помощью параметра --no-epsv:
КомандаЗапуска = СтрШаблон(
"curl --no-epsv --passive-port -u ""%1:%2"" -T ""%3"" ""ftp://%4/%5""",
ПользовательFTP,
ПарольFTP,
ПутьКЛокальномуФайлу,
СерверFTP,
ИмяФайлаНаСервере
);
ЗапуститьПриложение(КомандаЗапуска, , Истина);
Проанализируем современный подход к межсистемной интеграции. Протокол FTP морально устарел, создает сложности при прохождении через NAT и требует открытия широкого диапазона динамических портов. Для надежного обмена данными рекомендуется использовать объект HTTPСоединение, отправляя файлы через REST API или WebDAV.
Рассмотрим пример отправки файла через HTTPСоединение:
Сервер = "api.myserver.com";
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение(Сервер, 443, Пользователь, Пароль, , , ЗащищенноеСоединение);
Запрос = Новый HTTPЗапрос("/files/upload/" + ИмяФайла);
Запрос.УстановитьИмяФайлаТела(ПутьКЛокальномуФайлу);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Если Ответ.КодСостояния = 200 ИЛИ Ответ.КодСостояния = 201 Тогда
// Файл успешно передан
КонецЕсли;
Использование протокола HTTPS исключает проблемы с таймаутами пассивных портов и обеспечивает защищенный и предсказуемый обмен данными в любых сетевых топологиях.