Коннектор 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 внешние компоненты

См. также

Разработка внешних компонент POS терминал Рабочее место Розничная торговля Программист Пользователь Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Розничная и сетевая торговля (FMCG) Рестораны, кафе и фаст-фуд Реклама, PR и маркетинг Управленческий учет Платные (руб)

Медиадисплей покупателя может отображать текущую покупку на кассовом месте, показывать видеорекламу, баннеры, во время простоя разворачивать рекламу на весь экран. Экран можно использовать в качестве графического меню-борда в кафе и видеовывески. В качестве устройства отображения можно использовать Android-планшеты, смарт-телевизоры с Android, мониторы или проекторы под управлением Windows или Linux-компьютера. Linux-версия успешно запускается на одноплатных компьютерах Raspberri Pi и Orange Pi. Настраивается ЛЮБОЙ ДИЗАЙН экрана при помощи встроенного графического редактора! Решение можно масштабировать от одного экрана до тысяч экранов с централизованным управлением.

18000 руб.

30.05.2017    54230    9    69    

46

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

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

2400 руб.

25.06.2024    1228    3    4    

3

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

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

3600 руб.

02.09.2010    77641    73    257    

191

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

Внешняя компонента, позволяющая посылать команды и получать ответы по GraphQL протоколу из 1С.Может быть использована при интеграции. В 1С работает на стороне "клиента".

4600 руб.

27.06.2023    3712    3    0    

5

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

Внешняя компонента выполнена по технологии Native API для 1С 8.х, обеспечивает доступ к программным АТС Asterisk (FreePBX, Elastix) через AMI интерфейс. Через него можно управлять многими функциями Asterisk (определение номеров, перевод звонков, набор телефона и т. д.)

2400 руб.

04.05.2018    47503    124    66    

67

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

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

1500 руб.

17.09.2018    36899    114    127    

115

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

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

04.12.2024    5124    kovalevdmv    26    

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

поэтому многопоточная запись в одну таблицу невозможна
Созинов; Prometeus2011; bayselonarrend; +3 Ответить
4. JohnyDeath 302 14.01.25 15:18 Сейчас в теме
(2) по-моему вообще на уровне всей БД (файла), а не отдельной таблицы
bayselonarrend; SerVer1C; +2 Ответить
3. aximo 2148 14.01.25 12:35 Сейчас в теме
Еще нужно указать версию sqlite - есть системы на 2.8, а есть версиях 3.*
8. bayselonarrend 2452 14.01.25 19:27 Сейчас в теме
(3) Да, спасибо, укажу. Используется 3.46
5. xutman 7 14.01.25 17:30 Сейчас в теме
Добрый день!
Спасибо за Ваш огромный труд! А нет ли в планах сделать подобное для MySQL?)
7. bayselonarrend 2452 14.01.25 19:21 Сейчас в теме
6. aximo 2148 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 872 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 217 21.01.25 08:45 Сейчас в теме
Да, кстати, а как обрабатывается конкурентный EXCLUSIVE доступ на запись к БД из разных потоков?
Например, в Qt реализации (класс QSqlDatabase) - никаких ожиданий на блокировках из коробки нет. Исключение просто вызывается. Тут либо грамотно mutex'ы расставлять - исходя из логики исполнения решения, либо try/catch. Как здесь реализовано интересно?
13. bayselonarrend 2452 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 217 21.01.25 12:39 Сейчас в теме
Оставьте свое сообщение