Работа с внешними ресурсами через протокол FTP в 1С:Предприятии — стандартная задача, однако она часто сопровождается труднообъяснимыми ошибками. Бывают ситуации, когда соединение успешно устанавливается, авторизация проходит, список файлов читается, но при попытке вызвать методы СоздатьКаталог() или Записать() система выдает ошибку "Quote command returned error" или "Upload failed (at start/before it took off)". В этой статье мы подробно разберем, почему это происходит, особенно в средах виртуализации Hyper-V, и как решить проблему пошагово.
Рассмотрим типичную ситуацию. В коде 1С мы инициализируем объект FTPСоединение, передавая все необходимые параметры: адрес сервера, порт, логин и пароль. Проверка на этапе подключения не выявляет ошибок. Однако при выполнении следующего кода происходит сбой:
// Пример инициализации соединения
FTPСоединение = Новый FTPСоединение(
Параметры.Адрес,
Параметры.Порт,
Параметры.Логин,
Параметры.Пароль,
Прокси,
ПассивныйРежим,
Таймаут
);
// Ошибка возникает здесь
FTPСоединение.СоздатьКаталог("/new_folder");
Проанализируем симптомы: на одном компьютере (физическом) всё работает корректно, а на другом (виртуальном сервере под управлением Hyper-V) запись невозможна. При этом через сторонние клиенты, такие как Total Commander, операции выполняются успешно. Это первый признак того, что проблема кроется не в программном коде 1С, а в окружении, в котором запущена служба 1С:Предприятия.
Выясним важный нюанс: когда мы запускаем 1С в клиентском режиме, код может выполняться "НаКлиенте" (от имени текущего пользователя Windows) или "НаСервере" (от имени учетной записи, под которой запущен "Агент сервера 1С:Предприятия"). Чаще всего это системная запись USR1CV8.
Рассмотрим, почему это критично для FTP:
Temp. Если у учетной записи USR1CV8 нет прав на запись в системные временные каталоги или к папке профиля пользователя, метод Записать() упадет с ошибкой "Upload failed" еще до начала передачи данных.Решение: Проверьте, под какой учетной записью работает сервер 1С. Попробуйте временно запустить службу от имени администратора. Если работа восстановится — необходимо настроить права доступа для USR1CV8 к папкам C:\Windows\Temp и папкам платформы.
Протокол FTP использует два типа соединений: управляющее (порт 21) и соединение для передачи данных. В пассивном режиме (который рекомендуется для большинства современных сетей) сервер сообщает клиенту случайный порт из высокого диапазона (например, 49152–65535), по которому будет передаваться файл или список файлов.
Проанализируем ситуацию: если на сервере или в виртуальной машине открыт только порт 21, то команда AUTH и USER пройдут успешно, но любая попытка передать данные (включая создание каталога MKD) потребует открытия нового порта. Если файервол блокирует этот динамический диапазон на исходящий трафик, 1С вернет ошибку.
Решение: Убедитесь, что в настройках FTPСоединение параметр ПассивноеСоединение установлен в значение Истина. Также проверьте настройки брандмауэра Windows и убедитесь, что приложению 1cv8.exe (или rphost.exe для сервера) разрешена любая сетевая активность по любым портам.
Если проблема наблюдается только на виртуальной машине, следует обратить внимание на специфические настройки сетевого адаптера Hyper-V. Существует известная проблема с функцией Large Send Offload (LSO).
Суть проблемы: LSO позволяет сетевой карте самостоятельно разбивать большие пакеты данных на сегменты. Однако драйверы виртуальных адаптеров Hyper-V иногда некорректно обрабатывают пакеты, содержащие специфические команды протоколов (например, FTP Quote команды). Это приводит к повреждению пакета, и FTP-сервер отвечает ошибкой 550 Access is denied, хотя права на самом деле есть.
Разберем по шагам, как это исправить:
IPv4 Giant Send Offload и Large Send Offload V2 (IPv4).Disabled (Выключено).Современные FTP-серверы часто требуют использования шифрования (FTPS). Если в конструкторе FTPСоединение вы используете объект ЗащищенноеСоединениеOpenSSL, платформа 1С обращается к библиотекам в своей папке bin.
Посмотрим на пример кода с настройкой защиты:
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(
Неопределено,
Новый СертификатыУдостоверяющихЦентровWindows()
);
УровеньЗащиты = УровеньИспользованияЗащищенногоСоединенияFTP.Требовать;
FTPСоединение = Новый FTPСоединение(
Адрес, Порт, Логин, Пароль,
Прокси, Истина, Таймаут,
ЗащищенноеСоединение,
УровеньЗащиты
);
Если вы получаете ошибку "Requested SSL level failed", это означает, что версия OpenSSL в вашей платформе 1С (например, 8.3.14) не может договориться с сервером о протоколе шифрования (например, сервер требует TLS 1.2, а старая платформа пытается использовать TLS 1.0). Также распространенной проблемой является устаревший файл сертификатов cacert.pem в папке 1С.
Рекомендация: Попробуйте обновить платформу 1С до актуальной версии или заменить файл cacert.pem в каталоге bin на более свежий, скачанный с официального сайта curl.
Если вы загружаете файлы на бесплатные или специфические хостинги, такие как Ucoz, помните о структуре папок. Часто корень сервера (/) закрыт для записи. Попытка выполнить FTPСоединение.СоздатьКаталог("/myfolder") вернет ошибку 550, потому что запись разрешена только внутри папки /web/ или другой пользовательской директории.
Как проверить: Сначала выполните команду FTPСоединение.УстановитьТекущийКаталог() в ту папку, которую вам выдал хостинг-провайдер, и только потом создавайте подкаталоги, используя относительные пути (без начального слеша).
Если 1С продолжает выдавать невнятную ошибку, воспользуемся мощным инструментом диагностики — утилитой curl, которая встроена в современные версии Windows. Запустите командную строку на проблемном сервере и выполните команду:
curl -v -u login:password ftp://your-site.com/ --ftp-create-dirs -Q "MKD test_dir"
Внимательно изучите лог:
Connect data stream passively и зависание — значит, закрыты порты для передачи данных.550 Access is denied в ответ на MKD — значит, проблема либо в реальных правах на сервере, либо в искажении пакетов (вспоминаем про LSO в Hyper-V).QUOT string not accepted — сервер не поддерживает стандартную команду создания каталога в текущем контексте.Подведем итог нашего анализа. Если FTPСоединение в 1С ведет себя нестабильно:
.pem.Следуя этим шагам, вы сможете локализовать проблему и обеспечить стабильную выгрузку данных из 1С на любой внешний ресурс.