При работе с FTP-серверами из 1С разработчики часто сталкиваются с различными трудностями. Одной из наиболее распространённых и обескураживающих проблем является ошибка "Access denied to remote resource" при попытке найти файлы с помощью метода НайтиФайлы() объекта FTPСоединение, даже если само подключение к FTP-серверу проходит успешно, и другие FTP-клиенты (например, FileZilla) прекрасно работают с теми же учётными данными.
В этой статье мы подробно разберем, почему может возникать такая ситуация, проанализируем возможные причины и предложим пошаговый план действий для диагностики и устранения данной проблемы, основываясь на опыте сообщества 1С.
Представьте ситуацию, когда вы используете стандартные средства 1С для работы с FTP. Код для установления соединения выглядит примерно так:
сервер = "ххх.хх.ххх.ххх";
порт = 21;
логин = "user";
пароль = "password";
естьсвязь = Истина;
Попытка
FTP = Новый FTPСоединение(сервер, порт, логин, пароль, , Истина); // Истина для ПассивноеСоединение
Исключение
Сообщить(ОписаниеОшибки());
естьсвязь = Ложь;
КонецПопытки;
Как вы видите, подключение к FTP-серверу в нашем примере проходит успешно, переменная естьсвязь остаётся равной Истина. Это подтверждает, что учётные данные верны и базовая сетевая доступность сервера присутствует. Однако, при попытке использовать метод НайтиФайлы(), как показано ниже:
Если естьсвязь Тогда
FTP.УстановитьТекущийКаталог("/");
Мас = FTP.НайтиФайлы("/","*.jpg",Истина);
КонецЕсли;
возникает ошибка:
"Ошибка аутентификации при доступе к ресурсу: ftp://ххх.хх.ххх.ххх:21 Access denied to remote resource"
Такая ошибка сбивает с толку, ведь, казалось бы, если подключение прошло, то и права должны быть достаточными. Более того, при использовании других FTP-клиентов (например, FileZilla) с теми же учётными данными, мы можем успешно просматривать каталоги, скачивать и даже загружать файлы. Это явно указывает на то, что проблема не в общих правах доступа на FTP-сервере или сетевой связности как таковой, а в чём-то более специфичном, связанном с взаимодействием 1С и FTP-сервера.
Особое внимание стоит уделить тому факту, если "до какого-то времени всё работало". Это очень важный индикатор, который смещает фокус с первичной настройки на поиск изменений в окружении или на самом FTP-сервере.
Давайте подробно рассмотрим возможные причины, по которым 1С может сталкиваться с ошибкой "Access denied" при поиске файлов, даже когда другие клиенты работают без проблем.
Несмотря на то, что через FileZilla всё работает, для 1С могут существовать специфические ограничения или некорректная интерпретация прав доступа на FTP-сервере. Иногда проблема кроется не в правах на конечные файлы, а в правах на родительские каталоги, которые не позволяют корректно выполнить листинг подкаталогов и файлов. Например, пользователь может иметь права на чтение файла, но не иметь прав на чтение содержимого каталога, в котором этот файл находится. Различные FTP-серверы и их конфигурации могут по-разному обрабатывать эти нюансы, особенно когда речь идёт о системных клиентах, как 1С, в отличие от интерактивных пользовательских клиентов.
В сообществе 1С существует мнение, что встроенный FTP-клиент платформы может иметь сложности с работой по FTP, отличающиеся от поведения стандартных клиентов. Это может проявляться в неполном соответствии стандартам FTP, специфическом поведении при обработке ответов сервера, или даже в наличии внутренних ошибок. Например, в некоторых случаях пользователи отмечали, что объект FTPФайл может некорректно обрабатывать имена файлов, обрезая их после символа @. Хотя это может не быть прямой причиной ошибки "Access denied", это показывает, что внутренний механизм работы 1С с FTP имеет свои особенности и потенциальные ограничения.
Для получения списка файлов FTP-серверы используют различные команды, такие как LIST или NLST. Метод НайтиФайлы() в 1С, скорее всего, использует одну из них. Если FTP-сервер не поддерживает определённую команду, или имеет специфические настройки безопасности, которые ограничивают выполнение этих команд для данного пользователя или IP-адреса, это может вызвать ошибку "Access denied" при попытке получить листинг каталога. Некоторые серверы могут требовать дополнительные разрешения для выполнения команды LIST, которая предоставляет более детальную информацию о файлах (размер, дата, права), в то время как NLST просто перечисляет имена.
Реже, но возможно, что проблема связана с кодировкой имен файлов или каталогов, особенно если в них присутствуют не-ASCII символы (например, кириллица). 1С может некорректно обрабатывать такую кодировку при получении списка файлов, в отличие от FileZilla, который обычно имеет более продвинутые механизмы автоопределения или настройки кодировки.
Работа FTP включает в себя два соединения: управляющее (для команд) и для передачи данных (для самих файлов или списков). Режим, в котором эти соединения устанавливаются, критически важен и может быть источником проблем с брандмауэрами и NAT (Network Address Translation).
В активном режиме клиент устанавливает управляющее соединение с FTP-сервером (обычно на порт 21) и сообщает серверу, на каком порту он готов принимать данные для передачи (например, порт 1025). Затем FTP-сервер сам инициирует второе соединение (для данных) с клиентом на указанный порт (обычно с порта 20 сервера). Этот режим часто вызывает проблемы с брандмауэрами на стороне клиента, так как клиент должен открыть входящий порт, что часто блокируется по умолчанию. Если 1С-сервер или клиентский компьютер находятся за брандмауэром или NAT, который не пропускает входящие соединения от FTP-сервера, передача данных, включая списки файлов, будет невозможна.
В пассивном режиме клиент устанавливает управляющее соединение, а затем отправляет команду PASV. В ответ FTP-сервер открывает случайный порт для передачи данных и сообщает его клиенту. Затем клиент сам инициирует второе соединение (для передачи данных) с этим портом сервера. Пассивный режим чаще используется, так как он лучше работает с клиентскими брандмауэрами, поскольку оба соединения инициируются клиентом. Однако, на стороне сервера необходимо, чтобы брандмауэр позволял устанавливать соединения на этот динамический диапазон портов. Если на FTP-сервере или на маршрутизаторе перед ним не настроен корректный диапазон портов для пассивного режима, или брандмауэр блокирует такие соединения, это также может привести к ошибкам.
Очень важно экспериментировать со значением параметра ПассивноеСоединение в конструкторе FTPСоединение (Истина для пассивного, Ложь для активного), поскольку именно несоответствие режимов работы с настройками брандмауэров является частой причиной проблем с передачей данных или листингом каталогов.
Если раньше функциональность работала, а теперь нет, это критически важная информация. В таком случае, мы должны сосредоточиться на поиске изменений. Причинами могут быть:
НайтиФайлы().
Несмотря на кажущуюся простоту, правильное указание пути к каталогу в методе НайтиФайлы() имеет значение. Путь должен начинаться с прямого слеша /, например /каталог/подкаталог/. Если путь указан неверно или не соответствует структуре FTP-сервера, это также может привести к ошибкам доступа или невозможности найти ресурс. Автоматическое определение корневого каталога может работать не всегда так, как ожидается, поэтому всегда лучше явно указывать полный путь.
Для эффективного решения проблемы "Access denied" при поиске файлов по FTP из 1С, рекомендуем пройти следующие шаги:
Это самый важный и информативный шаг. Мы не можем точно понять причину ошибки, не видя, что "говорит" сам FTP-сервер. Запросите у администратора FTP-сервера логи соединений и операций для того периода, когда 1С пытается выполнить метод НайтиФайлы(). В логах обычно указывается более подробная информация об ошибке, включая коды ошибок (например, 5xx) и специфические сообщения, которые помогут точно определить причину отказа в доступе (например, "permission denied", "command not allowed", "firewall block"). Это может быть ключевым моментом для выяснения, в чем именно сервер отказывает: в выполнении команды листинга, в доступе к каталогу, или в установке соединения для данных.
ПассивноеСоединение.
Как мы уже обсуждали, режим FTP-соединения (активный или пассивный) критически важен. Мы рекомендуем попробовать изменить значение параметра ПассивноеСоединение в конструкторе FTPСоединение на противоположное. Если сейчас установлено Истина (пассивный режим), попробуйте установить Ложь (активный режим) и наоборот. Проверьте, изменится ли поведение или сообщение об ошибке. Это поможет исключить или подтвердить проблемы, связанные с брандмауэрами и NAT на вашей стороне или на стороне FTP-сервера.
// Попробуйте активный режим
FTP = Новый FTPСоединение(сервер, порт, логин, пароль, , Ложь);
// Или снова пассивный, если он был изначально, но с другими диагностиками
// FTP = Новый FTPСоединение(сервер, порт, логин, пароль, , Истина);
Убедимся, что путь в методе НайтиФайлы() указан абсолютно корректно, начиная с корневого слеша /. Например, если файлы находятся в каталоге /photos/holiday/, то укажите именно этот путь. Также проверьте, правильно ли задана маска поиска (например, *.jpg). Попробуйте сначала выполнить поиск без маски (например, "/") или с более широкой маской, чтобы убедиться, что хотя бы какой-то листинг каталога возможен. Возможно, стоит попробовать найти файлы в других, заведомо доступных каталогах, чтобы проверить общую работоспособность.
Даже если FileZilla работает, мы должны проконсультироваться с администратором сервера. Уточните, нет ли специфических ограничений для пользователя, используемого 1С, на операции листинга каталогов или на использование определённых FTP-команд (LIST, NLST). Возможно, для этого пользователя требуется явное разрешение на просмотр содержимого каталогов, которое может отличаться от права на чтение файлов. Также спросите, не менялись ли политики безопасности или настройки брандмауэра для данного FTP-пользователя или для IP-адреса, с которого происходит подключение 1С-системы.
Если есть возможность, мы должны получить максимально полный текст ошибки, включая любые дополнительные коды или сообщения, которые могут быть предоставлены администраторами сервера или получены из других источников (например, из детального лога платформы 1С). Чем больше деталей у нас будет, тем легче будет сузить круг возможных причин.
Если после выполнения всех диагностических шагов и взаимодействия с администратором FTP-сервера, встроенный FTP-клиент 1С всё ещё не позволяет корректно выполнять поиск файлов, возможно, стоит рассмотреть альтернативные методы:
Существуют внешние компоненты для 1С, которые предоставляют более надёжную и функциональную работу с FTP, часто основанные на проверенных сторонних библиотеках (например, cURL). Эти компоненты могут обходить ограничения встроенного клиента 1С, предлагать более гибкие настройки и лучшую совместимость с различными FTP-серверами. Поиск таких компонентов на ресурсах типа Infostart может быть очень полезным.
Если интеграция с 1С через код критически сложна, мы можем использовать внешние программы для выполнения операций с FTP. Например, можно написать скрипт на командной строке, PowerShell или другом языке, который будет использовать WinSCP (бесплатный клиент SFTP, FTP, SCP) или cURL для получения списка файлов. Затем этот скрипт можно запускать из 1С с помощью метода ЗапуститьПриложение() или через объект WShell.Run, а результаты (например, список файлов) получать из текстового файла, в который скрипт записал вывод. Этот подход требует дополнительных настроек на сервере 1С, но может быть очень надёжным, так как внешние утилиты обычно имеют более развитую логику работы с FTP.
В заключение хотим подчеркнуть, что проблема "Access denied" при работе с FTP из 1С часто является комплексной и требует систематического подхода к диагностике. Взаимодействие с администратором FTP-сервера и внимательный анализ логов играют ключевую роль в выявлении истинной причины. Надеемся, что предложенные нами шаги помогут вам успешно решить эту задачу.