Администрирование · 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, можно строить запросы и отчёты без запуска устаревшей платформы.
Как выбрать способ переноса
Подготовка: что проверить в 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 может не читаться извне.
Откройте файл просмотрщиком: русские буквы читаются — кодировка определена верно
Составьте таблицу соответствия технических имён понятным названиям колонок
Файлы больше лимита DBF обычно повреждены или разделены — проверьте целостность
Если есть 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-разрядная среда выполнения» при сохранении и запуске пакета — используйте его.
- 1Скопируйте DBF (и memo-файл, если есть) в каталог, доступный учётной записи SQL Server
- 2Установите VFPOLEDB и включите Ad Hoc Distributed Queries
- 3Выполните SELECT через OPENROWSET без INTO — убедитесь, что данные и кодировка читаются правильно
- 4Создайте целевую таблицу с явными типами данных
- 5Загрузите данные через INSERT INTO ... SELECT с преобразованием типов
- 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
Быстро и прямо в T-SQL; не работает на 64-битном SQL Server без обходных решений
Наглядно, подходит для разовых и регламентных загрузок; требует настройки 32-битного режима
Единственный корректный способ миграции всей базы; медленно на больших объёмах
Гибкая обработка при загрузке; зависит от установленного провайдера
Без внешних зависимостей, кроссплатформенно; только файловый доступ, нет SQL-запросов
Типичные ошибки и как их диагностировать
Ошибка «Провайдер не зарегистрирован» означает, что VFPOLEDB не установлен или недоступен из-за разрядности. Решение — установить провайдер и убедиться, что процесс, выполняющий импорт, 32-битный, либо перейти на CSV-промежутку. Ошибка доступа к файлу чаще всего связана с правами: учётная запись службы SQL Server должна иметь чтение на каталог с DBF, а сетевые пути лучше указывать в формате UNC.
«Кракозябры» вместо русского текста — следствие неверной кодировки. Проверьте заголовок DBF (байт кодовой страницы) и при необходимости перекодируйте файл из CP866 в CP1251 до импорта. Обрезанные строки и числа в экспоненциальной записи говорят о неправильном автоматическом сопоставлении типов — создавайте целевую таблицу вручную.
При миграции 1С 7.7 типичная проблема — зависание или обрыв загрузки на больших таблицах журналов. Помогает выгрузка без индексов, увеличение времени ожидания на SQL Server и загрузка по частям через специализированные обработки переноса, которые пишут данные порциями и умеют продолжать с места обрыва.
Проверка результата после переноса
Минимальная проверка — сравнение количества записей: посчитайте строки в DBF (через тот же OPENROWSET с COUNT(*)) и в целевой таблице SQL Server. Затем выборочно сверьте несколько десятков строк по ключевым полям: даты, суммы, строковые значения с русскими буквами. Для финансовых данных полезно сравнить суммы по числовым колонкам — расхождение укажет на потерю точности.
При миграции базы 1С 7.7 контроль строже: сформируйте в старой и новой базе одинаковые отчёты (оборотно-сальдовая ведомость, анализ счёта) за одинаковые периоды и сравните итоги. Совпадение оборотов и сальдо — главный признак успешной конвертации. После проверки сделайте резервную копию SQL-базы и только потом переводите на неё пользователей.
Как проверить результат импорта
Совпадает с числом записей в DBF
Меньше — часть записей отклонена или файл повреждён
Строки читаются корректно
Кракозябры — неверная кодировка при чтении
Суммы совпадают, даты в допустимом диапазоне
Округление, NULL вместо значений, даты сдвинуты
ОСВ в старой и новой базе совпадает
Расхождения оборотов — конвертация прошла с ошибками
Что важно запомнить
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 можно удалить и пересоздать — данные в них не хранятся. Перед любыми манипуляциями сделайте копию исходных файлов.