При организации интеграции между 1С и внешними системами разработчики часто используют протокол FTP для обмена файлами. Это простой и проверенный временем способ передачи данных. Однако при написании кода для работы с объектом FTPСоединение можно столкнуться с неочевидными техническими проблемами. Две самые распространенные из них — это ошибка аутентификации «Access denied to remote resource» и ошибка инициализации передачи «Upload failed (at start/before it took off)». В качестве готовой альтернативы собственной интеграции можно использовать решение для автоматической выгрузки данных по FTP.
В этой статье мы подробно разберем, почему возникают эти сбои, как функционирует протокол передачи данных в среде 1С и как правильно спроектировать алгоритм выгрузки, чтобы избежать системных ошибок.
На первый взгляд, формулировка «Ошибка аутентификации при доступе к ресурсу» указывает на то, что введены неверные логин или пароль. Однако на практике авторизация на сервере к этому моменту уже успешно проходит. Платформа 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).
Проанализируем эти нюансы и перейдем ко второй типичной ошибке, которая часто возникает сразу после того, как разработчик пытается упростить путь записи.
Когда разработчик убирает сложную структуру папок и пытается записать файл напрямую в корень, например:
ftp.Записать(имяФайлИсточник, имяФайла);
Программа может выдать ошибку: «Ошибка работы с Интернет: ftp://... Upload failed (at start/before it took off)». Эта ошибка генерируется низкоуровневой сетевой библиотекой (libcurl), используемой платформой 1С. Она означает, что управляющее соединение по порту 21 успешно установлено, но при попытке открыть канал передачи данных произошел мгновенный разрыв связи.
Разберем основные сетевые и системные причины этого сбоя:
ftp = Новый FTPСоединение(FTPServer, FTPPort, Пользователь, Пароль, , Истина, TimeOut);
Истина включает пассивный режим (PASV). В этом режиме клиент просит сервер выделить случайный порт из динамического диапазона (обычно от 49152 до 65535) для передачи самого файла. Если сетевой экран (брандмауэр) на стороне клиента, провайдер или роутер блокирует исходящие соединения по этим случайным портам, передача обрывается «на старте».public_html, data или upload).databese.db) открыт в монопольном режиме другой программой или самой 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, рекомендуем выполнить следующие шаги для локализации сетевой проблемы:
Write (запись) и Create (создание директорий).Применение пошаговой структуры перехода по каталогам с помощью УстановитьТекущийКаталог гарантирует стабильность обмена данными и исключает возникновение неожиданных ошибок прав доступа. Для защиты от обрывов связи при передаче больших файлов можно использовать инструмент для передачи пакетов обмена по FTP с механизмом докачки.