При интеграции 1С с внешними информационными системами разработчики часто сталкиваются с файлами, имеющими расширение .db3. В отличие от старого и хорошо знакомого формата DBF, расширение .db3 указывает на то, что перед нами база данных SQLite версии 3. Это мощная, быстрая и компактная встраиваемая СУБД, которая хранит все таблицы, индексы и данные в одном единственном файле на диске.
В этой статье мы подробно разберем, какими средствами платформы 1С:Предприятие можно быстро организовать чтение и запись данных в формат SQLite, а также проанализируем ключевые особенности этой СУБД, которые необходимо учитывать при разработке.
Если решение развернуто на операционной системе 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();
Работа через COM-объект ADODB.Connection имеет существенный недостаток: она привязана к операционной системе Windows. Если сервер 1С:Предприятие работает под управлением Linux, или если вы разрабатываете кроссплатформенное мобильное приложение, этот вариант использовать не получится. В таких случаях на помощь приходят внешние компоненты (Native API).
Проанализируем два наиболее популярных инструмента:
ТаблицыЗначений 1С, что избавляет от необходимости писать сложный код ручного обхода полей.Для стабильной и высокопроизводительной работы интеграции крайне важно понимать архитектурные особенности файлов .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, а для кроссплатформенных и производительных корпоративных решений следует остановить свой выбор на нативных внешних компонентах.