Коннектор SQLite для 1С (open-source)

14.01.25

Разработка - Разработка внешних компонент

Библиотека для работы с базами SQLite из 1С на основе внешней компоненты. Для Linux и Windows, бесплатно и с открытым исходным кодом!

Если вы не слышали ранее об Открытом Пакете Интеграций (что вполне вероятно), то небольшая вводная часть ниже, под катом. Для тех, кто уже знаком с ОПИ, данный раздел можно пропустить.

 
 Что такое Открытый Пакет Интеграций

 

Открытый Пакет Интеграций (ОПИ) - это open-source набор методов для простой и быстрой интеграции с различными популярными API. Он состоит из аналогичных по функционалу 1С-расширения (CFE), OS-пакета и программы для Windows и Linux, которые предоставляют готовые функции для работы с целым набором различных онлайн-сервисов.


  • ОПИ бесплатен и имеет открытый исходный код на GitHub. Вы всегда можете получить последнюю версию библиотеки на странице репозитория, а подписавшись - узнавать о выходе обновлений. Все релизы сопровождаются статьями на Инфостарт и разделами единой документации. На Инфостарт вы можете подписаться уже хоть сейчас, а про документацию я расскажу далее.

 

 

 

  • Удобная единая документация. Она расположена на сайте opi.neocities.org и содержит в себе всю информацию, необходимую для работы: инструкции по предварительным действиям для начала интеграции, описания всех методов с параметрами и возвращаемыми значениями, примеры кода и т.д. Каждый API имеет там свой раздел.

 

 

 

 

  • Простая установка. ОПИ распространяется во множестве вариантах: как XML файлы расширения, как EDT проект расширения, как файл расширения формата .cfe (версия 1С 8.3.9), как файл пакета для OneScript и еще в целом наборе пакетов и файлов для Windows и Linux. Из этого набора вы всегда сможете выбрать тот способ установки, который лучше подойдет для вашей конкретной задачи

 

На момент последнего обновления данной статьи, доступны следующие API:

Наиболее актуальную информацию можно посмотреть в репозитории или на вводной странице документации.

 

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

 

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

  • Открытие соединения
  • Закрытие соединения
  • Выполнение произвольного SQL запроса
  • Получение информации о таблице
  • Создание таблицы
  • Добавление записей
  • Получение записей
  • Обновление записей
  • Удаление записей
  • Удаление таблицы
  • Очистка таблицы
     

Все эти методы можно условно поделить на две категории: Основные методы и ORM


 

Основные методы

 

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

 

Запрос Create (создание таблицы)

    Соединение = OPI_SQLite.ОткрытьСоединение(ИВФ);

    // CREATE

    ТекстЗапроса = "
    |CREATE TABLE test_table (
    |id INTEGER PRIMARY KEY,
    |name TEXT,
    |age INTEGER,
    |salary REAL,
    |is_active BOOLEAN,
    |created_at DATETIME,
    |data BLOB
    |);";

    Результат = OPI_SQLite.ВыполнитьЗапросSQL(ТекстЗапроса, , , Соединение);

 

Запрос Insert (вставка новых строк в таблицу) с позиционными параметрами

    ТекстЗапроса = "
    |INSERT INTO test_table (name, age, salary, is_active, created_at, data)
    |VALUES (?1, ?2, ?3, ?4, ?5, ?6);";

    МассивПараметров = Новый Массив;
    МассивПараметров.Добавить("Vitaly");                              // TEXT
    МассивПараметров.Добавить(25);                                    // INTEGER
    МассивПараметров.Добавить(1000.12);                               // REAL
    МассивПараметров.Добавить(Истина);                                // BOOL
    МассивПараметров.Добавить(OPI_Инструменты.ПолучитьТекущуюДату()); // DATETIME
    МассивПараметров.Добавить(Картинка);                              // BLOB

    Результат = OPI_SQLite.ВыполнитьЗапросSQL(ТекстЗапроса, МассивПараметров, , Соединение);

 

Позиционные параметры передаются как массив с элементами одного из доступных типов: Строка, Число, Дата, Булево, ДвоичныеДанные. Именные параметры не поддерживаются

 

Параметр типа ДвоичныеДанные, или же BLOB в понимании SQLite, также может быть передан как структура вида "blob":<Путь к файлу>. Также JSON вида {"blob":<Путь к файлу>} является единственной возможностью использовать параметры данного типа в CLI версии OPI

 

В качестве значения параметра Соединение, может быть передано как заранее созданное соединение из метода ОткрытьСоединение(), так и просто путь к файлу базы (если файла базы нет по указанному пути - он будет создан). В случае с передачей пути к файлу, соединение будет открыто и закрыто в рамках выполнения функции

При передаче пустой строки будет создана база In-memory

In-memory database (резидентная база данных) — база данных, размещаемая в оперативной памяти


 

ORM

 

Для упрощения работы с библиотекой, также было добавлено несколько методов простого выполнения наиболее частых действий при работе с базой:

 
 Получить информацию о таблице
 
 Создать таблицу
 
 Добавить записи
 
 Получить записи
 
 Обновить записи
 
 Удалить записи
 
 Удалить таблицу
 
 Очистить таблицу

 

Технически, использование ORM и использование текстовых SQL-запросов не отличается: ORM просто формирует запрос по шаблону и точно так же выполняет его при помощи функции ВыполнитьЗапросSQL()

 

Подробнее об этих (и обо всех других) методах Открытого пакета интеграций можно узнать в документации


 

Возвращаемые значения

 

Также, вне зависимости от способа работы (ORM или тексты запросов), в качестве результата всегда возвращается структура. Ее наполнение зависит от того, является запрос успешным или нет, а также от необходимости получения данных в SQL-операции:

  • Если запрос возвращает данные, то в результате будет структура с полями result: Истина (успешность выполнения) и data (с информацией) в случае успеха, либо же result: Ложь и error: с текстом ошибки, в случае неудачи
     
  • Если вопрос не должен возвращать значение, то в качестве результата будет либо result: Истина при успехе, либо  result: Ложь и error: с текстом ошибки при неудаче
     

Все SELECT запросы отмечаются как запросы с данными по умолчанию. Если вам необходимо получить данные в результате выполнения запроса, который не начинается с SELECT, то необходимо использовать параметр ФорсироватьРезультат в функции выполнения запроса

Функция ВыполнитьЗапросSQL(Знач ТекстЗапроса, Знач Параметры = "", Знач ФорсироватьРезультат = Ложь, Знач Соединение = "") Экспорт

 

О совместимости

 

Методы библиотеки основаны на Native API внешней компоненты на Rust.

Это уже вторая компонента в ОПИ, после прошлого обновления, реализующего TCP-клиент. Исходники этих двух компонент (и всех других компонент, если они появятся в будущем) можно найти в репозитории OpenIntegrations в отдельном каталоге addins

Используемая версия SQLite - 3.46.0. Компонента собрана под все платформы: x64 и x86 Windows и Linux. Тестировалась в x64 Windows-версии 1С и, косвено, на x64 Linux (через OneScript)

 

При возникновении проблем с этой библиотекой (или с любой другой, из набора ОПИ), будет очень здорово, если вы напишите об этом в комментариях или Issues репозитория (лучше Issues)

 

Спасибо за внимание!

 

 Если вам нравится ОПИ, то не забывайте поддерживать его на GitHub и Инфостарт!

 

Репозиторий ОПИ: github.com/Bayselonarrend/OpenIntegrations

Последний релиз: github.com/Bayselonarrend/OpenIntegrations/releases/latest

 
 Где? Куда?

 

Другие статьи про Открытый пакет интеграций на Инфостарт:

 

 

 Мой GitHub:    https://gitub.com/Bayselonarrend 
 OpenYellow:    https://openyellow.org
 Лицензия MIT:  https://mit-license.org

SQLite СУБД внешние источники базы базы данных SQL внешние компоненты

См. также

Разработка внешних компонент Программист Платформа 1С v8.3 1C:Бухгалтерия Платные (руб)

Позволяет автоматизировать работу с картинками. С помощью компоненты можно измерять размер изображений, поворачивать их, наносить водяные знаки, конвертировать из одного формата в другой. Будет очень полезна для интернет-магазинов и всех, кому постоянно требуется работать с различными графическими форматами. Выполнена по технологии NativeAPI. Работает с форматами: jpg (jpeg), png, bmp, gif, tif

3600 руб.

02.09.2010    77825    73    257    

191

Разработка внешних компонент Программист Платформа 1С v8.3 1C:Бухгалтерия 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 Платные (руб)

Внешняя компонента позволяет работать c TWAIN-совместимым оборудованием (сканерами, камерами) . Полностью совместима со стандартной TWAIN-компонентой из БСП и может применяться как ее замена без изменения вызовов, при этом может работать с 64-разрядной платформой, а так же имеет расширенную функциональность, например, сохранение результата непосредственно в PDF без использования сторонних утилит. Прекрасно работает на сервере, тонком клиенте и веб-клиенте (проверена работа в браузерах Google Chrome, Mozilla Firefox и Microsoft Internet Explorer).

3000 руб.

12.05.2020    29154    139    100    

92

Разработка внешних компонент Программист Платформа 1С v8.3 1C:Бухгалтерия Платные (руб)

Внешняя компонента позволяет печатать PDF файлы непосредственно из 1С, не используя при этом сторонних программ. Прекрасно работает на сервере, тонком клиенте и веб-клиенте. Основана на проекте PDFium из состава проекта Chromium/Chrome

1500 руб.

17.09.2018    37162    115    128    

116

Разработка внешних компонент Программист Платформа 1С v8.3 1C:Бухгалтерия 1С:Управление торговлей 11 Платные (руб)

Внешняя компонента для конвертации PDF файлов в картинки без использования дополнительных программ. Работает на сервере и в тонком клиенте.

2400 руб.

25.06.2024    1330    3    4    

3

Разработка внешних компонент Программист Платформа 1С v8.3 1C:Бухгалтерия Россия Бесплатно (free)

В статье описывается приложение-конструктор внешних компонент (native API). Конструктор упрощает процесс разработки за счет удобного добавления всех нужных функций и процедур в графическом режиме, с указанием их параметров и типов параметров. На выходе приложение генерирует готовый код на С++ и Rust и позволяет сразу приступить к реализации, без настройки API компоненты вручную.

04.12.2024    5476    kovalevdmv    26    

77

Разработка внешних компонент Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Некоторые практические аспекты создания внешних компонент на языке С++ для платформы 1С 8.3++.

26.01.2024    7895    starik-2005    40    

47

Инструментарий разработчика Разработка внешних компонент Программист Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Пример взаимодействия 1С с Apach Kafka посредством внешней компоненты, разработанной на основе официальной библиотеки librdkafka (the Apache Kafka C/C++ client library).

22.11.2023    5149    105    ivan1703    26    

41
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. SerVer1C 880 14.01.25 10:44 Сейчас в теме
V8Sqlite хорошая компонента
Torin; bayselonarrend; +2 Ответить
2. artbear 1568 14.01.25 11:50 Сейчас в теме
Стоит указать важное - SQLite работает с блокировками на уровне таблицы

поэтому многопоточная запись в одну таблицу невозможна
Созинов; Prometeus2011; bayselonarrend; +3 Ответить
4. JohnyDeath 302 14.01.25 15:18 Сейчас в теме
(2) по-моему вообще на уровне всей БД (файла), а не отдельной таблицы
bayselonarrend; SerVer1C; +2 Ответить
3. aximo 2185 14.01.25 12:35 Сейчас в теме
Еще нужно указать версию sqlite - есть системы на 2.8, а есть версиях 3.*
8. bayselonarrend 2545 14.01.25 19:27 Сейчас в теме
(3) Да, спасибо, укажу. Используется 3.46
5. xutman 7 14.01.25 17:30 Сейчас в теме
Добрый день!
Спасибо за Ваш огромный труд! А нет ли в планах сделать подобное для MySQL?)
7. bayselonarrend 2545 14.01.25 19:21 Сейчас в теме
6. aximo 2185 14.01.25 18:57 Сейчас в теме
На самом деле - отличная статья-пример… много лет назад сам часто работал с sqlite, поэтому возникали такие разработки https://infostart.ru/1c/tools/375172/
bayselonarrend; +1 Ответить
9. webester 26 17.01.25 06:35 Сейчас в теме
(8)Только там 9sm чтобы хотя бы просто посмотреть. А здесь весь код, открыт.
10. SerVer1C 880 17.01.25 10:06 Сейчас в теме
Кто-нибудь победил подключение к sqlite через внешний источник данных через ODBC драйвер в Win?
В конфигураторе таблицы отображаются, а в предприятии ошибка:

Ошибка при выполнении запроса.
по причине:
Ошибка получения данных
по причине:
Ошибка создания набора данных "НаборДанныхДинамическогоСписка"
[ОшибкаНастроекКомпоновкиДанных]
по причине:
Ошибка при исполнении запроса набора данных
по причине:
Ошибка выполнения запроса
по причине:
Ошибка внешней базы данных:
ошибка при выполнении запроса
по причине:
Ошибка ODBC. SQLSTATE: HY000
Номер ошибки: 1
Описание: near "45": syntax error (1)

[ОшибкаВнешнегоИсточникаДанных]
11. JohnyDeath 302 20.01.25 21:07 Сейчас в теме
(10) лучше ODBC для sqlite не использовать. Нативного (от самих разработчиков) по-моему до сих пор нет.
Поэтому так просто вряд ли получится подрубать БД sqlite в 1с.
Хотя внутри 1с есть же всё для работы с ними: некоторый период времени ЖР писался именно в sqlite
12. Prometeus2011 177 21.01.25 08:45 Сейчас в теме
Да, кстати, а как обрабатывается конкурентный EXCLUSIVE доступ на запись к БД из разных потоков?
Например, в Qt реализации (класс QSqlDatabase) - никаких ожиданий на блокировках из коробки нет. Исключение просто вызывается. Тут либо грамотно mutex'ы расставлять - исходя из логики исполнения решения, либо try/catch. Как здесь реализовано интересно?
13. bayselonarrend 2545 21.01.25 09:12 Сейчас в теме
(12) При попытке такой записи вернется ошибка. Будет

{
 "rollback": {
  "result": true
 },
 "result": false,
 "rows": 0,
 "errors": [
  {
   "row": 1,
   "error": "database is locked"
  }
 ]
}
Показать


Только десериализованное в структуру. Технически на расте это просто match ok err для execute, а остальное под капотом rusqlite
14. Prometeus2011 177 21.01.25 12:39 Сейчас в теме
Оставьте свое сообщение