Как загрузить данные из DBF-файла, расположенного на FTP-сервере?

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

При интеграции 1С с внешними системами часто возникает задача получения данных из файлов формата DBF, которые размещены на удаленном FTP-сервере. Типичная сложность заключается в том, что разработчики пытаются открыть файл напрямую по сетевому адресу, что невозможно стандартными средствами встроенного языка. В этой статье мы подробно разберем, как правильно организовать процесс: от подключения к серверу до обхода специфических ограничений платформы 1С при работе с XBase.

Почему нельзя открыть DBF напрямую с FTP?

Прежде всего, проанализируем техническую сторону вопроса. Объект XBase, предназначенный для работы с файлами баз данных, требует прямого доступа к файловой системе через файловый дескриптор операционной системы. Протокол FTP является протоколом передачи данных, а не протоколом файлового доступа (как, например, SMB/CIFS). Следовательно, единственный надежный способ обработки такого файла — это его предварительное скачивание в локальный или временный каталог сервера 1С.

Шаг 1. Установка соединения с FTP и поиск файла

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


// Параметры подключения к FTP
Сервер = "ftp.example.com";
Порт = 21;
Логин = "user1c";
Пароль = "password";

Попытка
    Соединение = Новый FTPСоединение(Сервер, Порт, Логин, Пароль);
    НайденныеФайлы = Соединение.НайтиФайлы("/", "_USL_1C.DBF");
    
    Если НайденныеФайлы.Количество() > 0 Тогда
        ФайлНаFTP = НайденныеФайлы[0];
        ПутьНаFTP = ФайлНаFTP.ПолноеИмя;
        Сообщить("Файл успешно найден на сервере.");
    Иначе
        Сообщить("Файл не найден.");
        Возврат;
    КонецЕсли;
Исключение
    Сообщить("Ошибка подключения: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
    Возврат;
КонецПопытки;

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

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

Важный нюанс: при использовании объекта XBase существует историческое ограничение — длина имени файла не должна превышать 8 символов (формат 8.3). Если имя временного файла будет слишком длинным, метод ОткрытьФайл() может выдать ошибку. Давайте создадим корректный путь для скачивания:


// Формируем имя временного файла (8 символов + расширение)
ИмяЛокальногоФайла = "data_tmp.dbf"; 
ПутьКЛокальномуФайлу = КаталогВременныхФайлов() + ИмяЛокальногоФайла;

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

Шаг 3. Чтение данных из DBF в Таблицу Значений

После того как файл оказался на локальном диске, мы можем приступить к его чтению. Мы будем использовать объект XBase. Для удобства работы с данными в коде 1С, создадим ТаблицаЗначений, в которую выгрузим содержимое строк DBF.

Рассмотрим алгоритм обхода записей:


ТаблицаРезультат = Новый ТаблицаЗначений;

ДБФ = Новый XBase;
Попытка
    // Открываем локальный файл
    ДБФ.ОткрытьФайл(ПутьКЛокальномуФайлу);
    
    Если Не ДБФ.Открыта() Тогда
        ВызватьИсключение "Не удалось открыть DBF файл.";
    КонецЕсли;

    // Создаем колонки в ТЗ на основе структуры DBF
    Для Каждого Поле Из ДБФ.Поля Цикл
        ТаблицаРезультат.Колонки.Добавить(Поле.Имя);
    КонецЦикла;

    // Читаем данные построчно
    ДБФ.Первая();
    Пока Не ДБФ.В Конце() Цикл
        НоваяСтрока = ТаблицаРезультат.Добавить();
        ЗаполнитьЗначенияСвойств(НоваяСтрока, ДБФ);
        ДБФ.Следующая();
    КонецЦикла;

    ДБФ.ЗакрытьФайл();
    Сообщить("Данные успешно загружены. Количество строк: " + ТаблицаРезультат.Количество());

Исключение
    Если ДБФ.Открыта() Тогда
        ДБФ.ЗакрытьФайл();
    КонецЕсли;
    Сообщить("Ошибка при чтении DBF: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;

Дополнительные рекомендации и подводные камни

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

  1. Режим передачи данных: При работе с FTPСоединение всегда следите за тем, чтобы передача шла в бинарном режиме. В 1С это поведение по умолчанию, но при использовании сторонних утилит текстовый режим (ASCII) может повредить структуру заголовка DBF.
  2. Кодировка: DBF-файлы часто создаются в кодировке OEM (DOS) или Windows-1251. Если после загрузки вы видите "кракозябры", используйте метод ДБФ.Кодировка = КодировкаXBase.OEM; (или ANSI) перед открытием файла.
  3. Блокировки: Если файл на FTP-сервере постоянно обновляется другой программой, скачивание может завершиться ошибкой. В таких случаях рекомендуется сначала попробовать переименовать файл на стороне FTP — если переименование прошло успешно, значит, файл не заблокирован и его можно скачивать.
  4. Очистка мусора: Не забывайте удалять временный файл после завершения работы. Используйте команду УдалитьФайлы(ПутьКЛокальномуФайлу); в блоке КонецПроцедуры или после закрытия объекта XBase.

Альтернативный подход: Использование ADO

Если вы сталкиваетесь с тем, что XBase не справляется со сложной структурой файла или ограничениями путей, можно воспользоваться технологией ADO. Это позволит работать с DBF как с таблицей SQL. Однако помните, что файл все равно придется предварительно скачать с FTP, так как драйверы ADO (например, Microsoft Access Database Engine) также требуют локального пути.

Выясним, в чем преимущество ADO: он позволяет выполнять запрос SELECT с фильтрацией прямо на этапе чтения. Это значительно экономит память, если вам нужны не все данные из огромного DBF-файла, а только определенные строки.

Подводя итог, можно сказать, что связка FTPСоединение + КаталогВременныхФайлов() + XBase является классическим и наиболее стабильным решением для платформы 1С при работе с удаленными базами данных формата DBF.

← На главную