Работа с внешними ресурсами через протокол FTP в 1С:Предприятие — задача стандартная, но часто сопровождающаяся трудностями в диагностике прав доступа. Ошибка «Access denied to remote resource» при использовании объекта FTPСоединение может возникнуть на разных этапах: при попытке смены каталога, записи файла или даже получении списка файлов. Рассмотрим подробнее, почему это происходит и как мы можем совместно решить эту проблему, проанализировав технические нюансы настройки сервера и кода 1С.
Одной из самых частых причин ошибки 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/, вы получите ошибку доступа, так как объект по указанному пути просто не будет найден.
Рассмотрим рекомендации по именованию:
/var/www/... реальному положению дел на сервере.Ошибка доступа может возникать не из-за логических прав, а из-за невозможности открыть канал передачи данных. В протоколе FTP существует два режима: активный и пассивный. В современных сетях, где клиент (сервер 1С) часто находится за NAT или брандмауэром, рекомендуется использовать пассивный режим.
В конструкторе объекта FTPСоединение шестой параметр отвечает за использование пассивного режима. Убедитесь, что он установлен в значение Истина:
// Параметры: Адрес, Порт, Пользователь, Пароль, Прокси, ПассивныйРежим
ФТП = Новый FTPСоединение("37.48.хх.ххх", 21, "логин", "пароль", , Истина);
Важно помнить: даже если установлен пассивный режим, на стороне сервера должен быть открыт диапазон портов для данных. Если соединение устанавливается, но Записать() выдает ошибку — скорее всего, закрыты порты для передачи содержимого файла.
Если ваш код выполняется «НаСервере», стоит помнить, что инициатором обращения к локальному файлу выступает не ваш текущий пользователь Windows, а учетная запись, под которой запущена служба «Агент сервера 1С:Предприятие» (обычно USR1CV8).
Проанализируем ситуацию: если файл c:\Temp\обмен\ОстаткиИЦены.csv лежит в папке, к которой у пользователя USR1CV8 нет прав на чтение, 1С может выдать ошибку доступа, которая иногда ошибочно интерпретируется как проблема на стороне FTP. Убедитесь, что у службы 1С есть полные права на папку с исходным файлом.
Посмотрим на пример рабочего и надежного кода, который учитывает установку каталога и проверку локального файла перед отправкой. Этот подход минимизирует количество неясных ошибок:
// Подключаемся к серверу
Попытка
ФТП = Новый FTPСоединение("37.48.хх.ххх", 21, "логин", "пароль", , Истина, 15);
Исключение
Сообщить("Не удалось подключиться к FTP: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// Проверяем наличие локального файла
ЛокальныйФайл = Новый Файл("c:\Temp\обмен\ОстаткиИЦены.csv");
Если Не ЛокальныйФайл.Существует() Тогда
Сообщить("Файл-источник не найден!");
Возврат;
КонецЕсли;
// Устанавливаем каталог и записываем файл
Попытка
// Используем путь относительно домашней директории FTP-пользователя
ПутьНаСервере = "import1c/";
ФТП.УстановитьТекущийКаталог(ПутьНаСервере);
// Записываем файл, используя только имя файла для целевого пути
ФТП.Записать(ЛокальныйФайл.ПолноеИмя, ЛокальныйФайл.Имя);
Сообщить("Файл успешно загружен на FTP.");
Исключение
Сообщить("Ошибка при записи файла: " + ОписаниеОшибки());
КонецПопытки;
pwd (print working directory), чтобы увидеть реальный путь, в котором вы находитесь после логина.550 Permission denied или 553 Could not create file в логах сервера даст гораздо больше информации, чем общее сообщение в 1С.FTPСоединение без параметров защиты не сможет корректно завершить операцию записи. В этом случае необходимо создать объект ЗащищенноеСоединениеOpenSSL и передать его в конструктор.Таким образом, для решения проблемы «Access denied to remote resource» нам необходимо последовательно исключить ошибки в путях (регистр и chroot), проверить режим соединения (пассивный) и убедиться в достаточности прав как на стороне FTP-сервера, так и для службы 1С на локальном сервере.