Основана на одноименной ВК Александра Орефков (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