При интеграции 1С с внешними системами часто возникает задача получения данных из файлов формата DBF, которые размещены на удаленном FTP-сервере. Типичная сложность заключается в том, что разработчики пытаются открыть файл напрямую по сетевому адресу, что невозможно стандартными средствами встроенного языка. В этой статье мы подробно разберем, как правильно организовать процесс: от подключения к серверу до обхода специфических ограничений платформы 1С при работе с XBase.
Прежде всего, проанализируем техническую сторону вопроса. Объект XBase, предназначенный для работы с файлами баз данных, требует прямого доступа к файловой системе через файловый дескриптор операционной системы. Протокол FTP является протоколом передачи данных, а не протоколом файлового доступа (как, например, SMB/CIFS). Следовательно, единственный надежный способ обработки такого файла — это его предварительное скачивание в локальный или временный каталог сервера 1С.
Рассмотрим процесс инициализации соединения. Для этого используется объект FTPСоединение. Важно правильно обработать возможные ошибки подключения, используя конструкцию Попытка ... Исключение. Разберем пример кода, который устанавливает связь и ищет необходимый файл:
// Параметры подключения к FTP
Сервер = "ftp.example.com";
Порт = 21;
Логин = "user1c";
Пароль = "password";
Попытка
Соединение = Новый FTPСоединение(Сервер, Порт, Логин, Пароль);
НайденныеФайлы = Соединение.НайтиФайлы("/", "_USL_1C.DBF");
Если НайденныеФайлы.Количество() > 0 Тогда
ФайлНаFTP = НайденныеФайлы[0];
ПутьНаFTP = ФайлНаFTP.ПолноеИмя;
Сообщить("Файл успешно найден на сервере.");
Иначе
Сообщить("Файл не найден.");
Возврат;
КонецЕсли;
Исключение
Сообщить("Ошибка подключения: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
Возврат;
КонецПопытки;
Теперь выясним, куда сохранить файл, если доступ к дисковой подсистеме арендованного сервера ограничен. В 1С предусмотрена функция КаталогВременныхФайлов(), которая возвращает путь к папке, на которую у пользователя, под которым запущен сеанс 1С, почти всегда есть права на запись.
Важный нюанс: при использовании объекта XBase существует историческое ограничение — длина имени файла не должна превышать 8 символов (формат 8.3). Если имя временного файла будет слишком длинным, метод ОткрытьФайл() может выдать ошибку. Давайте создадим корректный путь для скачивания:
// Формируем имя временного файла (8 символов + расширение)
ИмяЛокальногоФайла = "data_tmp.dbf";
ПутьКЛокальномуФайлу = КаталогВременныхФайлов() + ИмяЛокальногоФайла;
// Скачиваем файл с FTP
Попытка
Соединение.Получить(ПутьНаFTP, ПутьКЛокальномуФайлу);
Сообщить("Файл успешно скачан во временную папку.");
Исключение
Сообщить("Не удалось скачать файл: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
Возврат;
КонецПопытки;
После того как файл оказался на локальном диске, мы можем приступить к его чтению. Мы будем использовать объект XBase. Для удобства работы с данными в коде 1С, создадим ТаблицаЗначений, в которую выгрузим содержимое строк DBF.
Рассмотрим алгоритм обхода записей:
ТаблицаРезультат = Новый ТаблицаЗначений;
ДБФ = Новый XBase;
Попытка
// Открываем локальный файл
ДБФ.ОткрытьФайл(ПутьКЛокальномуФайлу);
Если Не ДБФ.Открыта() Тогда
ВызватьИсключение "Не удалось открыть DBF файл.";
КонецЕсли;
// Создаем колонки в ТЗ на основе структуры DBF
Для Каждого Поле Из ДБФ.Поля Цикл
ТаблицаРезультат.Колонки.Добавить(Поле.Имя);
КонецЦикла;
// Читаем данные построчно
ДБФ.Первая();
Пока Не ДБФ.В Конце() Цикл
НоваяСтрока = ТаблицаРезультат.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, ДБФ);
ДБФ.Следующая();
КонецЦикла;
ДБФ.ЗакрытьФайл();
Сообщить("Данные успешно загружены. Количество строк: " + ТаблицаРезультат.Количество());
Исключение
Если ДБФ.Открыта() Тогда
ДБФ.ЗакрытьФайл();
КонецЕсли;
Сообщить("Ошибка при чтении DBF: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
В процессе реализации этой задачи мы можем столкнуться с рядом неочевидных проблем. Проанализируем их подробнее:
FTPСоединение всегда следите за тем, чтобы передача шла в бинарном режиме. В 1С это поведение по умолчанию, но при использовании сторонних утилит текстовый режим (ASCII) может повредить структуру заголовка DBF.ДБФ.Кодировка = КодировкаXBase.OEM; (или ANSI) перед открытием файла.УдалитьФайлы(ПутьКЛокальномуФайлу); в блоке КонецПроцедуры или после закрытия объекта XBase.Если вы сталкиваетесь с тем, что XBase не справляется со сложной структурой файла или ограничениями путей, можно воспользоваться технологией ADO. Это позволит работать с DBF как с таблицей SQL. Однако помните, что файл все равно придется предварительно скачать с FTP, так как драйверы ADO (например, Microsoft Access Database Engine) также требуют локального пути.
Выясним, в чем преимущество ADO: он позволяет выполнять запрос SELECT с фильтрацией прямо на этапе чтения. Это значительно экономит память, если вам нужны не все данные из огромного DBF-файла, а только определенные строки.
Подводя итог, можно сказать, что связка FTPСоединение + КаталогВременныхФайлов() + XBase является классическим и наиболее стабильным решением для платформы 1С при работе с удаленными базами данных формата DBF.