При работе с внешними системами программисты 1С часто сталкиваются с необходимостью выгрузки данных в формат DBF. Встроенный объект платформы XBase удобен и прост, но он несет в себе ограничения старых стандартов dBase: имена полей не могут превышать 10 символов, а среди типов данных отсутствует полноценный DateTime (есть только дата без времени). Если принимающая сторона требует формат Visual FoxPro с длинными именами и точным временем, стандартных средств 1С становится недостаточно.
В этой статье мы подробно разберем, как использовать технологию ADO (ActiveX Data Objects) для создания файлов DBF, обходя ограничения XBase, и решим сопутствующие проблемы с драйверами и разрядностью систем.
Рассмотрим ограничения встроенного объекта 1С:
Поля.Добавить() принимает только латинские имена длиной до 10 символов. Если вы попытаетесь передать "Description_Full", система обрежет его или выдаст ошибку.XBase хранит только дату (год, месяц, день), обнуляя время.Использование ADO позволяет работать с DBF как с полноценной базой данных, используя SQL-запросы для создания структуры и наполнения данными.
Для начала проанализируем ситуацию с драйверами. ADO — это лишь программная прослойка, которая не умеет работать с файлами напрямую; ей нужен провайдер (драйвер). Рассмотрим основные варианты:
T для DateTime).Важный нюанс: Драйвер Visual FoxPro существует только в 32-битной версии. Если ваш сервер 1С работает в 64-битном режиме, прямая попытка создать объект Новый COMОбъект("ADODB.Connection") и открыть соединение приведет к ошибке "Поставщик не найден".
Если вы столкнулись с ситуацией, когда сервер 1С x64 не видит 32-битный драйвер, рассмотрим два способа решения:
Проанализируем пример строки соединения для VFPOLEDB:
ПутьКПапке = "C:\ExportData\";
СтрокаСоединения = "Provider=VFPOLEDB;Data Source=" + ПутьКПапке + ";";
Обратите внимание: в качестве Data Source указывается путь к папке, где лежат или будут лежать файлы, а не путь к конкретному файлу.
В отличие от 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С:
DateTime.Главным условием успешной реализации является правильный подбор разрядности драйвера и использование корректных строк соединения. Помните, что для серверных вызовов в 64-битной среде лучше использовать 64-битный драйвер ACE OLEDB, если вам не критичны специфические типы данных FoxPro.