Нередко разработчики сталкиваются с ситуацией, когда код для работы с FTP в 1С прекрасно отрабатывает на локальной машине с прямым доступом в интернет, но перестает функционировать в корпоративной сети через прокси-сервер. Самое коварное в этой ситуации — отсутствие явных ошибок. Программа успешно проходит авторизацию, выполняет команду УстановитьТекущийКаталог() и даже Записать() возвращает значение Истина, однако физически файл на сервере не появляется. Разберем подробно, почему так происходит и как заставить обмен работать.
Для начала проанализируем, как работает протокол FTP. В отличие от HTTP, он использует два типа соединений: управляющее (для команд и авторизации) и канал передачи данных. Когда вы работаете через прокси-сервер, управляющее соединение часто проходит успешно, так как прокси понимает текстовые команды. Но как только дело доходит до передачи самого файла, прокси-сервер может заблокировать или некорректно перенаправить трафик данных.
Ситуация, когда 1С сообщает об успешной записи файла, хотя его нет на сервере, объясняется тем, что платформа передала пакет данных прокси-серверу и получила подтверждение от него, а не от конечного FTP-узла. Дальнейшая судьба файла на пути от прокси к серверу 1С уже "не видна".
Первое, что мы должны проверить — это режим работы FTP-соединения. В активном режиме сервер пытается сам инициировать соединение с клиентом, что практически всегда блокируется брандмауэрами и прокси-серверами. Для работы в корпоративной сети обязательно нужно использовать пассивный режим.
Рассмотрим пример правильной инициализации объекта FTPСоединение:
// Параметр ПассивныйРежим должен быть установлен в Истина
Прокси = Новый ИнтернетПрокси;
Прокси.Установить("ftp", АдресПрокси, ПортПрокси, ПользовательПрокси, ПарольПрокси);
Соединение = Новый FTPСоединение(
"ftp.example.com",
21,
"Логин",
"Пароль",
Прокси,
Истина // Вот этот параметр включает ПассивныйРежим
);
Проанализируем работу объекта ИнтернетПрокси. Многие совершают ошибку, настраивая только общие параметры прокси. Однако для протокола FTP в 1С важно явно указать параметры именно для этого протокола. Если ваш прокси-сервер является HTTP-прокси, он должен поддерживать метод CONNECT для туннелирования FTP-трафика.
Посмотрим, как правильно задать настройки в коде:
МойПрокси = Новый ИнтернетПрокси;
// Явно указываем протокол "ftp" при установке параметров
МойПрокси.Установить("ftp", "192.168.1.1", 8080, "proxy_user", "proxy_pass");
МойПрокси.НеИспользоватьПроксиДляАдресов.Добавить("127.0.0.1");
Важный момент для платформы 8.3.9: в этой версии наблюдались случаи некорректного кэширования настроек прокси. Если изменения в коде не помогают, попробуйте перезапустить сеанс или очистить кэш пользователя.
Если штатные средства 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, рассмотрим другие подходы:
HTTPСоединение). HTTP-протокол является "родным" для прокси-серверов, и такие соединения работают стабильнее..zip перед отправкой — это часто помогает обойти формальные запреты безопасности.Подводя итог, можно сказать: если авторизация проходит, а файл не пишется — ищите проблему в настройках пассивного режима и в способности вашего прокси-сервера пропускать бинарные данные через метод CONNECT. В самых сложных случаях не бойтесь использовать внешние утилиты, это сэкономит время и обеспечит стабильный результат.