Работа с удаленными серверами по протоколу FTP — типовая задача при интеграции 1С с сайтами, интернет-магазинами и сторонними информационными системами. Однако начинающие разработчики часто сталкиваются с ошибками вида «Файл не обнаружен» сразу после подключения к серверу. Разберем по шагам, как устроено взаимодействие с FTP в платформе 1С:Предприятие, выясним причину распространенных ошибок и рассмотрим корректные примеры чтения полученных данных.
Платформа 1С не поддерживает прямое потоковое чтение файлов с FTP-сервера непосредственно в оперативную память. Чтобы обработать файл (например, прайс-лист в формате CSV или XML), его необходимо сначала скачать на локальный диск или во временный каталог сервера, а затем открыть с помощью соответствующих объектов платформы.
Посмотрим на типичный ошибочный сценарий:
ПолучитьИмяВременногоФайла().FTPСоединение.Получить() успешно скачивает файл из каталога FTP-сервера и сохраняет его по полному временному пути.Прочитать() относительное имя файла на FTP-сервере (например, "export.csv") вместо полного пути к локальному файлу, куда он был сохранен.В результате платформа пытается найти файл в текущем рабочем каталоге процесса 1С на компьютере и закономерно выдает ошибку отсутствия файла. Для исправления ситуации необходимо передавать объектам чтения именно ту переменную, в которую был сохранен локальный путь.
Проанализируем параметры конструктора объекта FTPСоединение. Важно помнить следующие нюансы:
"ftp.mebel-kopi.ru" или "192.168.1.10"). Использование префиксов протоколов http:// или ftp:// недопустимо и вызывает ошибку сетевого подключения.ПассивныйРежим = Истина.Посмотрим на пример правильного подключения к FTP-серверу:
Функция УстановитьСоединениеFTP()
Сервер = "ftp.mebel-kopi.ru";
Порт = 21;
Пользователь = "mebel-kopi";
Пароль = "СекретныйПароль";
Таймаут = 30;
ПассивныйРежим = Истина;
Попытка
Соединение = Новый FTPСоединение(
Сервер,
Порт,
Пользователь,
Пароль,
, // Прокси
ПассивныйРежим,
Таймаут
);
Возврат Соединение;
Исключение
ВызватьИсключение "Не удалось подключиться к FTP-серверу: " + ОписаниеОшибки();
КонецПопытки;
КонецФункции
Рассмотрим подробнее процесс выгрузки файла во временное хранилище на диске и его последующее открытие. Для гарантированного освобождения ресурсов и удаления временных файлов после обработки обязательно используем конструкцию Попытка ... Фиксировано или ручную очистку.
Процедура ЗагрузитьДанныеСФТП()
Соединение = УстановитьСоединениеFTP();
Если Соединение = Неопределено Тогда
Возврат;
КонецЕсли;
КаталогНаСервере = "www/mebel-kopi/vwb_export_product";
ИмяФайлаНаСервере = "export.csv";
Соединение.УстановитьТекущийКаталог(КаталогНаСервере);
// Проверяем наличие файла на FTP-сервере
НайденныеФайлы = Соединение.НайтиФайлы(ИмяФайлаНаСервере);
Если НайденныеФайлы.Количество() = 0 Тогда
Сообщить("Файл не найден на FTP-сервере.");
Возврат;
КонецЕсли;
// Генерируем уникальный путь во временной папке
ЛокальныйФайл = ПолучитьИмяВременногоФайла("csv");
Попытка
// Скачиваем файл с FTP на локальный диск
Соединение.Получить(ИмяФайлаНаСервере, ЛокальныйФайл);
// Читаем скачанный локальный файл
ОбработатьСкачанныйФайл(ЛокальныйФайл);
Исключение
Сообщить("Ошибка при обработке файла: " + ОписаниеОшибки());
КонецПопытки;
// Обязательно удаляем временный файл после работы
Попытка
УдалитьФайлы(ЛокальныйФайл);
Исключение
// Игнорируем ошибки очистки временных файлов
КонецПопытки;
КонецПроцедуры
Выбор инструмента для чтения зависит от формата данных и их объема.
Если полученный файл представляет собой CSV-таблицу, использование ЧтениеCSV является наиболее надежным способом, так как объект корректно обрабатывает кавычки, экранирование символов и переносы строк внутри колонок.
Процедура ОбработатьСкачанныйФайл(ПутьКФайлу)
Чтение = Новый ЧтениеCSV;
Чтение.Открыть(ПутьКФайлу, , ",");
Пока Чтение.Прочитать() Цикл
МассивКолонок = Чтение.ПолучитьЗначение();
// Обработка массива значений строки
КонецЦикла;
Чтение.Закрыть();
КонецПроцедуры
Метод ТекстовыйДокумент.Прочитать() загружает весь файл целиком в оперативную память, что может вызвать сбои при обработке файлов большого размера. Объект ЧтениеТекста позволяет читать файл построчно с минимальным расходом памяти и явным указанием кодировки.
Процедура ПрочитатьТекстовыйФайлПострочно(ПутьКФайлу)
Чтение = Новый ЧтениеТекста;
Чтение.Открыть(ПутьКФайлу, "windows-1251");
СтрокаФайла = Чтение.ПрочитатьСтроку();
Пока СтрокаФайла <> Неопределено Цикл
// Обрабатываем очередную строку
СтрокаФайла = Чтение.ПрочитатьСтроку();
КонецЦикла;
Чтение.Закрыть();
КонецПроцедуры
&НаСервере), методы ПолучитьИмяВременногоФайла() и запись на диск создают файлы в файловой системе сервера 1С:Предприятия. Пользовательская служба usr1cv8 должна иметь полные права на запись и чтение в целевые каталоги.FTPСоединение поддерживает стандартный протокол FTP и шифрованный FTPS (при передаче параметра ЗащищенноеСоединение), однако не поддерживает протокол SFTP (SSH File Transfer Protocol). Если сервер требует SFTP, взаимодействие организуется через внешние консольные утилиты посредством ЗапуститьПриложение().