Загрузка данных из DBF в 1С:Предприятие 8.3 — четыре рабочих способа
Содержание
Открыть DBF файл
в 1С через Файл → Открыть, как таблицу Excel, не получится: платформа этот формат в окне не показывает. Зато в 1С:Предприятии 8.3 есть встроенный объект XBase, который читает DBF без драйверов и внешних программ. Небольшая обработка на десяток строк кода открывает файл, перебирает записи и пишет их в справочники или документы.
Частое заблуждение — что для загрузки DBF обязательно нужен ODBC-драйвер или Microsoft Access. Драйвер понадобится, только если вы подключаете DBF как внешний источник данных или работаете через ADO. Для разовой загрузки хватает XBase или конвертации файла в Excel. Всё, что описано ниже, общее для платформы и не зависит от конфигурации: БП 3.0, ЗУП 3.1, УТ 11 читают DBF одинаково.
Что такое DBF и как он дружит с 1С
DBF — табличный формат времён dBase, Clipper и FoxPro. Один файл — одна таблица: заголовок с описанием полей и записи фиксированной длины. До сих пор в DBF выгружают данные старые банковские клиенты, складские программы под DOS, справочники вроде КЛАДР, учётные системы на FoxPro.
Что нужно знать о формате перед загрузкой:
- 📏 Имена полей — латиница, до 10 символов:
NAME,INN,DATE_DOC. Кириллицы в именах полей быть не должно. - 🔤 Кодировка текста — либо OEM (кодовая страница 866, файлы из DOS-программ), либо ANSI (1251, файлы из Windows). От неё зависит, увидите вы «Иванов» или набор закорючек.
- 🗂 Типы полей — строка (C), число (N), дата (D), логическое (L), мемо (M). Visual FoxPro добавляет свои типы: целое, дата-время, денежный.
- 🗑 Удалённые записи — DBF не стирает строку сразу, а помечает её флагом удаления. Такие строки физически лежат в файле, пока его не «упакуют».
- 📎 Сопутствующие файлы — мемо-поля хранятся рядом в
.dbtили.fpt, индексы — в.ndx,.mdx,.cdx. Их копируют вместе с основным файлом.
В 1С 8.3 объект XBase доступен на сервере, в толстом клиенте и во внешнем соединении. В тонком клиенте и веб-клиенте его нет. Поэтому в управляемой форме код чтения DBF всегда выполняется на сервере, а файл туда передают через временное хранилище.
Какой способ открыть DBF в 1С выбрать
| Способ | Когда подходит | Что нужно | Ограничения |
|---|---|---|---|
Объект XBase | Разовая или регулярная загрузка, любой клиент | Внешняя обработка | Кодировки только OEM и ANSI |
| Внешний источник данных | DBF постоянно обновляется, нужно читать запросом | ODBC-драйвер, право менять конфигурацию | Разрядность драйвера должна совпадать с 1С |
| Конвертация в Excel / XML | Нет программиста, загрузка один раз | LibreOffice или Excel, обработка загрузки | Ручной шаг при каждой загрузке |
| ADO через COM | Нужен SQL-запрос к DBF прямо из кода | Провайдер ACE или VFP на Windows | Только Windows, проблемы с 64 битами |
Если не знаете, с чего начать, начинайте с XBase. Он не требует установки чего-либо на сервер и работает одинаково в файловой и клиент-серверной базе.
Подготовка DBF-файла к загрузке
Пять минут подготовки избавляют от большинства сюрпризов на этапе загрузки.
- Сделайте копию файла. Работайте с копией, а оригинал оставьте как есть. Если программа-источник ещё пишет в этот файл, закройте её или выгрузите файл заново.
- Скопируйте сопутствующие файлы. Рядом с
CLIENTS.DBFможет лежатьCLIENTS.DBTилиCLIENTS.FPT. Без них мемо-поля прочитаются пустыми или файл не откроется вовсе. - Определите кодировку. Откройте файл в LibreOffice Calc: при открытии DBF он спрашивает кодировку. Если кириллица читается в варианте «Кириллица (DOS/OS2-866)» — это OEM, если в «Кириллица (Windows-1251)» — ANSI.
- Выпишите структуру полей. Имя, тип, длина, число знаков после запятой. Структура пригодится для сопоставления с реквизитами 1С.
- Положите файл туда, где его увидит сервер 1С. Для клиент-серверной базы путь
C:\Obmen\означает диск сервера, а не вашего компьютера. Проще всего загружать файл через диалог выбора, как в примере ниже, — тогда путь не важен. - Укоротите имя файла, если пойдёте через ODBC или ADO. Старые драйверы dBase спотыкаются на именах длиннее 8 символов и на кириллице в имени.
Сопоставление полей удобно держать перед глазами при написании обработки:
Способ 1. Чтение DBF встроенным объектом XBase
Это главный способ, которым пользуются программисты 1С. Создайте внешнюю обработку
: в Конфигураторе Файл → Новый → Внешняя обработка. Добавьте форму, на неё — команду «Загрузить» и вставьте код модуля формы.
Клиентская часть: выбор файла
&НаКлиенте
Процедура Загрузить(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтотОбъект);
НачатьПомещениеФайла(Оповещение, , , Истина, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ПослеПомещенияФайла(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Не Результат Тогда
Возврат;
КонецЕсли;
Записи = ПрочитатьDBF(Адрес);
Сообщить("Прочитано записей: " + Формат(Записи.Количество(), "ЧГ=0"));
КонецПроцедуры
Пользователь выбирает файл на своём компьютере, платформа кладёт его во временное хранилище и возвращает адрес. Код одинаково работает в тонком клиенте, толстом клиенте и в файловой базе.
Серверная часть: чтение записей
&НаСервереБезКонтекста
Функция ПрочитатьDBF(АдресФайла)
ИмяФайла = ПолучитьИмяВременногоФайла("dbf");
ДанныеФайла = ПолучитьИзВременногоХранилища(АдресФайла);
ДанныеФайла.Записать(ИмяФайла);
База = Новый XBase;
База.Кодировка = КодировкаXBase.OEM; // для файлов из Windows-программ — ANSI
База.ОткрытьФайл(ИмяФайла, , Истина); // третий параметр — только чтение
Если Не База.Открыта() Тогда
ВызватьИсключение "Не удалось открыть DBF-файл";
КонецЕсли;
Записи = Новый Массив;
ЕстьЗапись = База.Первая();
Пока ЕстьЗапись Цикл
Запись = Новый Структура;
Для Каждого Поле Из База.Поля Цикл
Запись.Вставить(Поле.Имя, База.ПолучитьЗначениеПоля(Поле.Имя));
КонецЦикла;
Записи.Добавить(Запись);
ЕстьЗапись = База.Следующая();
КонецЦикла;
База.ЗакрытьФайл();
УдалитьФайлы(ИмяФайла);
Возврат Записи;
КонецФункции
Функция возвращает массив структур: ключ — имя поля, значение — содержимое ячейки. Массив структур, в отличие от таблицы значений, можно передать на клиент. Вместо возврата массива можно сразу внутри цикла искать контрагента по ИНН и создавать документ.
Тонкости XBase, о которых узнают на практике
- 🔁 Кодировка ставится до открытия файла. Если поменять её после
ОткрытьФайл, текст уже прочитается неверно. - 🗑 Помеченные на удаление записи по умолчанию не видны: за это отвечает свойство
ОтображатьУдаленные. Если в источнике строки удаляли пометкой, а вам нужны все — установите его вИстина. - 🔢 Числа приходят числами, даты — датами. Пустая дата в DBF превращается в пустую дату 1С, а не в ошибку, но строки с пробелами в конце придётся обрезать через
СокрЛП(). - 🔒 Режим только чтения (третий параметр
Истина) защищает исходный файл и позволяет открыть его, даже если файл помечен как доступный только для чтения.
Если кодировка неизвестна, прочитайте первые 5 записей в обеих кодировках и выведите строковое поле через Сообщить(). Нормальная кириллица появится только в одном варианте.
Способ 2. DBF как внешний источник данных
Внешний источник данных — объект конфигурации, который позволяет обращаться к чужой таблице запросом, как к своему справочнику. Подходит, когда DBF лежит в общей папке и постоянно обновляется другой программой, а 1С должна читать актуальные данные.
Что установить
Внешний источник работает через ODBC, поэтому на компьютере, где выполняется код, нужен драйвер dBase:
- Microsoft dBase Driver (*.dbf) — есть в составе Windows, но только 32-битный;
- Microsoft Access dBASE Driver (*.dbf, *.ndx, *.mdx) — ставится вместе с пакетом Microsoft Access Database Engine, бывает 32- и 64-битным;
- Microsoft Visual FoxPro Driver — для файлов FoxPro с типами, которых нет в dBase; только 32-битный.
Разрядность драйвера должна совпадать с разрядностью процесса 1С, который выполняет запрос. В клиент-серверной базе это рабочий процесс сервера 1С, а не ваш клиент. 64-битный сервер 1С не увидит 32-битный драйвер.
Как подключить
- В Конфигураторе откройте ветку
Общие → Внешние источники данныхи добавьте новый источник, напримерДанныеDBF. - В источнике добавьте таблицу. Её можно описать вручную: имя таблицы равно имени файла без расширения, поля — по структуре DBF. Либо загрузить описание из источника через конструктор, если соединение уже настроено.
- Обновите конфигурацию базы данных.
- В режиме Предприятия или из кода задайте строку соединения. Для системного драйвера dBase она выглядит так:
Driver={Microsoft dBase Driver (*.dbf)};DriverID=277;Dbq=C:\Obmen\;
Параметр Dbq указывает на папку, а не на файл: каждый DBF в этой папке становится отдельной таблицей.
- Установите соединение программно:
Параметры = Новый ПараметрыСоединенияВнешнегоИсточникаДанных;
Параметры.СтрокаСоединения = "Driver={Microsoft dBase Driver (*.dbf)};DriverID=277;Dbq=C:\Obmen\;";
ВнешниеИсточникиДанных.ДанныеDBF.УстановитьОбщиеПараметрыСоединения(Параметры);
ВнешниеИсточникиДанных.ДанныеDBF.УстановитьСоединение();
После этого DBF читается обычным запросом: ВЫБРАТЬ * ИЗ ВнешнийИсточникДанных.ДанныеDBF.Таблица.CLIENTS. Можно соединять его с таблицами 1С, фильтровать и группировать.
Для этого способа нужно менять конфигурацию. Если база на поддержке и вы не хотите снимать её с замков, выберите XBase во внешней обработке — он конфигурацию не трогает.
Способ 3. Конвертация DBF в Excel или XML
Если программиста под рукой нет, DBF проще превратить в формат, который 1С загружает штатно.
Через Excel или LibreOffice
- Откройте DBF в LibreOffice Calc и выберите кодировку, при которой кириллица читается.
- Проверьте даты и суммы: числа с точкой вместо запятой иногда превращаются в текст.
- Сохраните файл как
.xlsx. - Загрузите таблицу в 1С. В справочниках БП 3.0 и УТ 11, например в списке номенклатуры, есть команда загрузки из файла. Для остального подходит внешняя обработка загрузки из табличного документа: она сопоставляет колонки с реквизитами и ищет существующие элементы по ИНН, коду или наименованию.
Excel тоже открывает DBF, но кодировку не спрашивает и с DOS-файлами часто показывает закорючки. Сохранять обратно в DBF современный Excel не умеет, LibreOffice — умеет.
Через XML
XML-путь нужен, когда загрузку делают в базе без возможности поставить драйверы или написать обработку чтения DBF, но есть готовый механизм загрузки XML, например правила обмена.
- Конвертируйте DBF в XML внешней утилитой или программой-источником, если она умеет такой экспорт.
- Приведите структуру к той, которую ожидает обработка загрузки: один элемент на запись, поля — вложенными элементами или атрибутами.
- Загрузите файл обработкой, которая читает XML через объект
ЧтениеXML, или правилами обмена.
Этот вариант длиннее остальных. Выбирайте его, когда XML уже используется в вашем обмене и под него есть проверенная обработка.
Способ 4. ADO и COM-соединение для автоматической загрузки
ADO даёт SQL-доступ к DBF прямо из кода 1С, без описания внешнего источника в конфигурации. Работает только на Windows, на той машине, где выполняется код. Нужен провайдер Microsoft ACE OLEDB из пакета Access Database Engine.
Соединение = Новый COMОбъект("ADODB.Connection");
Соединение.Open("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Obmen\;Extended Properties=dBASE IV;");
Набор = Соединение.Execute("SELECT * FROM CLIENTS");
Пока Не Набор.EOF Цикл
Наименование = СокрЛП(Набор.Fields("NAME").Value);
ИНН = СокрЛП(Набор.Fields("INN").Value);
Сообщить(Наименование + " — " + ИНН);
Набор.MoveNext();
КонецЦикла;
Набор.Close();
Соединение.Close();
Плюс ADO — фильтры и сортировка на стороне драйвера: SELECT * FROM CLIENTS WHERE SUMMA > 0. Минус — та же история с разрядностью, а провайдер Visual FoxPro (VFPOLEDB) существует только в 32-битном варианте.
Обратное направление: внешняя программа пишет в 1С
Иногда удобнее, чтобы скрипт или программа на стороне источника сама читала DBF и создавала объекты в 1С. Для этого используют COM-соединение V83.COMConnector: внешний процесс подключается к базе, получает доступ к справочникам и документам и записывает данные. Компонента регистрируется на компьютере вместе с платформой, а её разрядность тоже должна совпадать с разрядностью программы, которая её вызывает.
Регулярную загрузку по расписанию удобнее делать регламентным заданием в самой базе с объектом XBase: меньше движущихся частей и не нужен Windows-планировщик.
Ошибки при загрузке DBF в 1С и что с ними делать
XBase поменяйте КодировкаXBase.OEM на ANSI или наоборот, до вызова ОткрытьФайл. В LibreOffice переоткройте файл с другой кодировкой.Отдельный случай — файлы Visual FoxPro с типами «дата-время», «целое» или «денежный». Если XBase такой файл не открывает или читает поля с ошибкой, пересохраните таблицу в формат dBase в программе-источнике или в LibreOffice. Другой вариант — читать её драйвером Visual FoxPro на 32-битном процессе 1С.