Как реализовать загрузку и выгрузку файлов через FTP в 1С и решить типичные ошибки

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

Работа с протоколом FTP в среде 1С:Предприятие — это классическая задача при интеграции с внешними системами, интернет-магазинами или государственными сервисами. Однако на практике программисты часто сталкиваются с неочевидным поведением системы: файлы скачиваются с нулевым размером, методы удаления выдают загадочные ошибки Quote command returned error, а права доступа ведут себя непредсказуемо. В этой статье мы подробно разберем, как правильно настроить объект FTPСоединение, обеспечим стабильную передачу данных и рассмотрим альтернативные способы решения проблем, когда стандартных средств платформы оказывается недостаточно.

Разбираем проблему пустых файлов при скачивании

Рассмотрим ситуацию: соединение установлено, 1С находит файлы на сервере, создает их копии в локальной папке, но размер этих файлов равен 0 байт. Это классическая проблема несоответствия режимов передачи данных. Проанализируем, почему это происходит. Протокол FTP может работать в двух режимах: активном и пассивном.

В активном режиме сервер пытается сам инициировать соединение с клиентом для передачи данных. Если ваш компьютер находится за брандмауэром или NAT (что происходит в 99% корпоративных сетей), защитная система блокирует входящее соединение от сервера. В результате заголовок файла создается, но поток данных не проходит.

Для решения этой проблемы мы должны всегда использовать пассивный режим. В конструкторе объекта FTPСоединение за это отвечает шестой параметр. Рассмотрим пример правильной инициализации соединения:


// Параметры: Сервер, Порт, Пользователь, Пароль, Прокси, ПассивноеСоединение
ПассивныйРежим = Истина;
СерверFTP = Новый FTPСоединение("ftp.myserver.ru", 21, "Login", "Password", , ПассивныйРежим);

Если вы видите пустые файлы, первым делом проверьте, передается ли Истина в качестве параметра пассивного соединения. Также стоит убедиться, что у пользователя, под которым запущена служба 1С (в случае серверного вызова), есть права на запись в локальный каталог.

Корректная загрузка файлов из подкаталогов

Часто требуется зайти в определенную папку на сервере. Рассмотрим типичную ошибку: попытку обращения к файлу по полному пути после того, как уже был установлен текущий каталог. Проанализируем правильный алгоритм работы с методами НайтиФайлы и Получить.


ИмяСервераFTP = "ftp.example.com";
ТекущийКаталогFTP = "emission";
Сервер = Новый FTPСоединение(ИмяСервераFTP, 21, "user", "pass", , Истина);

Попытка
    Сервер.УстановитьТекущийКаталог(ТекущийКаталогFTP);
Исключение
    Сообщить("Каталог не найден!");
КонецПопытки;

// Ищем файлы в текущем каталоге
СписокФайлов = Сервер.НайтиФайлы("", "*.txt", Истина);
ПутьЛокальный = "C:\Import\";

Для каждого Файл из СписокФайлов Цикл
    // Важно: используем Файл.Имя, так как мы уже в нужном каталоге
    Сервер.Получить(Файл.Имя, ПутьЛокальный + Файл.Имя);
КонецЦикла;

Обратите внимание, что при использовании метода НайтиФайлы с флагом рекурсии (третий параметр — Истина), объект ФайлFTP может содержать пути к вложенным папкам. В этом случае логика сохранения должна учитывать структуру подкаталогов.

Решение ошибки Quote command returned error при удалении

Одной из самых раздражающих проблем является ошибка при попытке удалить или переместить файл после его обработки. Сообщение Quote command returned error обычно означает, что FTP-сервер не смог выполнить команду DELE или RNFR/RNTO.

Выясним причину: часто это происходит из-за того, что 1С пытается передать серверу путь к файлу в формате, который сервер не понимает. Например, если вы вызвали УстановитьТекущийКаталог(), а затем пытаетесь удалить файл, передавая Файл.ПолноеИмя, сервер может воспринять это как попытку найти файл по двойному пути.

Рассмотрим проверенный способ удаления файла:

  1. Устанавливаем текущий каталог через Сервер.УстановитьТекущийКаталог().
  2. В метод Удалить() передаем только имя файла, а не полный путь.

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

Проблема спецсимволов и кодировок

Проанализируем ситуацию, когда файл виден в списке, но при попытке его получить или удалить возникает ошибка. Одной из скрытых причин являются недопустимые символы в именах файлов. Например, символ двоеточия : в именах файлов (часто встречается в логах или именах с временными метками) корректно обрабатывается в Linux-системах, но может вызывать сбои в 1С при работе через FTP на Windows-платформе. Платформа может «обрезать» имя файла, из-за чего команда удаления не находит объект.

Также важно помнить про кодировку. Если в именах файлов используется кириллица, обязательно указывайте кодировку в конструкторе FTPСоединение (седьмой параметр). По умолчанию используется UTF-8, но многие старые серверы работают только с CP1251.

Использование внешних утилит (Curl) как «план Б»

Если стандартный объект FTPСоединение продолжает выдавать ошибки (что иногда случается на специфических настройках роутеров или нестандартных FTP-серверах типа FileZilla с особыми правами), мы можем прибегнуть к помощи системных утилит, таких как curl.

Разберем пример вызова curl из кода 1С для удаления файла, который не поддается стандартному методу:


ПутьCurl = КаталогВременныхФайлов() + "curl.exe";
// Предположим, curl.exe хранится в макете конфигурации
МакетCurl = ПолучитьМакет("CurlExe");
МакетCurl.Записать(ПутьCurl);

Команда = ПутьCurl + " -u " + Логин + ":" + Пароль + 
          " ftp://" + АдресСервера + "/" + ПутьНаСервере + "/" + 
          " -Q ""-DELE " + ИмяФайла + """";

Shell = Новый COMОбъект("Wscript.Shell");
// Запускаем скрыто (0) и ждем завершения (1)
Результат = Shell.Run(Команда, 0, 1);

Этот метод является «тяжелой артиллерией», но он крайне эффективен, так как curl умеет обходить многие ограничения реализации протокола в конкретных программных средах.

Итоги и рекомендации

Подводя итог, отметим ключевые правила стабильной работы с FTP в 1С:

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

← На главную