При работе с внешними информационными системами часто возникает задача выгрузки данных в формате DBF. Однако разработчики в 1С сталкиваются с жестким ограничением: при попытке задать русское имя поля с помощью стандартного объекта XBase система выдает ошибку «Неверное имя поля». Разберем, почему это происходит и как решить задачу с помощью альтернативных механизмов.
Проанализируем ситуацию: объект XBase в платформе 1С жестко следует стандартам dBase III/IV. Согласно этой спецификации, заголовки полей имеют строгое ограничение:
Платформа 1С выполняет внутреннюю проверку при вызове метода ДБФ.поля.Добавить(). Если в названии встречается кириллица, проверка блокирует операцию еще до фактической записи в файл. Поэтому стандартными средствами 1С создать DBF с русскими колонками невозможно.
Для того чтобы обойти платформенное ограничение, мы можем воспользоваться механизмом COM-соединения и библиотекой ADO. Этот способ позволяет работать с DBF-файлом не как с объектом базы данных 1С, а как с внешней таблицей через SQL-запросы. В этом случае драйвер базы данных берет на себя создание структуры, игнорируя внутренние запреты 1С.
Рассмотрим пошагово, как реализовать этот метод в среде 1С v8.3. Для работы нам понадобится установленный в системе драйвер (провайдер). Наиболее популярные:
Посмотрим на пример кода, который создает файл и записывает в него данные с использованием русских названий колонок. Обратите внимание, что в ADO путь к папке считается «Базой данных», а имя файла — «Таблицей».
// Определяем путь к папке и имя файла
ПутьКПапке = "C:\Export\";
ИмяФайла = "AgentsData.dbf";
// Проверяем наличие файла и удаляем его перед созданием
ФайлНаДиске = Новый Файл(ПутьКПапке + ИмяФайла);
Если ФайлНаДиске.Существует() Тогда
УдалитьФайлы(ПутьКПапке + ИмяФайла);
КонецЕсли;
// Создаем COM-объект для связи
Connection = Новый COMОбъект("ADODB.Connection");
// Строка соединения для драйвера Jet 4.0
// Для 64-битных систем используйте Microsoft.ACE.OLEDB.12.0
СтрокаСоединения = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + ПутьКПапке + ";Extended Properties=""dBASE IV;"";";
Попытка
Connection.Open(СтрокаСоединения);
// Формируем SQL-запрос на создание таблицы с русскими именами полей
// Важно: длина русского имени не должна превышать 10 символов
ТекстЗапроса = "CREATE TABLE " + СтрЗаменить(ИмяФайла, ".dbf", "") + " (
|РАЙОН char(50),
|ПОСЕЛЕНИЕ char(50),
|УЛИЦА char(50),
|ДОЛГ decimal(15,2))";
Connection.Execute(ТекстЗапроса);
// Пример добавления записи
ЗапросЗаписи = "INSERT INTO " + СтрЗаменить(ИмяФайла, ".dbf", "") + " (РАЙОН, ПОСЕЛЕНИЕ, УЛИЦА, ДОЛГ)
|VALUES ('Центральный', 'Лесное', 'Мира', 1500.50)";
Connection.Execute(ЗапросЗаписи);
Connection.Close();
Сообщить("Файл успешно создан");
Исключение
Сообщить("Ошибка при работе с ADO: " + ОписаниеОшибки());
КонецПопытки;
Выясним важные детали, которые необходимо учитывать при использовании данного подхода:
ДБФ = Новый XBase. Объект XBase выдаст ошибку при попытке прочитать структуру такого файла. Читать его придется также через ADO.CharacterSet=ANSI в строке соединения или использованием файла schema.ini в папке с данными.Таким образом, мы выяснили, что использование ADODB.Connection является единственным надежным способом создания DBF с кириллическими заголовками непосредственно из кода 1С, обходя ограничения встроенного языка.