Почему файл не записывается на FTP из 1С при работе через прокси-сервер?

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

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

Выясняем причину: разделение каналов FTP

Для начала проанализируем, как работает протокол FTP. В отличие от HTTP, он использует два типа соединений: управляющее (для команд и авторизации) и канал передачи данных. Когда вы работаете через прокси-сервер, управляющее соединение часто проходит успешно, так как прокси понимает текстовые команды. Но как только дело доходит до передачи самого файла, прокси-сервер может заблокировать или некорректно перенаправить трафик данных.

Ситуация, когда 1С сообщает об успешной записи файла, хотя его нет на сервере, объясняется тем, что платформа передала пакет данных прокси-серверу и получила подтверждение от него, а не от конечного FTP-узла. Дальнейшая судьба файла на пути от прокси к серверу 1С уже "не видна".

Шаг 1. Настройка пассивного режима

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

Рассмотрим пример правильной инициализации объекта FTPСоединение:


// Параметр ПассивныйРежим должен быть установлен в Истина
Прокси = Новый ИнтернетПрокси;
Прокси.Установить("ftp", АдресПрокси, ПортПрокси, ПользовательПрокси, ПарольПрокси);

Соединение = Новый FTPСоединение(
    "ftp.example.com", 
    21, 
    "Логин", 
    "Пароль", 
    Прокси, 
    Истина // Вот этот параметр включает ПассивныйРежим
);

Шаг 2. Особенности настройки ИнтернетПрокси

Проанализируем работу объекта ИнтернетПрокси. Многие совершают ошибку, настраивая только общие параметры прокси. Однако для протокола FTP в 1С важно явно указать параметры именно для этого протокола. Если ваш прокси-сервер является HTTP-прокси, он должен поддерживать метод CONNECT для туннелирования FTP-трафика.

Посмотрим, как правильно задать настройки в коде:


МойПрокси = Новый ИнтернетПрокси;
// Явно указываем протокол "ftp" при установке параметров
МойПрокси.Установить("ftp", "192.168.1.1", 8080, "proxy_user", "proxy_pass");
МойПрокси.НеИспользоватьПроксиДляАдресов.Добавить("127.0.0.1");

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

Шаг 3. Использование системных утилит (cURL или WinSCP)

Если штатные средства 1С FTPСоединение не справляются с особенностями вашего прокси-сервера (например, требуется специфическая NTLM-авторизация), наиболее надежным выходом будет использование проверенных консольных утилит. Такие инструменты, как cURL, имеют гораздо более мощные механизмы обхода прокси.

Разберем, как реализовать отправку файла через ЗапуститьПриложение():


КомандаЗапуска = "curl.exe -T ""C:\temp\file.txt"" ftp://ftp.example.com --user login:pass -x http://proxy_user:proxy_pass@192.168.1.1:8080";
ЗапуститьПриложение(КомандаЗапуска, , Истина);

Этот метод хорош тем, что cURL умеет работать с SOCKS4/5 и различными методами аутентификации, которые могут быть недоступны во встроенном объекте 1С версии 8.3.9.

Альтернативные варианты решения

Если проблему не удается решить на уровне настроек FTP, рассмотрим другие подходы:

  1. Переход на HTTP POST: Если у вас есть доступ к принимающей стороне, замените FTP-загрузку на передачу файла через HTTP-запрос (объект HTTPСоединение). HTTP-протокол является "родным" для прокси-серверов, и такие соединения работают стабильнее.
  2. SOCKS-прокси: Попробуйте использовать SOCKS-протокол вместо HTTP-прокси, если это позволяет инфраструктура. SOCKS прозрачно пропускает любой TCP-трафик, и 1С работает с ним гораздо лучше.
  3. Архивация: Иногда внутренние фильтры прокси блокируют файлы по расширению. Попробуйте упаковать файл в .zip перед отправкой — это часто помогает обойти формальные запреты безопасности.

Подводя итог, можно сказать: если авторизация проходит, а файл не пишется — ищите проблему в настройках пассивного режима и в способности вашего прокси-сервера пропускать бинарные данные через метод CONNECT. В самых сложных случаях не бойтесь использовать внешние утилиты, это сэкономит время и обеспечит стабильный результат.

← На главную