Как исправить ошибку Access denied to remote resource при записи файла на FTP из 1С

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

Работа с внешними ресурсами через протокол FTP в 1С:Предприятие — задача стандартная, но часто сопровождающаяся трудностями в диагностике прав доступа. Ошибка «Access denied to remote resource» при использовании объекта FTPСоединение может возникнуть на разных этапах: при попытке смены каталога, записи файла или даже получении списка файлов. Рассмотрим подробнее, почему это происходит и как мы можем совместно решить эту проблему, проанализировав технические нюансы настройки сервера и кода 1С.

Разберем основную причину: Особенности путей в среде Chroot

Одной из самых частых причин ошибки Access denied является указание полного системного пути Linux вместо пути относительно корня FTP-пользователя. Проанализируем ситуацию: в конфигурационных файлах большинства FTP-серверов (таких как vsftpd или ProFTPD) включена опция chroot_local_user. Это означает, что при подключении пользователь «запирается» в своей домашней директории, которая становится для него корневой — /.

Если в коде 1С вы указываете путь вида /var/www/www-root/data/www/akcik.ru/import1c/, сервер воспринимает это как попытку выйти за пределы разрешенной директории. Поскольку для FTP-сессии папок выше корня не существует, сервер возвращает отказ в доступе. Выясним причину через проверку относительного пути.

Решение: Попробуйте указать путь от корневой папки, которую видит пользователь при входе через обычный FTP-клиент (например, FileZilla). Вместо полного пути используйте:


// Вместо полного системного пути
ФТП.УстановитьТекущийКаталог("/import1c/");
// Или даже без лидирующего слэша
ФТП.УстановитьТекущийКаталог("import1c/");

Проанализируем влияние регистра символов

В операционных системах семейства Linux (где чаще всего и располагаются веб-серверы) регистр символов в именах файлов и папок имеет критическое значение. Для Windows-системы файлы Obmen.csv и obmen.csv — это один и тот же файл, но для Linux это два разных объекта. Если в коде 1С вы указываете путь /Import1C/, а на сервере папка называется /import1c/, вы получите ошибку доступа, так как объект по указанному пути просто не будет найден.

Рассмотрим рекомендации по именованию:

Настройка пассивного режима и брандмауэра

Ошибка доступа может возникать не из-за логических прав, а из-за невозможности открыть канал передачи данных. В протоколе FTP существует два режима: активный и пассивный. В современных сетях, где клиент (сервер 1С) часто находится за NAT или брандмауэром, рекомендуется использовать пассивный режим.

В конструкторе объекта FTPСоединение шестой параметр отвечает за использование пассивного режима. Убедитесь, что он установлен в значение Истина:


// Параметры: Адрес, Порт, Пользователь, Пароль, Прокси, ПассивныйРежим
ФТП = Новый FTPСоединение("37.48.хх.ххх", 21, "логин", "пароль", , Истина);

Важно помнить: даже если установлен пассивный режим, на стороне сервера должен быть открыт диапазон портов для данных. Если соединение устанавливается, но Записать() выдает ошибку — скорее всего, закрыты порты для передачи содержимого файла.

Проверим права системной учетной записи 1С

Если ваш код выполняется «НаСервере», стоит помнить, что инициатором обращения к локальному файлу выступает не ваш текущий пользователь Windows, а учетная запись, под которой запущена служба «Агент сервера 1С:Предприятие» (обычно USR1CV8).

Проанализируем ситуацию: если файл c:\Temp\обмен\ОстаткиИЦены.csv лежит в папке, к которой у пользователя USR1CV8 нет прав на чтение, 1С может выдать ошибку доступа, которая иногда ошибочно интерпретируется как проблема на стороне FTP. Убедитесь, что у службы 1С есть полные права на папку с исходным файлом.

Пример правильной реализации кода

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


// Подключаемся к серверу
Попытка
    ФТП = Новый FTPСоединение("37.48.хх.ххх", 21, "логин", "пароль", , Истина, 15);
Исключение
    Сообщить("Не удалось подключиться к FTP: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

// Проверяем наличие локального файла
ЛокальныйФайл = Новый Файл("c:\Temp\обмен\ОстаткиИЦены.csv");
Если Не ЛокальныйФайл.Существует() Тогда
    Сообщить("Файл-источник не найден!");
    Возврат;
КонецЕсли;

// Устанавливаем каталог и записываем файл
Попытка
    // Используем путь относительно домашней директории FTP-пользователя
    ПутьНаСервере = "import1c/"; 
    ФТП.УстановитьТекущийКаталог(ПутьНаСервере);
    
    // Записываем файл, используя только имя файла для целевого пути
    ФТП.Записать(ЛокальныйФайл.ПолноеИмя, ЛокальныйФайл.Имя);
    Сообщить("Файл успешно загружен на FTP.");
Исключение
    Сообщить("Ошибка при записи файла: " + ОписаниеОшибки());
КонецПопытки;

Дополнительные рекомендации по диагностике

  1. Использование внешних утилит: Попробуйте подключиться к этому же FTP через командную строку Windows или клиент FileZilla под теми же учетными данными. Выполните команду pwd (print working directory), чтобы увидеть реальный путь, в котором вы находитесь после логина.
  2. Логи сервера: Если у вас есть доступ к серверу (или возможность связаться с администратором), посмотрите логи FTP-сервиса. Ошибка 550 Permission denied или 553 Could not create file в логах сервера даст гораздо больше информации, чем общее сообщение в 1С.
  3. Место на диске: Проверьте, не исчерпана ли квота дискового пространства для данного FTP-пользователя. Иногда отказ в доступе на запись — это просто следствие отсутствия свободного места.
  4. Защищенное соединение: Если сервер требует FTPS (FTP через SSL/TLS), обычный FTPСоединение без параметров защиты не сможет корректно завершить операцию записи. В этом случае необходимо создать объект ЗащищенноеСоединениеOpenSSL и передать его в конструктор.

Таким образом, для решения проблемы «Access denied to remote resource» нам необходимо последовательно исключить ошибки в путях (регистр и chroot), проверить режим соединения (пассивный) и убедиться в достаточности прав как на стороне FTP-сервера, так и для службы 1С на локальном сервере.

← На главную