Как правильно скачать и прочитать файл с FTP-сервера в 1С

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

Работа с удаленными серверами по протоколу FTP — типовая задача при интеграции 1С с сайтами, интернет-магазинами и сторонними информационными системами. Однако начинающие разработчики часто сталкиваются с ошибками вида «Файл не обнаружен» сразу после подключения к серверу. Разберем по шагам, как устроено взаимодействие с FTP в платформе 1С:Предприятие, выясним причину распространенных ошибок и рассмотрим корректные примеры чтения полученных данных.

Анализ проблемы: почему возникает ошибка «Файл не обнаружен»

Платформа 1С не поддерживает прямое потоковое чтение файлов с FTP-сервера непосредственно в оперативную память. Чтобы обработать файл (например, прайс-лист в формате CSV или XML), его необходимо сначала скачать на локальный диск или во временный каталог сервера, а затем открыть с помощью соответствующих объектов платформы.

Посмотрим на типичный ошибочный сценарий:

  1. Разработчик формирует путь к временному файлу через функцию ПолучитьИмяВременногоФайла().
  2. Метод FTPСоединение.Получить() успешно скачивает файл из каталога FTP-сервера и сохраняет его по полному временному пути.
  3. При попытке прочитать скачанный файл разработчик передает в метод Прочитать() относительное имя файла на FTP-сервере (например, "export.csv") вместо полного пути к локальному файлу, куда он был сохранен.

В результате платформа пытается найти файл в текущем рабочем каталоге процесса 1С на компьютере и закономерно выдает ошибку отсутствия файла. Для исправления ситуации необходимо передавать объектам чтения именно ту переменную, в которую был сохранен локальный путь.

Шаг 1. Корректная инициализация FTP-соединения

Проанализируем параметры конструктора объекта FTPСоединение. Важно помнить следующие нюансы:

  1. Адрес сервера: указывается только доменное имя или IP-адрес (например, "ftp.mebel-kopi.ru" или "192.168.1.10"). Использование префиксов протоколов http:// или ftp:// недопустимо и вызывает ошибку сетевого подключения.
  2. Пассивный режим: при работе через маршрутизаторы, брандмауэры и NAT активный режим часто блокирует передачу данных. Рекомендуется явно передавать ПассивныйРежим = Истина.
  3. Таймаут: указание таймаута предотвращает зависание сеанса при нестабильной связи.

Посмотрим на пример правильного подключения к FTP-серверу:


Функция УстановитьСоединениеFTP()
    
    Сервер = "ftp.mebel-kopi.ru";
    Порт = 21;
    Пользователь = "mebel-kopi";
    Пароль = "СекретныйПароль";
    Таймаут = 30;
    ПассивныйРежим = Истина;
    
    Попытка
        Соединение = Новый FTPСоединение(
            Сервер, 
            Порт, 
            Пользователь, 
            Пароль, 
            , // Прокси
            ПассивныйРежим, 
            Таймаут
        );
        Возврат Соединение;
    Исключение
        ВызватьИсключение "Не удалось подключиться к FTP-серверу: " + ОписаниеОшибки();
    КонецПопытки;
    
КонецФункции

Шаг 2. Скачивание и чтение файла

Рассмотрим подробнее процесс выгрузки файла во временное хранилище на диске и его последующее открытие. Для гарантированного освобождения ресурсов и удаления временных файлов после обработки обязательно используем конструкцию Попытка ... Фиксировано или ручную очистку.


Процедура ЗагрузитьДанныеСФТП()
    
    Соединение = УстановитьСоединениеFTP();
    Если Соединение = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    КаталогНаСервере = "www/mebel-kopi/vwb_export_product";
    ИмяФайлаНаСервере = "export.csv";
    
    Соединение.УстановитьТекущийКаталог(КаталогНаСервере);
    
    // Проверяем наличие файла на FTP-сервере
    НайденныеФайлы = Соединение.НайтиФайлы(ИмяФайлаНаСервере);
    Если НайденныеФайлы.Количество() = 0 Тогда
        Сообщить("Файл не найден на FTP-сервере.");
        Возврат;
    КонецЕсли;
    
    // Генерируем уникальный путь во временной папке
    ЛокальныйФайл = ПолучитьИмяВременногоФайла("csv");
    
    Попытка
        // Скачиваем файл с FTP на локальный диск
        Соединение.Получить(ИмяФайлаНаСервере, ЛокальныйФайл);
        
        // Читаем скачанный локальный файл
        ОбработатьСкачанныйФайл(ЛокальныйФайл);
        
    Исключение
        Сообщить("Ошибка при обработке файла: " + ОписаниеОшибки());
    КонецПопытки;
    
    // Обязательно удаляем временный файл после работы
    Попытка
        УдалитьФайлы(ЛокальныйФайл);
    Исключение
        // Игнорируем ошибки очистки временных файлов
    КонецПопытки;
    
КонецПроцедуры

Шаг 3. Оптимальные способы разбора содержимого файла

Выбор инструмента для чтения зависит от формата данных и их объема.

Вариант 1. Использование специализированного объекта «ЧтениеCSV»

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


Процедура ОбработатьСкачанныйФайл(ПутьКФайлу)
    
    Чтение = Новый ЧтениеCSV;
    Чтение.Открыть(ПутьКФайлу, , ",");
    
    Пока Чтение.Прочитать() Цикл
        МассивКолонок = Чтение.ПолучитьЗначение();
        // Обработка массива значений строки
    КонецЦикла;
    
    Чтение.Закрыть();
    
КонецПроцедуры

Вариант 2. Потоковое чтение через объект «ЧтениеТекста»

Метод ТекстовыйДокумент.Прочитать() загружает весь файл целиком в оперативную память, что может вызвать сбои при обработке файлов большого размера. Объект ЧтениеТекста позволяет читать файл построчно с минимальным расходом памяти и явным указанием кодировки.


Процедура ПрочитатьТекстовыйФайлПострочно(ПутьКФайлу)
    
    Чтение = Новый ЧтениеТекста;
    Чтение.Открыть(ПутьКФайлу, "windows-1251");
    
    СтрокаФайла = Чтение.ПрочитатьСтроку();
    Пока СтрокаФайла <> Неопределено Цикл
        
        // Обрабатываем очередную строку
        
        СтрокаФайла = Чтение.ПрочитатьСтроку();
    КонецЦикла;
    
    Чтение.Закрыть();
    
КонецПроцедуры

Важные особенности при работе в клиент-серверном режиме

  1. Контекст выполнения: если процедура выполняется на сервере (в модуле внешнего соединения, общем модуле или с директивой &НаСервере), методы ПолучитьИмяВременногоФайла() и запись на диск создают файлы в файловой системе сервера 1С:Предприятия. Пользовательская служба usr1cv8 должна иметь полные права на запись и чтение в целевые каталоги.
  2. Ограничения протокола: объект FTPСоединение поддерживает стандартный протокол FTP и шифрованный FTPS (при передаче параметра ЗащищенноеСоединение), однако не поддерживает протокол SFTP (SSH File Transfer Protocol). Если сервер требует SFTP, взаимодействие организуется через внешние консольные утилиты посредством ЗапуститьПриложение().
← На главную