Как создать файл DBF с длинными именами полей и типом DateTime в 1С через ADO?

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

При работе с внешними системами программисты 1С часто сталкиваются с необходимостью выгрузки данных в формат DBF. Встроенный объект платформы XBase удобен и прост, но он несет в себе ограничения старых стандартов dBase: имена полей не могут превышать 10 символов, а среди типов данных отсутствует полноценный DateTime (есть только дата без времени). Если принимающая сторона требует формат Visual FoxPro с длинными именами и точным временем, стандартных средств 1С становится недостаточно.

В этой статье мы подробно разберем, как использовать технологию ADO (ActiveX Data Objects) для создания файлов DBF, обходя ограничения XBase, и решим сопутствующие проблемы с драйверами и разрядностью систем.

Почему стандартный XBase не всегда подходит?

Рассмотрим ограничения встроенного объекта 1С:

  1. Ограничение имен: Метод Поля.Добавить() принимает только латинские имена длиной до 10 символов. Если вы попытаетесь передать "Description_Full", система обрежет его или выдаст ошибку.
  2. Типы данных: Доступны "N" (Число), "S" (Строка), "D" (Дата), "L" (Булево). Тип "D" в XBase хранит только дату (год, месяц, день), обнуляя время.
  3. Формат файла: 1С создает файлы в формате dBase IV, который является "общим знаменателем" для многих систем, но не поддерживает возможности современных СУБД типа FoxPro.

Использование ADO позволяет работать с DBF как с полноценной базой данных, используя SQL-запросы для создания структуры и наполнения данными.

Выбор и установка драйвера (Provider)

Для начала проанализируем ситуацию с драйверами. ADO — это лишь программная прослойка, которая не умеет работать с файлами напрямую; ей нужен провайдер (драйвер). Рассмотрим основные варианты:

Важный нюанс: Драйвер Visual FoxPro существует только в 32-битной версии. Если ваш сервер 1С работает в 64-битном режиме, прямая попытка создать объект Новый COMОбъект("ADODB.Connection") и открыть соединение приведет к ошибке "Поставщик не найден".

Решение проблемы разрядности (32-бит против 64-бит)

Если вы столкнулись с ситуацией, когда сервер 1С x64 не видит 32-битный драйвер, рассмотрим два способа решения:

  1. Использование COM+: Мы можем зарегистрировать драйвер как отдельное приложение в службе компонентов Windows. Это позволит 64-битному процессу обращаться к 32-битному драйверу через механизм межпроцессного взаимодействия.
  2. Выполнение на клиенте: Если архитектура позволяет, выполняйте выгрузку в DBF на стороне 32-битного тонкого или толстого клиента.

Проанализируем пример строки соединения для VFPOLEDB:


ПутьКПапке = "C:\ExportData\";
СтрокаСоединения = "Provider=VFPOLEDB;Data Source=" + ПутьКПапке + ";";

Обратите внимание: в качестве Data Source указывается путь к папке, где лежат или будут лежать файлы, а не путь к конкретному файлу.

Создание таблицы с длинными именами и типом DateTime

В отличие от XBase, где мы описываем коллекцию полей, в ADO мы используем SQL-команду CREATE TABLE. Выясним, как правильно составить запрос для расширенных типов данных.

Разберем пример кода для создания файла:


// Создаем объект соединения
Connection = Новый COMОбъект("ADODB.Connection");

// Открываем соединение к папке
ПутьККаталогу = "C:\MyDBFDir\";
Connection.Open("Provider=VFPOLEDB;Data Source=" + ПутьККаталогу);

// Формируем SQL-запрос на создание таблицы
// Имена полей могут быть длинными (до 128 символов в формате FoxPro)
// Тип T — это DateTime в FoxPro
// Тип I — Integer (целое число)
// Тип C(N) — Строка длиной N
ТекстЗапроса = "CREATE TABLE NewExport (
               | FullFieldName Character(50), 
               | CreatedAt DateTime, 
               | Amount Numeric(15,2), 
               | IntID Integer
               |)";

Попытка
    Connection.Execute(ТекстЗапроса);
    Сообщить("Файл успешно создан!");
Исключение
    Сообщить("Ошибка при создании: " + ОписаниеОшибки());
КонецПопытки;

В данном примере мы используем тип DateTime (в SQL-синтаксисе FoxPro это ключевое слово DateTime или буква T). Это позволяет хранить дату и время в одном поле, что невозможно сделать стандартным XBase 1С.

Запись данных в созданный файл

После того как файл создан, наполнять его данными можно также через SQL-запросы INSERT INTO. Это работает значительно быстрее, чем построчное добавление через объектную модель при больших объемах данных.

Рассмотрим подробнее процесс добавления записи:


// Пример добавления записи с датой и временем
// В Visual FoxPro литералы даты-времени заключаются в фигурные скобки
// Формат: {^YYYY-MM-DD HH:MM:SS}

ТекущийМомент = ТекущаяДата();
СтрДатаВремя = "{^" + Формат(ТекущийМомент, "ДФ=гггг-ММ-дд") + " " + 
               Формат(ТекущийМомент, "ДФ=ЧЧ:мм:сс") + "}";

ТекстВставки = "INSERT INTO NewExport (FullFieldName, CreatedAt, Amount) 
                VALUES ('Тестовое описание товара', " + СтрДатаВремя + ", 1500.50)";

Connection.Execute(ТекстВставки);

Работа с кодировкой

Проанализируем ситуацию с русскими символами. Часто при использовании ADO возникает проблема "кракозябр". Чтобы избежать этого, рекомендуется сразу после открытия соединения выполнить команду настройки кодовой страницы.

Выясним, как установить кодировку:


// Установка кодировки Windows-1251 для корректной работы с кириллицей
Connection.Execute("SET COLLATE TO 'RUSSIAN'");

Если ваша задача требует DOS-кодировки (CP866), это настраивается либо в параметрах драйвера, либо через реестр Windows в настройках провайдера (ACE/Jet), однако VFPOLEDB чаще всего корректно работает с Windows-1251 "из коробки".

Заключение

Мы рассмотрели мощный инструмент для работы с внешними данными — ADO. Использование провайдера Visual FoxPro позволяет преодолеть "детские болезни" формата DBF в 1С:

Главным условием успешной реализации является правильный подбор разрядности драйвера и использование корректных строк соединения. Помните, что для серверных вызовов в 64-битной среде лучше использовать 64-битный драйвер ACE OLEDB, если вам не критичны специфические типы данных FoxPro.

← На главную