Как прочитать и записать данные в базу формата .db3 (SQLite) из 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При интеграции 1С с внешними информационными системами разработчики часто сталкиваются с файлами, имеющими расширение .db3. В отличие от старого и хорошо знакомого формата DBF, расширение .db3 указывает на то, что перед нами база данных SQLite версии 3. Это мощная, быстрая и компактная встраиваемая СУБД, которая хранит все таблицы, индексы и данные в одном единственном файле на диске.

В этой статье мы подробно разберем, какими средствами платформы 1С:Предприятие можно быстро организовать чтение и запись данных в формат SQLite, а также проанализируем ключевые особенности этой СУБД, которые необходимо учитывать при разработке.

Способ 1. Подключение через ADO и ODBC-драйвер (только для Windows)

Если решение развернуто на операционной системе Windows (как на стороне клиента, так и на стороне сервера 1С), самым доступным и классическим способом подключения является использование технологии ADO (ActiveX Data Objects). Для реализации этого метода в операционной системе обязательно должен быть предварительно установлен драйвер SQLite3 ODBC Driver.

Рассмотрим по шагам, как инициализировать соединение с базой данных .db3 и прочитать из нее данные:


// 1. Создаем COM-объект подключения к базе данных
БД_ODBC = Новый COMОбъект("ADODB.Connection");

// 2. Указываем путь к файлу базы данных .db3
ПутьКБД = "C:\my_folder\database.db3";

// 3. Формируем строку подключения с использованием установленного драйвера SQLite3 ODBC Driver
СтрокаПодключения = "Driver={SQLite3 ODBC Driver};Database=" + ПутьКБД + ";LongNames=0;Timeout=1000;NoTXN=0;SyncPragma=NORMAL;StepAPI=0;";

Попытка
    БД_ODBC.Open(СтрокаПодключения);
Исключение
    Сообщить("Не удалось подключиться к базе данных SQLite: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

После успешного открытия соединения мы можем выполнять любые SQL-запросы к таблицам базы данных. Разберем пример чтения данных с помощью объекта Recordset и обхода результата выборки в цикле:


ТекстЗапроса = "SELECT ID, ClientName, Phone FROM Clients";
ВыборкаДанных = Новый COMОбъект("ADODB.Recordset");

Попытка
    ВыборкаДанных.Open(ТекстЗапроса, БД_ODBC);
Исключение
    Сообщить("Ошибка выполнения запроса: " + ОписаниеОшибки());
    БД_ODBC.Close();
    Возврат;
КонецПопытки;

// Обходим полученные строки
Пока НЕ ВыборкаДанных.EOF Цикл
    Идентификатор = ВыборкаДанных.Fields("ID").Value;
    ИмяКлиента    = ВыборкаДанных.Fields("ClientName").Value;
    Телефон       = ВыборкаДанных.Fields("Phone").Value;
    
    // Обрабатываем полученные данные в коде 1С
    Сообщить(СтрШаблон("Клиент %1 (ID: %2), Телефон: %3", ИмяКлиента, Идентификатор, Телефон));
    
    ВыборкаДанных.MoveNext();
КонецЦикла;

ВыборкаДанных.Close();

Многих разработчиков интересует вопрос: можно ли изменять, удалять или добавлять данные в базу .db3? Да, безусловно. SQLite поддерживает стандартные SQL-транзакции. Выполним запись новой строки в таблицу базы данных:


НовоеИмя = "ООО Ромашка";
НовыйТелефон = "+7 (999) 111-22-33";

// Формируем INSERT-запрос
ЗапросЗаписи = "INSERT INTO Clients (ClientName, Phone) VALUES ('" + НовоеИмя + "', '" + НовыйТелефон + "')";

Попытка
    БД_ODBC.Execute(ЗапросЗаписи);
    Сообщить("Данные успешно добавлены!");
Исключение
    Сообщить("Ошибка при записи данных: " + ОписаниеОшибки());
КонецПопытки;

// Не забываем всегда закрывать соединение после работы!
БД_ODBC.Close();

Способ 2. Использование Native внешних компонент (кроссплатформенный метод)

Работа через COM-объект ADODB.Connection имеет существенный недостаток: она привязана к операционной системе Windows. Если сервер 1С:Предприятие работает под управлением Linux, или если вы разрабатываете кроссплатформенное мобильное приложение, этот вариант использовать не получится. В таких случаях на помощь приходят внешние компоненты (Native API).

Проанализируем два наиболее популярных инструмента:

  1. Внешняя компонента v8sqlite. Это специализированная библиотека, внутри которой уже находится сам движок СУБД SQLite. Ей не требуются внешние драйверы в операционной системе. Компонента одинаково стабильно работает в среде Windows и Linux (как для 32-битных, так и для 64-битных платформ). Важным преимуществом является то, что методы компоненты позволяют получать результат SQL-запроса напрямую в виде стандартной ТаблицыЗначений 1С, что избавляет от необходимости писать сложный код ручного обхода полей.
  2. Открытый Пакет Интеграций (OPI). Это готовое современное open-source решение для 1С, которое содержит в себе готовые модули интеграции со многими СУБД, включая SQLite. Использование таких пакетов позволяет абстрагироваться от написания «сырых» SQL-запросов и работать с таблицами базы данных через интуитивно понятные методы в объектном стиле 1С.

Важные технические особенности и ограничения СУБД SQLite

Для стабильной и высокопроизводительной работы интеграции крайне важно понимать архитектурные особенности файлов .db3:

1. Блокировки файлов при многопользовательской записи.
SQLite изначально проектировалась как встраиваемая СУБД для локального использования. В ней отсутствует серверный процесс, управляющий доступом. При выполнении транзакции записи (INSERT, UPDATE, DELETE) файл базы данных блокируется целиком. Если два сеанса 1С или внешних приложения попытаются одновременно произвести запись в один файл, то одно из них завершится критической ошибкой блокировки базы. Поэтому формат .db3 не подходит для высоконагруженных многопользовательских систем.

2. Различие кодировок (UTF-8 против UTF-16).
Внутренние строковые данные в 1С:Предприятие хранятся в кодировке UTF-16. В СУБД SQLite кодировкой по умолчанию почти всегда является UTF-8. При передаче больших объемов текстовой информации между СУБД и 1С происходит постоянное неявное перекодирование данных, что может снижать общую производительность. Если вы создаете базу данных .db3 с нуля программным путем, рекомендуется явно переопределить кодировку на UTF-16 с помощью служебной инструкции СУБД:

pragma encoding='UTF-16';

3. Хранение бинарных данных (картинок, файлов) в полях BLOB.
Формат SQLite поддерживает хранение двоичных данных в полях специального типа BLOB. При работе через технологию ADO передача бинарных массивов из 1С может вызывать сложности с приведением типов. При использовании современных внешних компонент вы можете легко передавать стандартный объект 1С ДвоичныеДанные напрямую в СУБД и обратно без промежуточного преобразования в текстовый формат Base64.

Подводя итог, можно сделать вывод: чтение и запись файлов .db3 из 1С реализуется достаточно просто. Для простых локальных задач на Windows отлично подойдет связка ADO + ODBC, а для кроссплатформенных и производительных корпоративных решений следует остановить свой выбор на нативных внешних компонентах.

← На главную