Как исправить ошибки FTP-соединения «Access denied» и «Upload failed» в 1С:Предприятие?

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

При организации интеграции между 1С и внешними системами разработчики часто используют протокол FTP для обмена файлами. Это простой и проверенный временем способ передачи данных. Однако при написании кода для работы с объектом FTPСоединение можно столкнуться с неочевидными техническими проблемами. Две самые распространенные из них — это ошибка аутентификации «Access denied to remote resource» и ошибка инициализации передачи «Upload failed (at start/before it took off)». В качестве готовой альтернативы собственной интеграции можно использовать решение для автоматической выгрузки данных по FTP.

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

Анализируем первую ошибку: «Access denied to remote resource»

На первый взгляд, формулировка «Ошибка аутентификации при доступе к ресурсу» указывает на то, что введены неверные логин или пароль. Однако на практике авторизация на сервере к этому моменту уже успешно проходит. Платформа 1С интерпретирует стандартный ответ FTP-сервера 550 Access Denied универсальным образом, что часто путает разработчиков. Выясним истинные причины этой проблемы.

1. Отсутствие структуры папок на сервере

Рассмотрим исходную строку кода, вызывающую ошибку:


ftp.Записать( имяФайлИсточник, "/EKSP/" + Строка(Экспедитор.Код) + "/" + имяФайла );

Метод Записать встроенного языка 1С отправляет файл по указанному пути. Важно понимать: платформа не умеет автоматически создавать промежуточные папки на FTP-сервере. Если каталога EKSP или вложенного каталога с кодом экспедитора физически не существует в целевой директории, сервер вернет ошибку доступа, так как ему некуда физически положить файл.

2. Проблема лидирующего слэша (Абсолютный путь против Относительного)

Символ слэша / в начале пути "/EKSP/..." указывает серверу искать папку в корневой файловой системе операционной системы самого сервера. У рядового FTP-пользователя, как правило, права ограничены его домашней папкой (например, /home/user/ftp/). Попытка выйти за рамки выделенной «песочницы» мгновенно блокируется службой безопасности сервера с возвратом кода 550.

3. Ограничение прав учетной записи

Даже если папка существует, у учетной записи на FTP-сервере может стоять запрет на запись (Write) или на создание подкаталогов (Make Directory). Пользователь может обладать правами только на чтение (Read) и просмотр содержимого (List).

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

Анализируем вторую ошибку: «Upload failed (at start/before it took off)»

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

ftp.Записать(имяФайлИсточник, имяФайла);

Программа может выдать ошибку: «Ошибка работы с Интернет: ftp://... Upload failed (at start/before it took off)». Эта ошибка генерируется низкоуровневой сетевой библиотекой (libcurl), используемой платформой 1С. Она означает, что управляющее соединение по порту 21 успешно установлено, но при попытке открыть канал передачи данных произошел мгновенный разрыв связи.

Разберем основные сетевые и системные причины этого сбоя:

  1. Блокировка портов в пассивном режиме (Firewall / Роутер). При инициализации соединения в коде часто передается параметр пассивного режима:
    
    ftp = Новый FTPСоединение(FTPServer, FTPPort, Пользователь, Пароль, , Истина, TimeOut);
    
    Шестой параметр Истина включает пассивный режим (PASV). В этом режиме клиент просит сервер выделить случайный порт из динамического диапазона (обычно от 49152 до 65535) для передачи самого файла. Если сетевой экран (брандмауэр) на стороне клиента, провайдер или роутер блокирует исходящие соединения по этим случайным портам, передача обрывается «на старте».
  2. Запрет записи в корневой каталог FTP. На многих серверах (особенно публичных хостингах) из соображений безопасности запрещено записывать файлы непосредственно в корневую директорию. Запись разрешена только во вложенные папки, предназначенные для обмена (например, public_html, data или upload).
  3. Блокировка локального файла-источника. Если файл-источник (в примере автора это файл базы данных databese.db) открыт в монопольном режиме другой программой или самой 1С, операционная система не позволит сетевой библиотеке прочитать его для отправки. Это приводит к мгновенному падению потока передачи.
  4. Превышение дисковой квоты. Если на FTP-сервере для вашей учетной записи выделен лимит свободного места, и он исчерпан, сервер откажет в приеме файла в самый начальный момент передачи данных.

Решение проблемы: Пошаговый алгоритм и корректный код в 1С

Чтобы гарантировать стабильную работу выгрузки файлов на FTP, мы должны отказаться от передачи сложных путей напрямую в метод Записать. Правильный подход — это пошаговая навигация по каталогам с проверкой их существования и последовательным созданием структуры папок.

Разберем готовый шаблон кода, который решает обе проблемы:


// Шаг 1. Создаем FTP-соединение. 
// Поэкспериментируйте с шестым параметром (ПассивныйРежим). 
// Если пассивный режим (Истина) выдает ошибку, попробуйте передать Ложь (Активный режим).
ПассивныйРежим = Истина; 
Попытка
    ftp = Новый FTPСоединение(
        FTPServer, 
        FTPPort, 
        ПользовательТерминаля, 
        Пароль, 
        , 
        ПассивныйРежим, 
        TimeOut
    );
Исключение
    Сообщить("Не удалось установить соединение с FTP-сервером: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

// Переходим в корневой каталог, определенный для пользователя на сервере
ftp.УстановитьТекущийКаталог("/");

// Шаг 2. Пошагово проверяем и создаем папки
// Сначала проверим и создадим общую папку обмена "EKSP" (без ведущего слэша!)
ИмяПапкиОбмена = "EKSP";
Попытка
    ftp.УстановитьТекущийКаталог(ИмяПапкиОбмена);
Исключение
    // Сюда мы попадем, если папки нет. Пробуем ее создать.
    Попытка
        ftp.СоздатьКаталог(ИмяПапкиОбмена);
        ftp.УстановитьТекущийКаталог(ИмяПапкиОбмена);
    Исключение
        Сообщить("Не удалось создать каталог " + ИмяПапкиОбмена + ": " + ОписаниеОшибки());
        Возврат;
    КонецПопытки;
КонецПопытки;

// Теперь проверим и создадим персональную папку по коду экспедитора
КодЭкспедитора = СокрЛП(Строка(Экспедитор.Код));
Попытка
    ftp.УстановитьТекущийКаталог(КодЭкспедитора);
Исключение
    Попытка
        ftp.СоздатьКаталог(КодЭкспедитора);
        ftp.УстановитьТекущийКаталог(КодЭкспедитора);
    Исключение
        Сообщить("Не удалось создать персональный каталог: " + ОписаниеОшибки());
        Возврат;
    КонецПопытки;
КонецПопытки;

// Шаг 3. Записываем файл в уже установленный (текущий) каталог
// Вторым параметром передаем только имя сохраняемого файла, без путей!
Попытка
    ftp.Записать(имяФайлИсточник, имяФайла);
    Сообщить("Файл успешно загружен на FTP-сервер!");
Исключение
    Сообщить("Ошибка при отправке файла: " + ОписаниеОшибки());
КонецПопытки;

Чек-лист для диагностики сетевых неполадок

Если даже при использовании корректного кода вы продолжаете получать ошибку Upload failed, рекомендуем выполнить следующие шаги для локализации сетевой проблемы:

  1. Тест через сторонний клиент. Установите бесплатный FTP-клиент (например, FileZilla) на том же компьютере, где запускается сеанс 1С. Попробуйте подключиться с теми же учетными данными и вручную создать папку и скопировать файл. Если FileZilla выдает аналогичную ошибку — проблема на стороне настроек FTP-сервера или сетевого экрана вашей ОС.
  2. Проверка прав на запись. Убедитесь, что в свойствах вашей учетной записи на FTP-сервере включены разрешения Write (запись) и Create (создание директорий).
  3. Диагностика сетевого экрана (Брандмауэра). Попробуйте временно отключить локальный брандмауэр Windows или сторонний антивирус, чтобы исключить блокировку динамических портов, необходимых для пассивного режима FTP.
  4. Локальная блокировка файла. Перед отправкой файла в 1С убедитесь, что все операции записи в этот файл со стороны вашей конфигурации завершены, файлы закрыты, а транзакции зафиксированы.

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

← На главную