Как исправить ошибку «unknown PASV reply» при выгрузке на FTP в 1С?

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

При настройке автоматического обмена данными через FTP-сервер в среде Windows 10 разработчики часто сталкиваются со специфической проблемой. Обработка, которая отлично работает при ручном запуске, начинает выдавать ошибку «unknown PASV reply» при выполнении через планировщик задач или регламентное задание. Ситуация осложняется тем, что стандартный проводник Windows или браузер могут успешно подключаться к этому же серверу без нареканий. Разберем детально, почему это происходит и как настроить стабильную выгрузку.

Выясним причину ошибки: почему 1С не понимает ответ сервера?

Ошибка «unknown PASV reply» (неизвестный ответ на команду PASV) возникает на этапе перехода FTP-соединения в пассивный режим. Когда 1С отправляет серверу команду PASV, сервер должен вернуть IP-адрес и номер порта, к которым клиент (1С) подключится для передачи данных. Если формат этого ответа отличается от стандарта или содержит некорректные данные, встроенный механизм платформы 1С не может его распознать.

Проанализируем основные факторы, влияющие на возникновение этой ошибки:

  1. Наличие NAT и подмена IP: Часто сервер находится за брандмауэром и сообщает 1С свой внутренний локальный IP-адрес (например, 192.168.x.x) вместо внешнего. Проводник Windows умеет игнорировать эту ошибку и подставлять адрес сервера автоматически, а объект FTPСоединение в 1С может «споткнуться» на этом этапе.
  2. Особенности Windows 10 (Session 0 Isolation): Задания планировщика работают в изолированной сессии, где сетевые фильтры брандмауэра могут работать жестче, чем при интерактивном входе пользователя.
  3. Stateful FTP Filtering: В современных версиях Windows включена динамическая фильтрация пакетов FTP, которая может изменять содержимое ответов сервера в целях безопасности, что делает их «нечитаемыми» для 1С.

Решение 1: Переключение режима соединения (Пассивный/Активный)

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

Попробуем явно указать использование пассивного режима в коде. Рассмотрим пример инициализации соединения:


// Пример создания соединения в пассивном режиме
АдресСервера = "ftp.example.com";
Порт = 21;
Пользователь = "Robot_1C";
Пароль = "StrongPassword";
Прокси = Неопределено;
ПассивныйРежим = Истина; // Установка этого флага часто решает проблему

Попытка
    Соединение = Новый FTPСоединение(АдресСервера, Порт, Пользователь, Пароль, Прокси, ПассивныйРежим);
    // Дальнейшая работа с файлами
Исключение
    ЗаписьЖурналаРегистрации("FTP.Ошибка", УровеньЖурналаРегистрации.Ошибка, , , ИнформацияОбОшибке().Описание);
КонецПопытки;

Если при значении Истина ошибка сохраняется, попробуем установить Ложь (активный режим). Однако помните, что для работы активного режима на стороне клиента (вашего компьютера) должны быть открыты входящие порты в брандмауэре.

Решение 2: Отключение Stateful FTP Filtering в Windows

Если программное переключение режимов не помогает, проанализируем настройки операционной системы. В Windows 10 есть функция, которая анализирует FTP-трафик на лету. Она часто становится причиной модификации ответов PASV, что и вызывает ошибку в 1С. Для исправления ситуации выполним следующие шаги:

  1. Запустим командную строку (CMD) от имени администратора.
  2. Введем следующую команду для отключения глобальной фильтрации FTP: netsh advfirewall set global StatefulFtp disabled
  3. Перезагрузим компьютер для применения изменений.

Эта настройка заставляет брандмауэр Windows пропускать FTP-ответы «как есть», не пытаясь их проинспектировать или изменить.

Решение 3: Использование внешней утилиты curl

Рассмотрим ситуацию, когда стандартный объект FTPСоединение продолжает работать нестабильно. В Windows 10 (начиная с версии 1803) встроена мощная консольная утилита curl.exe, которая гораздо лучше справляется со сложными сетевыми условиями, NAT и нестандартными ответами серверов. Мы можем вызвать её напрямую из 1С.

Разберем пример кода для выгрузки файла через curl:


ПутьКФайлу = "C:\Export\data.zip";
FTP_URL = "ftp://ftp.example.com/upload/data.zip";
ЛогинПароль = "user:password";

// Формируем строку запуска
// -T указывает файл для загрузки
// --user задает учетные данные
// -k игнорировать ошибки сертификата (если используется FTPS)
КомандаЗапуска = "curl -T """ + ПутьКФайлу + """ " + FTP_URL + " --user " + ЛогинПароль;

Попытка
    ЗапуститьПриложение(КомандаЗапуска, , Истина); // Ждем завершения
    Сообщить("Файл успешно отправлен через curl");
Исключение
    Сообщить("Ошибка при вызове внешней утилиты: " + ОписаниеОшибки());
КонецПопытки;

Использование curl или сторонних библиотек типа WinSCP часто является самым надежным решением для регламентных заданий, так как они имеют развитые механизмы логирования и повторных попыток при обрыве связи.

Решение 4: Настройка прав доступа для планировщика задач

Посмотрим на проблему со стороны прав доступа. Когда задача запускается из-под планировщика, она может выполняться под учетной записью SYSTEM или специального администратора. Проанализируем настройки задачи:

  1. Убедимся, что в свойствах задачи установлена галочка «Выполнять с наивысшими правами».
  2. Проверим наличие доступа у этого пользователя к временным папкам Windows (%TEMP%), так как 1С при формировании FTP-пакета создает временные файлы.
  3. Если используется прокси-сервер, убедимся, что настройки прокси прописаны для той учетной записи, под которой запускается задача планировщика (настройки IE/Edge для этого пользователя).

Подведем итог: ошибка «unknown PASV reply» — это чаще всего конфликт между строгим парсером 1С и сетевыми фильтрами Windows 10. Перевод соединения в явный пассивный режим ПассивныйРежим = Истина в сочетании с отключением StatefulFtp через netsh решает проблему в 90% случаев.

← На главную