Почему FTPСоединение устанавливается, но не создаются каталоги и не загружаются файлы: разбираемся в причинах

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

Работа с внешними ресурсами через протокол 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: Права доступа учетной записи службы 1С

Выясним важный нюанс: когда мы запускаем 1С в клиентском режиме, код может выполняться "НаКлиенте" (от имени текущего пользователя Windows) или "НаСервере" (от имени учетной записи, под которой запущен "Агент сервера 1С:Предприятия"). Чаще всего это системная запись USR1CV8.

Рассмотрим, почему это критично для FTP:

  1. Временные файлы: Перед отправкой файла на FTP платформа 1С часто создает временную копию в папке Temp. Если у учетной записи USR1CV8 нет прав на запись в системные временные каталоги или к папке профиля пользователя, метод Записать() упадет с ошибкой "Upload failed" еще до начала передачи данных.
  2. Доступ к сетевым сокетам: В некоторых политиках безопасности Windows Server права на инициацию определенных сетевых запросов могут быть ограничены для сервисных учетных записей.

Решение: Проверьте, под какой учетной записью работает сервер 1С. Попробуйте временно запустить службу от имени администратора. Если работа восстановится — необходимо настроить права доступа для USR1CV8 к папкам C:\Windows\Temp и папкам платформы.

Причина 2: Пассивный режим и динамические порты

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

Проанализируем ситуацию: если на сервере или в виртуальной машине открыт только порт 21, то команда AUTH и USER пройдут успешно, но любая попытка передать данные (включая создание каталога MKD) потребует открытия нового порта. Если файервол блокирует этот динамический диапазон на исходящий трафик, 1С вернет ошибку.

Решение: Убедитесь, что в настройках FTPСоединение параметр ПассивноеСоединение установлен в значение Истина. Также проверьте настройки брандмауэра Windows и убедитесь, что приложению 1cv8.exe (или rphost.exe для сервера) разрешена любая сетевая активность по любым портам.

Причина 3: Особенности виртуализации Hyper-V и сетевой карты

Если проблема наблюдается только на виртуальной машине, следует обратить внимание на специфические настройки сетевого адаптера Hyper-V. Существует известная проблема с функцией Large Send Offload (LSO).

Суть проблемы: LSO позволяет сетевой карте самостоятельно разбивать большие пакеты данных на сегменты. Однако драйверы виртуальных адаптеров Hyper-V иногда некорректно обрабатывают пакеты, содержащие специфические команды протоколов (например, FTP Quote команды). Это приводит к повреждению пакета, и FTP-сервер отвечает ошибкой 550 Access is denied, хотя права на самом деле есть.

Разберем по шагам, как это исправить:

  1. Зайдите в "Диспетчер устройств" на виртуальной машине.
  2. Найдите ваш сетевой адаптер в разделе "Сетевые адаптеры".
  3. Перейдите в "Свойства" -> вкладка "Дополнительно".
  4. Найдите параметры IPv4 Giant Send Offload и Large Send Offload V2 (IPv4).
  5. Установите их значение в Disabled (Выключено).

Причина 4: Конфликты OpenSSL и защищенного соединения

Современные 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.

Причина 5: Специфика хостинга (на примере Ucoz)

Если вы загружаете файлы на бесплатные или специфические хостинги, такие как Ucoz, помните о структуре папок. Часто корень сервера (/) закрыт для записи. Попытка выполнить FTPСоединение.СоздатьКаталог("/myfolder") вернет ошибку 550, потому что запись разрешена только внутри папки /web/ или другой пользовательской директории.

Как проверить: Сначала выполните команду FTPСоединение.УстановитьТекущийКаталог() в ту папку, которую вам выдал хостинг-провайдер, и только потом создавайте подкаталоги, используя относительные пути (без начального слеша).

Диагностика через cURL

Если 1С продолжает выдавать невнятную ошибку, воспользуемся мощным инструментом диагностики — утилитой curl, которая встроена в современные версии Windows. Запустите командную строку на проблемном сервере и выполните команду:

curl -v -u login:password ftp://your-site.com/ --ftp-create-dirs -Q "MKD test_dir"

Внимательно изучите лог:

Итоги и рекомендации

Подведем итог нашего анализа. Если FTPСоединение в 1С ведет себя нестабильно:

  1. Проверьте права: Убедитесь, что служба сервера 1С имеет доступ к сети и временным папкам.
  2. Настройте сетевой стек: На виртуальных машинах Hyper-V обязательно отключите Large Send Offload (LSO).
  3. Используйте пассивный режим: Это снимет большинство проблем с прохождением трафика через роутеры и файерволы.
  4. Обновите сертификаты: Если используете FTPS, следите за актуальностью OpenSSL и файлов .pem.
  5. Проверяйте пути: Избегайте создания папок в корне, если это не разрешено политикой хостинга.

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

← На главную