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 не будет опубликован. Обязательные поля помечены *