К статье
Практический материал

Администрирование · 15 мин

DBF в SQL Server: как перенести данные для работы с 1С

Как перенести данные из DBF в SQL Server для работы с 1С: загрузка через ADO, OPENROWSET, конвертация баз 1С 7.7 с DBF на SQL, типичные ошибки и проверка результата.

Формат DBF прочно связан с 1С: именно в файлах DBF хранились данные популярной платформы 1С:Предприятие 7.7, а в более поздних версиях DBF остался распространённым форматом обмена — через него загружают классификаторы, курсы валют, банковские выписки и прайс-листы. Задача «переложить DBF в SQL Server» возникает в двух типовых ситуациях: при миграции старой файловой базы 1С 7.7 на SQL-версию и при интеграции, когда данные из внешних DBF-файлов нужно обработать средствами SQL Server или загрузить в современную конфигурацию.

Прямой «кнопки» преобразования DBF в SQL Server не существует: это разные механизмы хранения. DBF — файл табличной структуры с ограничениями на длину имён полей (до 10 символов) и типы данных, SQL Server — полноценная СУБД с типизированными таблицами, индексами и транзакциями. Поэтому перенос всегда состоит из двух этапов: чтение DBF и запись в таблицу SQL Server с корректным сопоставлением типов.

Выбор инструмента зависит от объёма и регулярности задачи. Для разовой загрузки небольшого файла достаточно встроенных средств SQL Server (OPENROWSET через OLE DB-провайдер или мастер импорта). Для миграции всей базы 1С 7.7 логичнее использовать штатную процедуру конвертации через конфигуратор. Для регулярного обмена удобны скрипты на T-SQL, PowerShell или обработки внутри 1С через ADO.

Когда DBF нужно переносить в SQL Server

Первая ситуация — миграция учётной системы. База 1С 7.7 в формате DBF/CDX хранится в каталоге с файлами вида 1SJOURN.DBF, SC*.DBF, DH*.DBF, DT*.DBF. При росте объёма данных файловый формат становится узким местом: ограничение на размер файла (около 2 ГБ), риски повреждения индексов при сбоях сети, низкая скорость при одновременной работе нескольких пользователей. Переход на SQL-версию 1С 7.7 решает эти проблемы, и данные из DBF-файлов при этом переносятся в базу SQL Server.

Вторая ситуация — интеграционная. Внешняя система (кассовое ПО, банк-клиент, старая складская программа) выгружает данные в DBF, а обработать их нужно в SQL Server: объединить с другими таблицами, построить отчётность, отдать в 1С 8.x через COM или веб-сервис. Здесь DBF выступает транспортным форматом, и задача сводится к регулярному импорту файлов в промежуточные таблицы.

Третья ситуация — архивный доступ. Старая база 7.7 снята с поддержки, но данные нужны для сверок и налоговых проверок. Выгрузив ключевые таблицы из DBF в SQL Server, можно строить запросы и отчёты без запуска устаревшей платформы.

Маршрут решения

Как выбрать способ переноса

Нужно перевести всю базу 1С 7.7 на SQLИспользуйте штатный механизм: загрузка данных из DBF-версии в пустую SQL-базу через конфигуратор (Загрузить данные) или внешние обработки переноса
Нужно разово импортировать один-два DBF-файлаПримените мастер импорта в SQL Server Management Studio или OPENROWSET с провайдером VFPOLEDB
Импорт повторяется регулярноНапишите скрипт T-SQL с OPENROWSET или пакет SSIS и запускайте по расписанию через SQL Server Agent
DBF читается из кода 1С 8.xИспользуйте ADODB.Connection с провайдером VFPOLEDB прямо в обработке 1С

Подготовка: что проверить в DBF-файле перед импортом

До запуска импорта откройте DBF-файл и выясните его структуру. Критичны три параметра: кодировка, типы полей и наличие memo-полей. Русскоязычные данные в DBF обычно записаны в кодировке CP866 (DOS) или CP1251 (Windows). Если импортировать файл с неверно определённой кодировкой, вместо русских букв в SQL Server попадут нечитаемые символы — и исправить это внутри базы уже сложно.

Имена полей в DBF ограничены десятью символами, поэтому в файлах 1С 7.7 встречаются колонки вида SP609, IDDOC, DATE_TIME_IDDOC. Перед импортом полезно составить соответствие этих технических имён осмысленным названиям колонок в целевой таблице SQL Server — иначе анализировать данные будет трудно.

Проверьте также целостность файла: повреждённые заголовки и «битые» индексные файлы CDX — частая причина ошибок чтения. Если файл открывается в 1С 7.7 или в просмотрщике DBF без ошибок, с высокой вероятностью он прочитается и OLE DB-провайдером. Убедитесь, что файл не заблокирован работающим приложением — открытый монопольно DBF может не читаться извне.

КодировкаCP866 или CP1251

Откройте файл просмотрщиком: русские буквы читаются — кодировка определена верно

Имена полейДо 10 символов

Составьте таблицу соответствия технических имён понятным названиям колонок

Размер файлаДо ~2 ГБ

Файлы больше лимита DBF обычно повреждены или разделены — проверьте целостность

Memo-поляФайл .FPT/.DBT рядом

Если есть memo-файл, он должен лежать рядом с DBF, иначе часть данных не прочитается

Импорт DBF в SQL Server через OPENROWSET

Наиболее контролируемый способ — чтение DBF напрямую из T-SQL через OLE DB-провайдер. Для файлов формата dBase/FoxPro используется провайдер Microsoft VFPOLEDB (Visual FoxPro OLE DB Provider) либо старый Jet 4.0 с указанием формата dBase. Провайдер должен быть установлен на сервере и разрешён для распределённых запросов.

Типовой запрос выглядит так: сначала включается возможность ad-hoc-запросов, затем выполняется SELECT из файла. Важная деталь: в качестве источника указывается каталог, где лежит DBF, а сам файл адресуется в запросе как таблица.

EXEC sp_configure 'show advanced options', 1;

RECONFIGURE;

EXEC sp_configure 'Ad Hoc Distributed Queries', 1;

RECONFIGURE;

SELECT *

INTO dbo.Import_Journal

FROM OPENROWSET('VFPOLEDB',

'C:\DbfData\';'';'',

'SELECT * FROM 1SJOURN');

Конструкция SELECT ... INTO создаёт таблицу автоматически, но типы колонок при этом подбираются провайдером и не всегда оптимальны: числовые поля могут стать float, строки — varchar завышенной длины. Для постоянных таблиц лучше заранее создать целевую таблицу с нужными типами (int, decimal, date, nvarchar) и загружать данные через INSERT INTO ... SELECT с явным преобразованием.

Если сервер 64-разрядный, учитывайте: VFPOLEDB существует только в 32-битной версии, и 64-битный SQL Server не сможет его загрузить напрямую. Обходные пути — запуск импорта через 32-битный процесс (например, SSIS в 32-битном режиме или скрипт на машине с 32-битным клиентом) либо предварительная конвертация DBF в CSV.

Импорт через мастер SSMS и SSIS

Для разовой загрузки удобен графический мастер: в SQL Server Management Studio щёлкните правой кнопкой по базе, выберите «Задачи → Импорт данных». В качестве источника укажите OLE DB-провайдер или, если DBF недоступен напрямую, предварительно сохранённый CSV. Мастер позволяет визуально сопоставить колонки источника и назначения, задать типы данных и сразу проверить результат.

Для регулярного обмена мастер умеет сохранять пакет SSIS. Такой пакет можно доработать: добавить очистку staging-таблицы перед загрузкой, журналирование числа импортированных строк, обработку ошибок с записью отклонённых строк в отдельную таблиц. Запуск пакета настраивается через задание SQL Server Agent по расписанию.

Ограничение то же, что и у OPENROWSET: на 64-битном сервере мастер импорта по умолчанию тоже 64-битный и не увидит 32-битный VFPOLEDB. В мастере есть переключатель «32-разрядная среда выполнения» при сохранении и запуске пакета — используйте его.

Порядок импорта DBF через OPENROWSET
  1. 1
    Скопируйте DBF (и memo-файл, если есть) в каталог, доступный учётной записи SQL Server
  2. 2
    Установите VFPOLEDB и включите Ad Hoc Distributed Queries
  3. 3
    Выполните SELECT через OPENROWSET без INTO — убедитесь, что данные и кодировка читаются правильно
  4. 4
    Создайте целевую таблицу с явными типами данных
  5. 5
    Загрузите данные через INSERT INTO ... SELECT с преобразованием типов
  6. 6
    Проверьте количество строк и выборочно сверьте значения с источником

Перенос базы 1С 7.7 из DBF в SQL-формат

Миграция всей базы 7.7 делается не прямым копированием DBF-файлов, а штатными средствами платформы. Стандартная схема: в конфигураторе DBF-версии выполняется выгрузка данных («Администрирование → Выгрузить данные»), создаётся пустая SQL-база той же конфигурации, и в неё выполняется загрузка («Администрирование → Загрузить данные»). Платформа сама создаёт в SQL Server таблицы и переносит содержимое.

Перед выгрузкой обязательно выполните тестирование и исправление информационной базы и убедитесь, что все пользователи вышли из системы. После загрузки в SQL-базу проверьте итоги: сверните и восстановите итоги по регистрам, сравните оборотно-сальдовые ведомости в старой и новой базах за несколько периодов. Расхождения после конвертации — признак того, что выгрузка прошла с ошибками или база была повреждена ещё в DBF-формате.

Для SQL-версии 1С 7.7 потребуется настроить на SQL Server отдельную базу с параметрами, которые требует платформа (в частности, определённый порядок сортировки — Cyrillic_General_CI_AS, и режим совместимости). Эти требования зависят от релиза платформы, поэтому сверяйтесь с документацией к вашей версии. Учётной записи, под которой 1С подключается к серверу, нужны права на создание объектов в этой базе.

Чтение DBF из кода 1С 8.x через ADO

Когда DBF нужно загрузить в современную конфигурацию 1С 8.x (а SQL Server выступает промежуточным звеном или не нужен вовсе), удобно читать файл напрямую через ADO. В коде 1С создаётся объект ADODB.Connection со строкой подключения к провайдеру VFPOLEDB, затем выполняется запрос к файлу как к таблице.

Примерная логика: открыть соединение с указанием каталога DBF, выполнить SELECT, пройти по записям Recordset и создать элементы справочников или документы. Кодировку в этом случае задаёт сам провайдер по заголовку файла, но при «кракозябрах» помогает явное указание кодовой страницы в строке подключения или предварительная перекодировка файла.

Альтернатива без ADO — встроенный объект XBase, доступный в платформе 1С 8.x. Он читает и пишет DBF без внешних провайдеров и работает в том числе на Linux-сервере 1С. Ограничение — XBase оперирует файлом напрямую и требует аккуратной работы с индексами и блокировками, зато не зависит от разрядности системы и установленных драйверов.

Сравнение способов чтения DBF

OPENROWSET + VFPOLEDB

Быстро и прямо в T-SQL; не работает на 64-битном SQL Server без обходных решений

Мастер импорта SSMS / SSIS

Наглядно, подходит для разовых и регламентных загрузок; требует настройки 32-битного режима

Штатная выгрузка/загрузка 1С 7.7

Единственный корректный способ миграции всей базы; медленно на больших объёмах

ADO из кода 1С 8.x

Гибкая обработка при загрузке; зависит от установленного провайдера

XBase в 1С 8.x

Без внешних зависимостей, кроссплатформенно; только файловый доступ, нет SQL-запросов

Типичные ошибки и как их диагностировать

Ошибка «Провайдер не зарегистрирован» означает, что VFPOLEDB не установлен или недоступен из-за разрядности. Решение — установить провайдер и убедиться, что процесс, выполняющий импорт, 32-битный, либо перейти на CSV-промежутку. Ошибка доступа к файлу чаще всего связана с правами: учётная запись службы SQL Server должна иметь чтение на каталог с DBF, а сетевые пути лучше указывать в формате UNC.

«Кракозябры» вместо русского текста — следствие неверной кодировки. Проверьте заголовок DBF (байт кодовой страницы) и при необходимости перекодируйте файл из CP866 в CP1251 до импорта. Обрезанные строки и числа в экспоненциальной записи говорят о неправильном автоматическом сопоставлении типов — создавайте целевую таблицу вручную.

При миграции 1С 7.7 типичная проблема — зависание или обрыв загрузки на больших таблицах журналов. Помогает выгрузка без индексов, увеличение времени ожидания на SQL Server и загрузка по частям через специализированные обработки переноса, которые пишут данные порциями и умеют продолжать с места обрыва.

Типичные ошибки при переносе DBF в SQL Server
01
Импорт сразу в боевые таблицы без staging-слоя — при ошибке сопоставления данные портятся и требуют восстановления из копии
02
Игнорирование кодировки — русские строки превращаются в нечитаемый набор символов, исправление внутри базы трудоёмко
03
Автоматическое создание таблицы через SELECT INTO — типы колонок подбираются неточно, числа теряют точность
04
Попытка открыть 64-битным SQL Server 32-битный провайдер VFPOLEDB — ошибка регистрации провайдера
05
Редактирование таблиц SQL-базы 1С напрямую — рассогласование итогов и повреждение данных
06
Импорт без сверки количества строк и контрольных сумм — часть записей теряется незаметно

Проверка результата после переноса

Минимальная проверка — сравнение количества записей: посчитайте строки в DBF (через тот же OPENROWSET с COUNT(*)) и в целевой таблице SQL Server. Затем выборочно сверьте несколько десятков строк по ключевым полям: даты, суммы, строковые значения с русскими буквами. Для финансовых данных полезно сравнить суммы по числовым колонкам — расхождение укажет на потерю точности.

При миграции базы 1С 7.7 контроль строже: сформируйте в старой и новой базе одинаковые отчёты (оборотно-сальдовая ведомость, анализ счёта) за одинаковые периоды и сравните итоги. Совпадение оборотов и сальдо — главный признак успешной конвертации. После проверки сделайте резервную копию SQL-базы и только потом переводите на неё пользователей.

Контрольные точки

Как проверить результат импорта

Количество строк
Норма

Совпадает с числом записей в DBF

Тревожный признак

Меньше — часть записей отклонена или файл повреждён

Русский текст
Норма

Строки читаются корректно

Тревожный признак

Кракозябры — неверная кодировка при чтении

Числа и даты
Норма

Суммы совпадают, даты в допустимом диапазоне

Тревожный признак

Округление, NULL вместо значений, даты сдвинуты

Итоги отчётов 1С 7.7
Норма

ОСВ в старой и новой базе совпадает

Тревожный признак

Расхождения оборотов — конвертация прошла с ошибками

Итог

Что важно запомнить

DBF в SQL Server переносится через OLE DB-провайдер и OPENROWSET, мастер импорта SSMS/SSIS или штатную выгрузку-загрузку 1С 7.7. Контролируйте кодировку, типы колонок и разрядность провайдера, загружайте данные через staging-таблицу и обязательно сверяйте количество строк и итоги после переноса.

Частые вопросы

Можно ли подключить DBF к SQL Server как связанный сервер?

Да, через sp_addlinkedserver с провайдером VFPOLEDB или Jet, указав в качестве источника каталог с файлами. Тогда к DBF можно обращаться в запросах как к таблицам связанного сервера. Практическая ценность ограничена низкой производительностью и 32-битным ограничением провайдера, поэтому для постоянной работы данные лучше один раз импортировать в нативные таблицы.

Почему OPENROWSET выдаёт ошибку «Ad hoc access to OLE DB provider has been denied»?

Распределённые ad-hoc-запросы по умолчанию отключены. Включите их: sp_configure 'Ad Hoc Distributed Queries', 1 с последующим RECONFIGURE. Дополнительно для провайдера может потребоваться параметр DisallowAdhocAccess = 0 в реестре. После импорта функцию рекомендуется снова отключить из соображений безопасности.

Как импортировать DBF, если SQL Server 64-разрядный, а провайдер не работает?

Три рабочих пути: запустить импорт через SSIS-пакет в 32-битном режиме; выполнить загрузку с отдельной машины или через 32-битный скрипт (PowerShell/cscript с ADO), который пишет данные в SQL Server по обычному подключению; либо конвертировать DBF в CSV любым просмотрщиком и импортировать CSV штатными средствами.

Чем читать DBF в 1С 8.x без установки драйверов?

Встроенным объектом XBase: он открывает DBF-файл напрямую, позволяет перебирать записи, читать и изменять поля, работает на Windows и Linux. Для разовой загрузки справочников и табличных данных этого достаточно, внешние провайдеры не требуются.

Можно ли просто скопировать файлы DBF базы 7.7 в каталог SQL Server?

Нет. SQL Server не работает с DBF как со своими файлами данных, а SQL-версия 1С 7.7 хранит данные в собственной структуре таблиц. Перенос выполняется только через выгрузку данных из DBF-базы и загрузку в SQL-базу средствами конфигуратора или специализированными обработками.

Что делать, если DBF-файл повреждён и не читается?

Сначала попробуйте открыть файл в самой 1С 7.7 и выполнить тестирование и исправление базы. Если не помогает, используйте утилиты восстановления DBF или откройте файл в XBase-режиме с пропуском повреждённых записей. Индексные файлы CDX можно удалить и пересоздать — данные в них не хранятся. Перед любыми манипуляциями сделайте копию исходных файлов.