Почему медленно работает FTPСоединение в 1С и как устранить задержки при передаче файлов

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе с протоколом FTP в платформе 1С:Предприятие разработчики нередко сталкиваются с ситуацией, когда инициализация объекта FTPСоединение и выполнение любых базовых операций (получение списка файлов, переход по каталогам, запись файлов) происходят крайне медленно. Задержки могут достигать от десятков секунд до нескольких минут на каждую операцию. Разберем по шагам, почему возникает эта проблема и какие существуют способы ее решения.

Причина проблемы: особенности работы расширенного пассивного режима (EPSV)

Проанализируем сетевую модель взаимодействия 1С с FTP-сервером. Когда клиентское приложение находится за NAT, использование активного режима FTP становится невозможным, и соединение переводится в пассивный режим. Внутренний механизм платформы 1С, отвечающий за работу с FTP, при установке пассивного соединения по умолчанию отправляет серверу команду расширенного пассивного режима EPSV (Extended Passive Mode), описанную в RFC 2428.

Если между клиентом 1С и FTP-сервером установлен межсетевой экран (фаервол), который фильтрует порты и настроен на молчаливый сброс пакетов (правило DROP), происходит следующее:

  1. Объект FTPСоединение отправляет серверу команду EPSV и ожидает ответа.
  2. Фаервол блокирует пакеты без отправки ответа клиенту.
  3. Платформа 1С ждет завершения полного системного TCP-таймаута.
  4. После истечения таймаута платформа выполняет откат (fallback) к стандартному пассивному режиму с помощью команды PASV.
  5. Операция успешно завершается, но из-за ожидания таймаута каждая команда занимает значительное время.

Важно учитывать, что встроенный объект FTPСоединение не содержит штатных свойств или параметров в строке подключения для принудительного отключения режима EPSV. Рассмотрим подробнее способы устранения задержек как на уровне инфраструктуры, так и на уровне прикладного кода 1С.

Решение 1. Настройка конфигурации FTP-сервера

Самый эффективный способ решения проблемы без изменения конфигурации 1С — корректировка параметров службы FTP на сервере. Если сервер явно сообщает клиенту о неподдерживаемости расширенного пассивного режима, платформа 1С мгновенно переключается на стандартную команду PASV без ожидания таймаута.

  1. Отключение команды EPSV: В конфигурационных файлах FTP-демонов (таких как ProFTPD, vsftpd, Pure-FTPd) можно принудительно отключить обработку EPSV. Сервер сразу вернет код 500 Unknown command или 502 Command not implemented, после чего 1С выполнит стандартный вход.
  2. Ограничение диапазона пассивных портов: Задайте фиксированный пул портов для пассивного режима (Passive Port Range) и откройте этот же диапазон на всех сетевых экранах и маршрутизаторах.
  3. Настройка внешнего IP-адреса (Masquerading): Если FTP-сервер расположен за NAT, укажите его реальный белый IP-адрес в параметрах сервера (например, pasv_address), чтобы клиенту возвращался корректный адрес для установки соединения данных.

Решение 2. Корректировка правил сетевого экрана (Фаервола)

Если на межсетевом экране закрыты порты для расширенного пассивного режима, изменим действие по умолчанию для заблокированных пакетов:

  1. Вместо политики сброса пакетов DROP используем действие REJECT (с отправкой пакета TCP RST). В этом случае сокет со стороны 1С сразу получит сигнал о недоступности порта, не дожидаясь истечения общего сетевого таймаута.
  2. Пробросим на фаерволе весь настроенный диапазон пассивных портов до целевого сервера.

Решение 3. Использование внешних утилит при невозможности изменить настройки сервера

Если доступ к настройкам удаленного FTP-сервера и маршрутизатора отсутствует, штатный механизм FTPСоединение можно заменить вызовом консольной утилиты (например, curl или WinSCP), которая позволяет гибко управлять параметрами протокола.

Посмотрим на пример загрузки файла через утилиту curl с отключением расширенного пассивного режима с помощью параметра --no-epsv:


КомандаЗапуска = СтрШаблон(
    "curl --no-epsv --passive-port -u ""%1:%2"" -T ""%3"" ""ftp://%4/%5""",
    ПользовательFTP,
    ПарольFTP,
    ПутьКЛокальномуФайлу,
    СерверFTP,
    ИмяФайлаНаСервере
);

ЗапуститьПриложение(КомандаЗапуска, , Истина);

Решение 4. Переход на протокол HTTP/HTTPS

Проанализируем современный подход к межсистемной интеграции. Протокол FTP морально устарел, создает сложности при прохождении через NAT и требует открытия широкого диапазона динамических портов. Для надежного обмена данными рекомендуется использовать объект HTTPСоединение, отправляя файлы через REST API или WebDAV.

Рассмотрим пример отправки файла через HTTPСоединение:


Сервер = "api.myserver.com";
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение(Сервер, 443, Пользователь, Пароль, , , ЗащищенноеСоединение);

Запрос = Новый HTTPЗапрос("/files/upload/" + ИмяФайла);
Запрос.УстановитьИмяФайлаТела(ПутьКЛокальномуФайлу);

Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Если Ответ.КодСостояния = 200 ИЛИ Ответ.КодСостояния = 201 Тогда
    // Файл успешно передан
КонецЕсли;

Использование протокола HTTPS исключает проблемы с таймаутами пассивных портов и обеспечивает защищенный и предсказуемый обмен данными в любых сетевых топологиях.

← На главную