1sqlite reborn


Обновленная версия внешней компоненты для работы с базами данных SQLite и прямыми запросы в ДБФ-базах 1С.

Основана на одноименной ВК Александра Орефков (orefkov) версии 1.0.2.6. Публикация создателем одобрена.

Огромная благодарность Александру за открытый и понятный код 1sqlite. Поизведенная им объем работ для создания этой ВК огромен!

Оригинальная статья и ВК //infostart.ru/public/15977/#com287

Текущая версия 1sqlite 3.15.1.13

Отличия движка sqlite 3.15.1 от используемого в 1sqlite 1.0.2.6 3.7.17 можно посмотреть на странице http://www.sqlite.org/changes.html

ДеревоСТЕ — пример использования СТЕ запроса для простого создания, отображения (используется SQLiteDataProvider для табличного поля 1с++) и работы с деревом справочника номенклатура. Логика свертывания/развертывания групп также на CTE.

История обновления.

Основанием для обновления движка послужил довольно неприятный баг в движке 3.7.10 http://www.sqlite.org/src/info/b7c8682cc1
Первая версия была собрана на ближайшем к оригинальной версии движке sqlite 3.7.11, однако хотелось большего, т.к. вкусных изменений в sqlite было очень много!
Но все сборки на движке 3.8.+ вели себя безобразно — порядок объединения таблиц менялся непредсказуемым образом и запросы чуть сложнее простого select адски тормозили.
Попытки изменить подсказки планировщику sqlite ни к чему не привели и через какое то время стало понятно, что в sqlite 3.8.+ новый планировщик запросов NGQP вообще не обращает на эти подсказки никакого внимания.
Пришлось откатится на последний движок 3.7.17 но и с ним появились проблемы. Добавленная где то между 3.7.10 и 3.7.17 оптимизация по IN для виртуальных таблиц вела себя не корректно и ее пришлось вырезать. В таком виде 1sqlite на движке 3.7.17 вел себы очень не плохо.
Через какое то время вышел движок sqlite 3.8.11.1 и в нем наконец была исправлена работа с виртуальными таблицами.

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

1sqlite 1.0.2.6/3.7.17 bf0-3
сражения с оптимизацией по IN в 3.7.17 проиграны, пришлось вырезать оптимизацию из sqlite

1sqlite 1.0.2.6/3.8.11.1 bf4
не падает в поставщике данных для ТП, если в УстановитьТекстЗапроса не указать ИдПоле (редко падало)

1sqlite 1.0.2.6/3.8.11.1 bf5
исправлена типизация перечислений неопределенного вида

1sqlite 1.0.2.6/3.8.11.1 bf6
В провайдер таблицного поля добавлено свойство ОбратныйПорядок
http://www.forum.mista.ru/topic.php?id=770036

1sqlite 1.0.2.6/3.8.11.1 bf7
исправлена загрузка целночисленных переменных из sqlite в 1с
http://www.forum.mista.ru/topic.php?id=774403

1sqlite 1.0.2.6/3.8.11.1 bf8
Исправлено поведение УложитьОбъекты в том случае, если справочник является подчиненным
http://www.forum.mista.ru/topic.php?id=550161

1sqlite 1.0.2.6/3.14.1 bf9
перевод движка на 3.14.1
добавлена обработка  новых переменных sqlite

  #define SQLITE_INDEX_CONSTRAINT_LIKE   65     /* 3.10.0 and later only */
  #define SQLITE_INDEX_CONSTRAINT_GLOB   66     /* 3.10.0 and later only */
  #define SQLITE_INDEX_CONSTRAINT_REGEXP 67     /* 3.10.0 and later only */
  #define SQLITE_INDEX_SCAN_UNIQUE        1     /* Scan visits at most 1 row */

1sqlite 1.0.2.6/3.14.1 bf10
изменена схема подключения виртуальных таблиц 1с, теперь они подключаются как таблицы во временной схеме
добавлен флаг выгрузки в УложитьОбъекты как 5й параметр
    0 — выгружать объекты в неопределенном виде tos23, длинные строки как tos23+хвост
    1 — при выгрузке по иерархиии выгружать только элемены
    2 — при выгрузке по иерархиии выгружать только группы
    3 — при выгрузке по иерархиии выгружать группы и элементы
    http://www.forum.mista.ru/topic.php?id=778632
изменена типизация  :Неопределенный для поддержки  tos23+хвост

1sqlite 1.0.2.6/3.14.1 bf11
восстановлены потеренные при портировании движка sqlite функции upper и lower
восстановлена потерянная типизация перечисления из tos23
добавлена типизация перечисления из tos 13

1sqlite 3.15.1.13

изменена нумерация версий на [версия sqlite].[патчсет]

1sqlite 3.24.0.21
Добавлена передача в sqlite3 целых чисел из базы 1С в диапазоне от -9223372036854775808 до  9223372036854775807.
Добавлена поддержка объекта BinaryDatа в 1С++ и типа BLOB sqlite3
    тип поля BLOB из базы sqlite3 автоматически преобразуется в объект 1С++ BinaryDatа
    объект 1С++ BinaryDatа может быть записан в базу sqlite3 методом Запрос.УстановитьПараметр("@blob",bindata);
Улучшено сообщение при ошибке в методе УстановитьПараметр
    вместо  "Ошибка установки sql-параметра @val — Неизвестный тип значения"
    будет выводится  "Ошибка установки sql-параметра @val — Неизвестный тип значения: ИндексированнаяТаблица"
Устранен вылет из 1С в случае выгрузки результата в OLE объекты, вместо этого будет выведена ошибка выполнения
Заблокированы новые типы поиска в sqlite3 по индексу ISNULL,IS NOTNULL и подобные так как движок поиска по таким ключам в 1С не работает
Устранен вылет из 1С при вызове метода ТабличногоПоля Колонки.Очистить();
Устранен вылет на запросе "SELECT 1 FROM __1s_blob GROUP by block COLLATE _1C", возможно это проявлялось и в других случаях;
Добавлены функции compress(x) и uncompress(x), возвращают blob, чтобы получить текст нужно использовать cast(uncompress(data) as text);

1sqlite 3.25.1.23
Движок sqlite обновлен до 3.25.1
В этом движке очередное революционное изменение — поддержка Оконных функций (Windows functions) и долгожданная возможность переименовать столбец таблицы.

В движок 1sqlite Добавлена процедура База.EnableDelete, База.РазрешитьDelete и реализована поддержка запроса DELETE. 
Это именно Объект.Удалить(1), а не пометка на удаление.
Но в отличие от Объект.Удалить(1) можно избирательно удалять записи регистров и т.п. Постарайтесь не порезаться!
Запрос DELETE может быть выполнен в транзакции с ее последующим откатом.
Примечание: открытые формы списков в той сессии 1С в которой происходит удаление на удаление не реагируют и сами по себе не обновляются. Другие сессии 1С реагируют нормально, в соответствии с Сервис/Настройки/Общие/Время опроса БД.

Пример использования оконной функции. Замер за месяц показывает примерно так: Запрос 1с 6900мс, Запрос sqlite 400мс.
Запрос sqlite значительно сложнее (его можно переписать 100500 раз разными способами, это просто пример) и тут не поспоришь — 1С даже в 7.7 реализовала громадное упрощение кода запросов, но за все приходится платить, в том числе и за упрощение кода.

 Период с ВыбНачПериода по ВыбКонПериода;
Количество = Регистр.ОстаткиТМЦ.Количество;
Номенклатура = Регистр.ОстаткиТМЦ.Номенклатура;
Функция КоличествоНачОст = НачОст(Количество);
Функция КоличествоПриход = Приход(Количество);
Функция КоличествоРасход = Расход(Количество);
Функция КоличествоКонОст = КонОст(Количество);
Группировка День все;
Группировка Номенклатура без групп все ВошедшиеВЗапрос;
WITH DateT (date) AS (  SELECT :НачДата UNION ALL SELECT date(date,'+1 day') FROM DateT WHERE date< :КонДата)

SELECT
Дата
,Номенклатура [Номенклатура $Справочник.Номенклатура]
,НачОст+total(Приход-Расход) OVER ( PARTITION BY Номенклатура ORDER BY Дата ROWS BETWEEN  UNBOUNDED PRECEDING AND 1 PRECEDING) НачОст
,Приход
,Расход
,НачОст+total(Приход-Расход) OVER ( PARTITION BY Номенклатура ORDER BY Дата) КонОст
FROM (
SELECT
t1.Дата
,t2.Номенклатура
,total(t4.НачОст) НачОст
,total(t3.Приход) Приход
,total(t3.Расход) Расход
FROM (
SELECT date AS Дата from DateT) as t1
,(SELECT DISTINCT Номенклатура  FROM Регистр_ОстаткиТМЦ WHERE DATE BETWEEN :НачДата AND :КонДата ) as t2
LEFT JOIN ( SELECT
Date AS Дата
,Номенклатура
,sum(case DEBKRED when 1 then 0 else Количество end) Приход
,sum(case DEBKRED when 1 then Количество else 0 end) Расход
FROM Регистр_ОстаткиТМЦ
WHERE Date BETWEEN :НачДата AND :КонДата
GROUP BY Дата,Номенклатура
) as t3 ON t3.Дата = t1.Дата AND t3.Номенклатура=t2.Номенклатура
LEFT JOIN ( SELECT
date(Period,'+1 months') AS Дата
,Номенклатура
,sum(Количество) НачОст
FROM РегистрИтоги_ОстаткиТМЦ
WHERE PERIOD = date( :НачДата,'-1 months')
GROUP BY Номенклатура
) as t4 ON t4.Номенклатура=t2.Номенклатура
GROUP BY t2.Номенклатура,t1.Дата)
GROUP BY Номенклатура,Дата

История изменений движка sqlite3

Зеркало/Архивы версий 1sqlite, для тех кто не хочет поддерживать дальнейшую разработку https://cloud.mail.ru/public/9znr/ZJ6ULE9aR

39 Comments

  1. vandalsvq

    (0) большое спасибо, что не бросаете разработку. Интересно конечно как мои классы (ПрямойЗапрос, ПоставщикДанных) поведут себя на новой компоненте. Но у меня уже 7-ки даже не стоит.

    Если вдруг ими пользуетесь, скажите, просто интересно.

    Reply ↓
  2. Djelf

    (1) Должны работать быстрее, хотя бы из-за того что по условию с IN выборка может использовать индекс

    Группировка и сортировка в новом движке тоже быстрее, причем значительно быстрее.

    Возможно некоторые процедуры ПрямогоЗапроса можно было бы переписать с учетом новых возможностей и было бы еще быстрее, но увы не использую.

    Как то напрямую получается проще 😉

    Сломаться ничего не должно, но в некоторых случаях могут быть парадоксы!

    Я об этом писал на форуме 1с++ http://www.1cpp.ru/forum/YaBB.pl?num=1214205575/789#789

    P.S. Текущая сборка на 3.15.1 отлично справилась со всеми вариантами и вышла 100% победителем.

    Reply ↓
  3. r2d255

    А есть шанс что что-то подобное для восьмерки появится?

    Можно-ли в восьмерке работать с какой-то внешней бд, при двух условиях:

    1. Не устанавливать никаких драйверов и программ. (с пользовательскими правами на сервере)

    2. выполнять в ней SQL запросы.

    ?

    Reply ↓
  4. vandalsvq

    (2) ну буду тогда смотреть, может вести с полей будут.

    Reply ↓
  5. Djelf

    (3) Если с «с какой-то внешней бд» то уже есть ВК для firebird http://infostart.ru/public/168241/

    Reply ↓
  6. Djelf

    А… хотя не оно. Оно с сервером работает, а не с файлом. Можно портировать на движок sqlite… Необходимости пока не возникало, а без необходимости стимула нет.

    Reply ↓
  7. JohnyDeath

    Помню то счастье, когда обладатели dbf-баз могли строить нормальные запросы на основе 1sqlite, а главное использовать ТабличноеПоле!

    Спасибо, что не бросил такую вкуснятину.

    И Саше Орефкову тоже отельное огромное спасибо.

    Reply ↓
  8. ret-Phoenix

    (3) r2d255, Насколько знаю, в 8-ке можно использовать .net сборки, а значит можно использовать готовые либы для разных субд.

    Таким образом можно попробовать использовать https://github.com/ret-Phoenix/oscript-sql

    Там один API подобный запросам 1С для нескольких СУБД.

    Reply ↓
  9. r2d255

    (8) Спасибо.

    Я правда не понял, что нужно сделать чтобы стало доступно создание объекта Соединение() ?

    Reply ↓
  10. ret-Phoenix

    (9) r2d255, А что и как пробовали? можно продолжить в ЛС, мне интересно, получится ли прикрутить мою DLL к 1С )

    Reply ↓
  11. Jill

    (2) после приключенией с типизацией, таки, перешел на 1.0.2.6, но, все-таки пришлось возвращаться на 1.0.2.3 именно из-за того, что первые прямые писал с классом прямого запроса.

    Запросы кривые, но, на том что есть, скорость падала (в сравнении с 1.0.2.3) в разы (было минуты — стало десятки минут, сначала даже подумал что кэш не используется, как локализую на чем затык приключается — покажу примеры)…

    Сейчас потихоньку все переписываю на чистый sqlite…

    Reply ↓
  12. Djelf

    (11) 1.0.2.6 они уже разные бывают… смотри ссылку в (2) Найдешь тормозящий запрос на «прямом» кидай пример. И explain QUERY PLAN к нему. В принципе там сразу видно что не так…

    Reply ↓
  13. Jill

    (12) на 3.15.0.12 тестил.

    Считал последней — обознался.

    Если с 3.15.1.13 какие-нибудь грабли вылезут — сообщу.

    Извиняюсь за дезинформацию.

    Reply ↓
  14. Djelf

    (13) 3.15.0, 3.15.1 — особой разницы в движке нет т.е. то что тормозило на 3.15.0, то и на 3.15.1 будет тормозить. Так что жду запрос и explain.

    Reply ↓
  15. lokis

    Доброго всем времени суток !

    Прорабатываю такой вариант использования:

    1) формируется Таблица Значений

    2) «укладывается» в базу

    3) запросом вытягиваю значения — это реально быстрее, нежели штатными средствами

    Но «затык» — из запроса возвращается таблица с данными во внутреннем представлении — как перевести в нормальное ?

    Reply ↓
  16. Djelf

    (15) Если укладываешь ТЗ не указывая типизацию колонки, то типизация в запросе должна быть :Неопределенный

    Reply ↓
  17. Jill
    Reply ↓
  18. Jill

    (14) вставилось потрясающе. И поправить не дает…

    Reply ↓
  19. Djelf

    (18) Выглядит ужасно, а выполняется еще хуже 😉

    1. Класс в обоих случаях сконструировал один и тот же запрос, что не удивительно.

    2. Странно что время подготовки запроса Классом увеличилось почти в 2 раза.

    3. План запроса обе версии sqlite сделали примерно одинаковый, 190мс разница небольшая… Повторяемая? За месяц-два тоже ~в 2 раза отличается?

    4. У тебя видимо не установлен в регистре флаг «Быстрая обработка движений» из-за этого лишние джойны.

    5. Фильтр на Номенклатуру только в одном месте, это так и задумано?

    6. Класс не учитывает возможность наложить индекс по Номенклатуре, если на нее установлен отбор. Отбор установлен? Тут можно разогреть запрос очень сильно! При быстрой обработке движений и отбору по номенклатуре сработает составной индекс регистра вида «SP2343,DATE,TIME,IDDOC,LINENO,ACTNO» и это очень сильно ускорит запрос в 3.15. А вот 1.0.2.3 его использовать не сможет вообще!

    7. Что внутри vt_totalrg_328_769799611 и т.п. не видать, может там что-то подтормаживает, а не в результирующем запросе.

    Reply ↓
  20. Djelf

    (18) Непонятненько где и почему тормозит…

    Кусок SELECT docjourn.DATE AS Период ,ra_2351.Номенклатура AS Номенклатура в 3.15 в 2 раза быстрее…

    Остальные куски должны вести себя так же…

    А попробуй ка обернуть запрос в begin rollback, на взаимодействие с 1с это не повлияет. ВыполнятьВТранзакции это для 1с, а не sqlite…

    Reply ↓
  21. Djelf

    (18) Ага… последний кусок вроде вообще не правильный, возможно он и тормозит

    РегСпис.Номенклатура as Номенклатура,
    Жур.DATE as НачалоПериода,
    FROM
    vt_totalrg_328_769799694 as РегСпис
    
    INNER JOIN
    [Документ.СписаниеТМЦ] as ДокСпис ON ДокСпис.IDDoc = РегСпис.ТекущийДокумент
    LEFT JOIN
    [Журнал] as Жур ON Жур.IDDoc = РегСпис.ТекущийДокумент) Рег
    

    Показать

    НачалоПериода есть в $РегистрОбороты, ВидДокумента тоже есть т.е. inner join не нужен, а нужно условие в вт на :ВидДокумента.СписаниеТМЦ

    Мне не очень нравится что ПрямойЗапрос делает временные таблицы для sqlite, если были бы как вложенные, то движок мог бы их как то их по хитрому развернуть.

    Reply ↓
  22. Jill
    Reply ↓
  23. Jill

    (21) Djelf, исходный текст с учетом условий:

    EXPLAIN QUERY PLAN
    SELECT
    Рег.Номенклатура as [Номенклатура $Справочник.Номенклатура],
    Рег.НачалоПериода as [День $Дата],
    SUM(Рег.КоличествоНачальныйОстаток)  as КолвоНачОст,
    SUM(Рег.КоличествоКонечныйОстаток) as КолвоКонОст,
    SUM(Рег.КоличествоПриход) as КолвоПриход,
    SUM(Рег.КоличествоРасход) as КолвоРасход,
    SUM(Рег.КоличествоВозврат) as КолвоВозвр,
    SUM(Рег.КоличествоНачальныйРезерв) as КолвоРезервНачОст,
    SUM(Рег.КоличествоКонечныйРезерв) as КолвоРезервКонОст,
    SUM(Рег.КоличествоСписание) as КолСпис
    FROM
    (
    SELECT
    РегРасх.Номенклатура as Номенклатура,
    РегРасх.Период as НачалоПериода,
    0  as КоличествоНачальныйОстаток,
    0 as КоличествоКонечныйОстаток,
    0 as КоличествоПриход,
    РегРасх.КоличествоОборот as КоличествоРасход,
    РегРасх.КоличествоВОборот as КоличествоВозврат,
    0 as КоличествоНачальныйРезерв,
    0 as КоличествоКонечныйРезерв,
    0 as КоличествоСписание
    
    FROM
    $РегистрОбороты.Продажи(:ДатаНач,:ДатаКон,День,Номенклатура IN (SELECT Val FROM vt_Номен),(Номенклатура),(Количество,КоличествоВ)) as РегРасх
    ) Рег
    
    GROUP BY
    Рег.Номенклатура,
    Рег.НачалоПериода
    

    Показать

    Reply ↓
  24. Djelf

    (23) Плюсик перед Номенклатура IN поставь. Т.е.

    $РегистрОбороты.Продажи(:НачПериода,:КонПериода,День,+Номенклатура  IN (SELECT

    IN очень коварная штука. Есть 2 варианта выполнения запроса:

    1. читаем исходную таблицу, а потом накладываем фильтр

    2. читаем таблицу с условием в IN

    Если в IN значений мало то быстрее 2, если много то быстрее 1

    В 1.0.2.3 оптимизации в 2 нет, он просто такое не умеет. А движки повыше могут выбрать вариант 2

    А тут еще получается что запрос не только к виртуальным таблицам, но и к таблице sqlite. Тестами в sqlite такой вариант не покрыт.

    К сожалению прагмой такое поведение не изменить, только при компиляции или плюсом (отключение использования индекса по полю).

    Reply ↓
  25. Jill

    (24) Djelf, понятно. Спасибо!

    1.0.2.6

    Время подготовки запроса: 14 мс, время выполнения запроса: 390 мс.

    Reply ↓
  26. Djelf

    (25) И еще хинт нашелся… Измени в ПрямомЗапросе кусок ниже и еще один такой же аналогично.

    Без SELECT RAISE(IGNORE); триггер обновляет поле СтрКолонкаИзменений, присваивая его значение самому себе, а оно участвует в индексе, следовательно должен обновится еще и индекс, а это лишняя работа. Это раза в полтора-два ускорит запросы. Можно еще больше ускорить, подавляя запись нулевых значений, но это несколько сложнее…

    ТекстЗапроса_Триггер = «create trigger tr_oborot before update of » + СтрКолонкаИзменений + » on » + ИмяВременнойТаблицы + »
    |begin
    | update » + ИмяВременнойТаблицы + » set
    |  » + СтрТриггерНачОстаток + »
    | where » + ИмяВременнойТаблицы + «.rowid = old.rowid;
    |
    | update t_ob set
    |  » + СтрТриггерОборот + »
    | where » + СтрЗаменить(СтрЗаменить(СтрУсловияСравненияТабИтогов,ИмяВременнойТаблицы + «.»,»»),»t_ob»,»old») + «;
    |
    | update » + ИмяВременнойТаблицы + » set
    |  » + СтрТриггерКонОстаток + »
    | where » + ИмяВременнойТаблицы + «.rowid = old.rowid;
    | SELECT RAISE(IGNORE); — вот эта строка!!!
    |end»;
    

    Показать

    Reply ↓
  27. vandalsvq

    (25) (26) ух ребят, я смотрю вы тут вовсю его (класс) перекапываете, может потом и сборку правильную сделаете для 1С++ форума? Могу заменить и в теме здесь на Инфостарте. Хотя может даже лучше, чтобы автор кто поправит сам и сделал правильную статью, себе sm заработает. Я не против, поскольку сам уже им не занимаюсь.

    Reply ↓
  28. Djelf

    (27) Да какое там вовсю переписываем… Сделал трассировку ОстаткоИОборотов, наткнулся на триггер, изумился его тормознутости, долго втыкал почему так.

    К счастью, решение оказалось очень простое. А то я уже что-то мутное на сте стал придумывать…

    В принципе в классе все хорошо, кое что можно на сте перевести, попробовать отказаться от генерации условий типа ‘20161001 0 0 ‘ тогда IN заработает ну и все вроде..

    Если бы пользовался переписал бы. А так, времени на тестирование не хватит.

    Я лучше luajit в sqlite как расширение встрою, а то обычный lua работать то работает, но слишком медленно.

    Reply ↓
  29. Djelf

    Зеркало/Архивы периодически обновляется, а тема нет т.к. скачать «бесплатно» для 1sqlite слетит.

    Список изменений внутри последнего архива.

    Reply ↓
  30. CheBurator

    ух, радует что я еще не в одиночестве!

    Reply ↓
  31. Djelf

    (30) А куда я с клюшек? И вообще, надоело сопли вытирать тем кто сменив место работы с моей конфы перешел на УТ 😉

    Да, многого в клюшках уже не хватает, в том числе и вариантов хранения данных, для этого sqlite и использую.

    Не совсем же я из ума выжил чтоб засовывать 800к xml`ек в dbf базу…

    Reply ↓
  32. klif

    Подскажите данная компонента подойдет для хранения данных в sqlite? Насколько я вижу все ее используют для запросов к самой 1с базе. Требуется хранить большой объем данных с привязкой к документу в 1с 7.7 .

    Reply ↓
  33. Jill

    (32) да. Подойдет.

    Разного рода доп данные именно так и храню (н-р. доп информация по номенклатуре со ссылками на картинки), чтобы не править конфигурацию + разного рода конфиги обработок.

    Reply ↓
  34. klif

    (33)

    А возможно посмотреть пример ?

    Reply ↓
  35. Jill

    (34) ну, н-р процедура обновления картинки номенклатуры (база, естественно, должна быть создана).

    Процедура ВыборИзображенияПоУмолчанию()
    Перем БазаSQLite, ЗапросSQLite, ТабПрямЗапроса, ТекстПрямЗапр, НачМил;
    Перем ТекПопыт, НеобходКолПопыт, Успех;
    Перем ВремПутьКИзображПоУмолч;
    Перем ПолнПутьКИзображПоУмолч;
    
    ВремПутьКИзображПоУмолч=ПутьКИзображПоУмолч;
    Если ВыборФайла(ВремПутьКИзображПоУмолч,0,,1,ПутьККаталИзображ,»Выберите путь к изображению по умолчанию.»,»jpg»,,1,5,1024)=1 Тогда
    Если (ПустоеЗначение(ВремПутьКИзображПоУмолч)=0) и (ВремПутьКИзображПоУмолч<>ПутьКИзображПоУмолч) Тогда
    БазаSQLite = СоздатьОбъект(«SQLiteBase»);
    БазаSQLite.Открыть(ПутьКБазеSQLITE);
    ЗапросSQLite = БазаSQLite.НовыйЗапрос();
    ЗапросSQLite.ВыполнятьВТранзакции = 0;
    ЗапросSQLite.ВыполнитьЗапрос(«PRAGMA journal_mode = WAL»);
    
    ТекстПрямЗапр=»
    |UPD ATE preferences SE T DefPictPath=:ВремПутьКИзображПоУмолч
    |»;
    
    ЗапросSQLite.Подставлять(«ВремПутьКИзображПоУмолч»,ВремПутьКИзображПоУмолч);
    ЗапросSQLite.Подготовить(ТекстПрямЗапр);
    
    //ЗапросSQLite.Отладка(1);
    //ТабПрямЗапроса=СоздатьОбъект(«ТаблицаЗначений»); //ДляСкриптов
    
    НеобходКолПопыт=5;
    ТекПопыт=0;
    Успех=0;
    
    Пока (ТекПопыт<НеобходКолПопыт) и (Успех=0) Цикл
    ТекПопыт=ТекПопыт+1;
    Успех=1;
    Попытка
    ЗапросSQLite.Выполнить();
    Исключение
    Успех=0;
    Сообщить(ОписаниеОшибки());
    Sleep(1);
    КонецПопытки;
    КонецЦикла;
    
    ЗапросSQLite=ПолучитьПустоеЗначение();
    БазаSQLite.Закрыть();
    БазаSQLite=ПолучитьПустоеЗначение();
    
    Если Успех=1 Тогда
    ОбновитьРеквизитыФормы();
    КонецЕсли;
    КонецЕсли;
    КонецЕсли;
    КонецПроцедуры // ВыборИзображенияПоУмолчанию
    

    Показать

    Самый обычный sqlite. Создаете таблицу и наполняете.

    Читаете справку sqlite.

    Если необходимо более подробно — могу чуть позже опубликовать набор обработок доп. описания.

    Reply ↓
  36. klif

    Если можно пример записи в базу.

    Reply ↓
  37. Djelf

    (36) В публикации есть обработка «Дерево CTE» там есть и чтение, и запись, и изменение данных в базе sqlite. Как пример — сойдет.

    Reply ↓
  38. klif

    Спасибо. С записью уже разобрался.

    Reply ↓
  39. Cujoko

    Спасибо вам за ваш труд. Я-то думаю, почему у меня соединение трёх таблиц, в каждой по 10000 записей, выполняется минут пятнадцать. Я и так, и эдак пытался, индексы создавал. Думал уже, что возможно придётся осваивать C++, потому что от SQLite отказываться было бы ещё больнее.

    Reply ↓

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *