Как правильно записать файл на FTP-сервер в 1С и избежать ошибки Upload failed?

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

При разработке механизмов обмена данными часто возникает необходимость выгрузки файлов на удаленный FTP-сервер. Одной из самых распространенных проблем, с которой сталкиваются программисты 1С, является ошибка "Ошибка работы с Интернет: Upload failed (at start/before it took off)". На первый взгляд код может казаться верным, а сторонние клиенты (например, FileZilla) успешно выполняют операцию, но встроенные средства платформы выдают отказ. В этой статье мы подробно разберем, как правильно использовать объект FTPСоединение, проанализируем типичные ошибки в синтаксисе и рассмотрим дополнительные настройки, влияющие на стабильность передачи данных.

Разбор основной причины ошибки: путаница в параметрах метода Записать

Проанализируем ситуацию, описанную в теме. Основная ошибка заключалась в попытке передать путь к целевой директории непосредственно в метод Записать (Put). Согласно синтаксис-помощнику 1С, метод Записать принимает два обязательных строковых параметра:

  1. Путь к источнику: полный путь к файлу на локальном диске или в сетевой папке, который мы хотим отправить.
  2. Имя выходного файла: именно имя файла, под которым он сохранится на сервере, а не путь к папке.

Если во втором параметре указать путь вида "/test", сервер может воспринять это как попытку переименовать файл в имя, совпадающее с названием существующей директории, или просто отклонить команду из-за некорректного формата. Чтобы избежать этой ошибки, мы должны четко разделять навигацию по серверу и саму передачу данных.

Правильный алгоритм выгрузки файла

Рассмотрим пошагово, как должен выглядеть надежный код для записи файла на FTP. Вместо того чтобы пытаться указать путь в методе Записать, мы сначала переходим в нужную папку с помощью метода УстановитьТекущийКаталог.

Пример исправленного рабочего кода:


&НаСервере
Процедура СохранитьНаСервере()
    
    // 1. Создаем объект соединения
    // Параметры: Сервер, Порт, Логин, Пароль, Прокси, ПассивныйРежим, Таймаут
    Соединение = Новый FTPСоединение("ftp.myserver.ru", 21, "admin", "password123", , Истина, 30);
    
    Попытка
        // 2. Переходим в целевую директорию на FTP
        ПутьНаСервере = "/upload/documents";
        Соединение.УстановитьТекущийКаталог(ПутьНаСервере);
        
        // 3. Указываем локальный файл и имя файла для сохранения
        ИмяЛокальногоФайла = "C:\Temp\report.pdf";
        ИмяФайлаНаСервере = "report_2023.pdf";
        
        // Выполняем запись
        Соединение.Записать(ИмяЛокальногоФайла, ИмяФайлаНаСервере);
        
        Сообщить("Файл успешно загружен!");
    Исключение
        // Обработка ошибок (отсутствие прав, обрыв связи и т.д.)
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
    КонецПопытки;

КонецПроцедуры

Важность пассивного режима (Passive Mode)

Одной из скрытых причин ошибки "Upload failed" является использование активного режима передачи данных по умолчанию. В активном режиме сервер инициирует соединение с клиентом для передачи данных, что часто блокируется брандмауэрами (файрволами) или NAT в корпоративных сетях.

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

Настройка таймаутов для стабильной работы

В исходном сообщении форума был указан таймаут 3 секунды. Проанализируем, почему это может быть критично. Если файл имеет размер более нескольких килобайт или интернет-канал загружен, 3 секунд может быть недостаточно даже для инициализации сессии записи. Система прерывает поток, и мы получаем ошибку состояния.

Для стабильной работы рекомендуется устанавливать значение таймаута в диапазоне от 30 до 90 секунд, в зависимости от объема передаваемых данных и качества связи. Это седьмой параметр конструктора:

Соединение = Новый FTPСоединение(Сервер, 21, Пользователь, Пароль, , Истина, 60);

Проблемы прав доступа на уровне ОС и сервера 1С

Если база 1С работает в клиент-серверном варианте, крайне важно понимать, что код &НаСервере выполняется от имени пользователя Windows, под которым запущен процесс rphost (обычно это USR1CV8).

Проверим следующие моменты:

  1. Имеет ли пользователь USR1CV8 права на чтение локального файла, который вы пытаетесь загрузить (например, с рабочего стола другого пользователя)?
  2. Достаточно ли прав у FTP-аккаунта не только на чтение списка файлов, но и на создание новых объектов в указанной директории? Попробуйте создать файл в этой папке вручную через FileZilla, используя те же учетные данные.
  3. Если сервер работает на ОС Linux, помните, что пути /Test и /test — это разные каталоги.

Работа с кодировками и кириллицей в именах

Нередко запись файла завершается ошибкой, если в имени файла или пути содержатся русские буквы. Стандарт FTP исторически плохо поддерживает Unicode. Если вы столкнулись с тем, что латинские имена загружаются, а кириллические — нет, попробуйте следующее решение:

Перед записью файла можно попытаться отправить серверу команду на включение поддержки UTF-8 (если сервер её поддерживает):

Соединение.ВыполнитьКоманду("OPTS UTF8 ON");

Однако лучшей практикой в программировании 1С считается предварительная транслитерация имен файлов перед отправкой на внешние ресурсы, чтобы исключить зависимость от настроек кодировки конкретного FTP-сервера.

Особенности протоколов: FTP vs SFTP

Важно не путать FTP/FTPS и SFTP. Объект FTPСоединение в 1С поддерживает работу по протоколу FTP и защищенному FTPS (через SSL). Однако он не работает с протоколом SFTP (который работает через SSH, обычно на 22 порту). Если ваш сервер требует именно SFTP, стандартный метод Записать работать не будет. В таком случае рассмотрите использование внешних компонент или запуск консольных утилит типа WinSCP или curl через команду ЗапуститьПриложение.

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

Для успешной записи файла на FTP в 1С всегда следуйте этим правилам:

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

← На главную