При переходе на платформу 1С:Предприятие 8.3 (начиная с версии 8.3.8) многие разработчики сталкиваются с тем, что привычный код для работы с FTP-серверами начинает выдавать ошибку «weird server reply». Особенно часто это происходит при вызове метода НайтиФайлы. Ситуация осложняется тем, что на старых версиях платформы (например, 8.1) этот же код с тем же сервером работал безупречно. Выясним причину такого поведения и разберем по шагам способы решения этой проблемы.
Основная причина кроется в смене внутреннего движка сетевых протоколов. В 8.3 1С перешла с использования системной библиотеки Windows (Wininet) на кроссплатформенную библиотеку libcurl. Сообщение «weird server reply» — это стандартный ответ libcurl, который означает, что ответ FTP-сервера не соответствует ожидаемому протоколу или содержит некорректные данные.
Проанализируем наиболее частую причину сбоя — конфликт режимов передачи данных. В активном режиме сервер пытается сам инициировать соединение с клиентом, что часто блокируется брандмауэрами или NAT. Переход в пассивный режим позволяет клиенту самому открывать порты для передачи данных.
Рассмотрим, как правильно инициализировать FTPСоединение с явным указанием пассивного режима. Шестой параметр конструктора отвечает именно за это:
// Параметры: Сервер, Порт, Пользователь, Пароль, Прокси, ПассивныйРежим
Соединение = Новый FTPСоединение("ftp.myserver.com", , "admin", "password", , Истина);
Попытка
МассивФайлов = Соединение.НайтиФайлы("/orders/", "*.zip");
Исключение
Сообщить("Ошибка поиска файлов: " + ОписаниеОшибки());
КонецПопытки;
Как показывает практика, установка значения Истина в параметре пассивного режима решает проблему в 90% случаев, так как это меняет логику согласования портов и делает соединение более устойчивым к настройкам сетевых экранов.
Посмотрим на особенности реализации метода НайтиФайлы. В версии 8.3 платформа может пытаться использовать современную команду MLSD для получения детализированного списка файлов вместо классической команды LIST. Если ваш FTP-сервер некорректно сообщает о поддержке расширений протокола, библиотека libcurl может получить «странный» ответ.
Если вы используете пустую строку в качестве маски, например НайтиФайлы(Каталог, ""), попробуйте заменить её на явную маску всех файлов:
// Вместо пустой строки используем маску
МассивФайлов = Соединение.НайтиФайлы(Каталог, "*");
// Или, если нужны все файлы с расширениями
МассивФайлов = Соединение.НайтиФайлы(Каталог, "*.*");
Использование конкретной маски может заставить систему переключиться на более стабильный алгоритм формирования списка, который сервер воспримет адекватно.
Проанализируем ситуацию, когда ошибка возникает не всегда, а периодически. Это часто связано с настройками безопасности самого FTP-сервера. 1С при выполнении операций поиска может быстро открывать и закрывать управляющие соединения. Если на сервере установлено жесткое ограничение на количество одновременных подключений с одного IP-адреса, сервер может внезапно разорвать сессию или прислать пустой пакет.
Разберем необходимые действия для системного администратора:
Это позволит платформе 1С корректно завершать операции поиска, не натыкаясь на блокировки со стороны защиты сервера.
Выясним более глубокие технические причины. Библиотека libcurl по умолчанию пытается использовать команду EPSV (Extended Passive Mode). Некоторые старые роутеры с функцией «FTP Inspection» некорректно модифицируют такие пакеты, что приводит к ошибке weird server reply.
Также стоит обратить внимание на кодировку. Если в именах файлов или путях присутствует кириллица, а сервер не поддерживает UTF-8 (команда OPTS UTF8 ON), ответ сервера может содержать битые символы. В этом случае 1С воспринимает поток данных как некорректный. Рекомендуется:
Часто причиной является «умная» фильтрация трафика. Антивирусное ПО или сетевые экраны (например, Cisco Fixup) могут анализировать FTP-трафик «на лету» и подменять IP-адреса внутри пакетов. Если такая модификация происходит с ошибкой (например, меняется длина пакета, но не пересчитывается контрольная сумма), клиент 1С выдаст ошибку протокола.
Для диагностики попробуйте временно отключить проверку сетевого трафика в антивирусе на стороне клиента или сервере. Если ошибка исчезнет, необходимо добавить исключение для процесса 1cv8.exe или настроить правила инспекции протоколов на сетевом оборудовании.
Подведем итог: для устранения ошибки в первую очередь включите пассивный режим в коде 1С, проверьте лимиты подключений на стороне сервера и убедитесь, что используемая маска поиска не провоцирует сервер на отправку нестандартных ответов.