1sqlite reborn

25.09.18

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

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

Скачать исходный код

Наименование Файл Версия Размер
Дерево на CTE
.ert 215,50Kb
14
.ert 215,50Kb 14 Скачать
1sqlite 3.24.0.21
.zip 394,12Kb
3
.zip 394,12Kb 3 Скачать
1sqlite 3.25.1.23
.zip 407,58Kb
20
.zip 3.25.1.23 407,58Kb 20 Скачать

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

вк sqlite sqlite3 1sqlite 7.7 sql cte

См. также

HTTP сервер, HTTP асинхронный клиент, клиент ГИС МТ "Честный знак": внешние компоненты для 1С 7.7

Разработка внешних компонент WEB-интеграция Платформа 1С v7.7 Конфигурации 1cv7 Платные (руб)

Компонента HttpSrv7 позволяет создавать веб-сервисы в среде 1С 7.7 и даже, используя файлы HTML, несложные веб-сайты. С помощью нее можно обеспечить доступ к данным 1С 7.7 из браузера. Дополнительно используя компоненту HTTP_Async или синхронный клиент HTTP для 1С 7.7 (публикация № 1152364) можно наладить обмен данными между удаленными информационными базами. С помощью компоненты HTTP_Async можно сначала послать несколько запросов к сайтам, веб-сервисам (в т.ч. к HttpSrv7), а затем обрабатывать данные по мере их поступления. Компонента GISMT в дополнение к HTTP_Async имеет функцию цифровой подписи и, таким образом, имеет все возможности для работы с API ГИС МТ "Честный знак" непосредственно из среды 1С 7.7.

2000 руб.

27.05.2022    7896    19    13    

31

Компонента ExchangeStruc (Структура Обмена). Прямой обмен данными между потоками, сессиями и окнами.

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

Аддон "Структура Обмена" (ExchangeStruc) - это компонента, которая обеспечивает доступ к разделяемым процессом структурам, аналогичным структурам 1С. Обеспечивает прозрачную передачу данных примитивных типов, в том числе Двоичных данных, в режиме Реального времени между разными контекстами (формами) или потоками одного процесса. В перспективе функционал будет расширен для обмена между процессами, даже разных версий платформ. Совместим с версиями Windows рабочих станций и серверов, с платформами 1С разных версий и релизов в режиме Native начиная с 8.2, и в режиме COM начиная с версий 7.7. По скорости чтения и записи лишь немногим уступает стандартной структуре 1С. НОВОЕ: Добавлен функционал регистрации компоненты COM в качестве OLE Auto (COMОбъект) для поддержки её работы в серверах старых версий 1С: 8.0 и 8.1, где работа с компонентами исключена. Теперь можно коммуникацию с Фоновыми заданиями на этих версиях проводить.

7200 руб.

19.04.2023    4820    1    0    

3

Выбор из большого списка (для 1С 7.7)

Разработка внешних компонент Платформа 1С v7.7 Платные (руб)

Компонента для выбора значения из больших списков значений.

1200 руб.

02.12.2021    5811    2    19    

4

Форма для ввода количества товаров

Разработка внешних компонент Оптовая торговля Платформа 1С v7.7 Конфигурации 1cv7 Управленческий учет Платные (руб)

Расширяем уровень взаимодействия c пользователем с помощью новых возможностей - форма для ввода количества для перемещений и форма ввода количества с упаковками и штуками.

1200 руб.

08.09.2021    7413    0    2    

1

Внешняя компонента для преобразования файлов из/в кодировку Base64 в 1С 7.7

Разработка внешних компонент Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Эта внешняя компонента Base64.dll предназначена для платформы 1С версии 7.7. Используется для преобразования файлов из/в кодировку Base64 из встроенного языка 1С Предприятие. Компонента тестировалась на базе конфигурации Бухгалтерский учет для Казахстана, редакции 7.70.257.

10 стартмани

06.04.2021    9488    14    softmaker    12    

5

Криптография: внешняя компонента для 1С 7.7

Разработка внешних компонент Защита ПО и шифрование Платформа 1С v7.7 Абонемент ($m)

Цифровые подписи, шифрование, просмотр сертификатов ключей ЭЦП, работа с различными криптопровайдерами (в т.ч. КриптоПРО ГОСТ 2012) в 1С 7.7.

1 стартмани

08.06.2020    9088    28    mdbruyfn    10    

9

Протокол UDP: внешняя компонента для 1С 7.7

Разработка внешних компонент Платформа 1С v7.7 Абонемент ($m)

Обмен сообщениями и небольшими файлами по протоколу UDP с 1С и внешними приложениями в локальной сети или сети VPN.

1 стартмани

23.05.2020    7335    5    mdbruyfn    0    

6
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. vandalsvq 1545 07.11.16 14:13 Сейчас в теме
(0) большое спасибо, что не бросаете разработку. Интересно конечно как мои классы (ПрямойЗапрос, ПоставщикДанных) поведут себя на новой компоненте. Но у меня уже 7-ки даже не стоит.
Если вдруг ими пользуетесь, скажите, просто интересно.
user646871_alexey-zmey; artbear; +2
2. Djelf 253 07.11.16 15:39 Сейчас в теме
(1) Должны работать быстрее, хотя бы из-за того что по условию с IN выборка может использовать индекс
Группировка и сортировка в новом движке тоже быстрее, причем значительно быстрее.
Возможно некоторые процедуры ПрямогоЗапроса можно было бы переписать с учетом новых возможностей и было бы еще быстрее, но увы не использую.
Как то напрямую получается проще ;)
Сломаться ничего не должно, но в некоторых случаях могут быть парадоксы!
Я об этом писал на форуме 1с++ http://www.1cpp.ru/forum/YaBB.pl?num=1214205575/789#789
P.S. Текущая сборка на 3.15.1 отлично справилась со всеми вариантами и вышла 100% победителем.
+
4. vandalsvq 1545 08.11.16 12:53 Сейчас в теме
(2) ну буду тогда смотреть, может вести с полей будут.
+
11. Jill 17 09.11.16 15:22 Сейчас в теме
(2) после приключенией с типизацией, таки, перешел на 1.0.2.6, но, все-таки пришлось возвращаться на 1.0.2.3 именно из-за того, что первые прямые писал с классом прямого запроса.

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

Сейчас потихоньку все переписываю на чистый sqlite...
+
12. Djelf 253 09.11.16 17:22 Сейчас в теме
(11) 1.0.2.6 они уже разные бывают... смотри ссылку в (2) Найдешь тормозящий запрос на "прямом" кидай пример. И explain QUERY PLAN к нему. В принципе там сразу видно что не так...
+
13. Jill 17 09.11.16 19:25 Сейчас в теме
(12) на 3.15.0.12 тестил.
Считал последней - обознался.

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

Извиняюсь за дезинформацию.
+
14. Djelf 253 09.11.16 21:27 Сейчас в теме
(13) 3.15.0, 3.15.1 - особой разницы в движке нет т.е. то что тормозило на 3.15.0, то и на 3.15.1 будет тормозить. Так что жду запрос и explain.
+
17. Jill 17 11.11.16 15:32 Сейчас в теме
(14) Djelf,
На малых объемах разница не значительна, на больших - критична

1.0.2.3

1.0.2.3

SELECT 
	Рег.Номенклатура as [Номенклатура $Справочник.Номенклатура],
	Рег.НачалоПериода as [День $Дата], 
	SUM(Рег.КоличествоНачальныйОстаток)  as КолвоНачОст,
	SUM(Рег.КоличествоКонечныйОстаток) as КолвоКонОст,
	SUM(Рег.КоличествоПриход) as КолвоПриход,
	SUM(Рег.КоличествоРасход) as КолвоРасход,
	SUM(Рег.КоличествоВозврат) as КолвоВозвр,
	SUM(Рег.КоличествоНачальныйРезерв) as КолвоРезервНачОст,
	SUM(Рег.КоличествоКонечныйРезерв) as КолвоРезервКонОст,
	SUM(Рег.КоличествоСписание) as КолСпис
FROM  
	( 
	SELECT     

		Р.Номенклатура as Номенклатура,    				
		Р.НачалоПериода as НачалоПериода,  	
		Р.КоличествоНачальныйОстаток  as КоличествоНачальныйОстаток,
		Р.КоличествоКонечныйОстаток as КоличествоКонечныйОстаток,
		Р.КоличествоПриход as КоличествоПриход,		
		0 as КоличествоРасход, 
		0 as КоличествоВозврат,
		0 as КоличествоНачальныйРезерв,
		0 as КоличествоКонечныйРезерв,    		
		0 as КоличествоСписание

	FROM
		vt_totalrg_328_769705020 as Р
	UNION ALL 
  
	SELECT		
		РегРез.Номенклатура as Номенклатура,
		РегРез.НачалоПериода as НачалоПериода,
		0 as КоличествоНачальныйОстаток,
		0 as КоличествоКонечныйОстаток,
		0 as КоличествоПриход,
		0 as КоличествоРасход,
		0 as КоличествоВозврат,
		РегРез.КоличествоНачальныйОстаток  as КоличествоНачальныйРезерв,
		РегРез.КоличествоКонечныйОстаток as КоличествоКонечныйРезерв,    		
		0 as КоличествоСписание

	FROM
		vt_totalrg_4480_769705062 as РегРез

	UNION ALL 
     
	SELECT
		РегРасх.Номенклатура as Номенклатура,    				
		РегРасх.Период as НачалоПериода,
		0  as КоличествоНачальныйОстаток,
		0 as КоличествоКонечныйОстаток,
		0 as КоличествоПриход,
		РегРасх.КоличествоОборот as КоличествоРасход,
		РегРасх.КоличествоВОборот as КоличествоВозврат,
		0 as КоличествоНачальныйРезерв,
		0 as КоличествоКонечныйРезерв,    		
		0 as КоличествоСписание

FROM
		(
	SELECT
		Период
		,Номенклатура
		,SUM(КоличествоОборот) AS КоличествоОборот
		,SUM(КоличествоВОборот) AS КоличествоВОборот
		
	FROM
		(SELECT
			docjourn.DATE AS Период
			,ra_2351.Номенклатура AS Номенклатура
			,CASE WHEN ra_2351.debkred = 0 THEN ra_2351.Количество ELSE -ra_2351.Количество END AS КоличествоОборот
			,CASE WHEN ra_2351.debkred = 0 THEN ra_2351.КоличествоВ ELSE -ra_2351.КоличествоВ END AS КоличествоВОборот
			
		FROM
			[Журнал] AS docjourn
		LEFT JOIN [Регистр.Продажи] AS ra_2351
		ON ra_2351.IDDOC = docjourn.IDDOC
		WHERE (docjourn.idx_DATE_TIME_IDDOC >= '20161101     0     0   ')
		AND (docjourn.idx_DATE_TIME_IDDOC < '20161105     0     0   ')
		AND docjourn.ПродажиФр = 1
		AND
			ra_2351.Номенклатура IN (SELECT Val FROM vt_Номен)
		) AS vt_ra_2351
	GROUP BY
		Период
		,Номенклатура
	HAVING (SUM(КоличествоОборот) <> 0)
	OR (SUM(КоличествоВОборот) <> 0)
	
) as РегРасх

	UNION ALL 


	SELECT   
		РегСпис.Номенклатура as Номенклатура,
		Жур.DATE as НачалоПериода,	
		0  as КоличествоНачальныйОстаток,
		0 as КоличествоКонечныйОстаток,
		0 as КоличествоПриход,
		0 as КоличествоРасход,
		0 as КоличествоВозврат,
		0 as КоличествоНачальныйРезерв,
		0 as КоличествоКонечныйРезерв,    		
		РегСпис.КоличествоРасход as КоличествоСписание

	FROM
		vt_totalrg_328_769705064 as РегСпис

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

GROUP BY 
	Рег.Номенклатура,
	Рег.НачалоПериода
create table x(
 [IDDOC] char(9) collate _1C
,[ДокОснование] char(13) collate _1C
,[Склад] char(9) collate _1C
,[Контрагент] char(9) collate _1C
,[Валюта] char(9) collate _1C
,[Курс] numeric(11, 4)
,[Счет] char(23) collate _1C
,[TSP3859] char(3) collate _1C
,[Субконто1] char(23) collate _1C
,[TSP3860] char(3) collate _1C
,[Субконто2] char(23) collate _1C
,[TSP3861] char(3) collate _1C
,[Субконто3] char(23) collate _1C
,[TSP3862] char(3) collate _1C
,[СчетНУ] char(23) collate _1C
,[TSP6144] char(3) collate _1C
,[СубконтоНУ1] char(23) collate _1C
,[TSP6145] char(3) collate _1C
,[СубконтоНУ2] char(23) collate _1C
,[TSP6146] char(3) collate _1C
,[СубконтоНУ3] char(23) collate _1C
,[TSP6147] char(3) collate _1C
,[Сумма] numeric(16, 2)
,Комментарий text collate _1C
, idx_IDDOC char(9) collate _1C
)
create table x(
 [IDDOC] char(9) collate _1C
,[LINENO] numeric(4, 0)
,[ACTNO] numeric(6, 0)
,[DEBKRED] numeric(1, 0)
,[Номенклатура] char(9) collate _1C
,[Покупатель] char(9) collate _1C
,[Поставщик] char(9) collate _1C
,[Фирма] char(9) collate _1C
,[Себестоимость] numeric(16, 2)
,[ПродСтоимость] numeric(16, 2)
,[Количество] numeric(16, 5)
,[СебестоимостьВ] numeric(16, 2)
,[ПродСтоимостьВ] numeric(16, 2)
,[КоличествоВ] numeric(16, 5)
, idx_IDDOC_LINENO_ACTNO char(19) collate _1C
)
Подбор индекса для таблицы 1SJOURN:
	Ограничения: ACDATETIM[dx_DATE_TIME_IDDOC]>=; ACDATETIM[dx_DATE_TIME_IDDOC]<; RF2351[ПродажиФр]=; IDDOC=; 
	В кэше не найдено
	Выбран индекс IDDOC: IDDOC
	Стоимость: 20
Подбор индекса для таблицы 1SJOURN:
	Ограничения: ACDATETIM[dx_DATE_TIME_IDDOC]>=; ACDATETIM[dx_DATE_TIME_IDDOC]<; RF2351[ПродажиФр]=; 
	В кэше не найдено
	Выбран индекс ACDATETIM: DTOS(DATE)+TIME+IDDOC
	Стоимость: 20
Подбор индекса для таблицы RA2351:
	Ограничения: IDDOC=; 
	В кэше не найдено
	Выбран индекс IDLINE: IDDOC+STR(LINENO,4)+STR(ACTNO,6)
	Стоимость: 66
Подбор индекса для таблицы DH1790:
	Ограничения: IDDOC=; 
	В кэше не найдено
	Выбран индекс ID: IDDOC
	Стоимость: 12
Подбор индекса для таблицы DH1790:
	Ограничения: IDDOC=; 
	Найдено в кэше
	Выбран индекс ID: IDDOC
	Стоимость: 12
Подбор индекса для таблицы 1SJOURN:
	Ограничения: IDDOC=; 
	В кэше не найдено
	Выбран индекс IDDOC: IDDOC
	Стоимость: 20
Время подготовки запроса: 450 мс, время выполнения запроса: 161 мс.


ПЛАН:

0;0;TABLE vt_totalrg_328_770039760 AS Р
0;0;TABLE vt_totalrg_4480_770039800 AS РегРез
0;0;TABLE Журнал AS docjourn VIRTUAL TABLE INDEX 1:ACDATETIM;    19 !" 0?b 0C?|?*a#dR 0&
1;1;TABLE Регистр.Продажи AS ra_2351 VIRTUAL TABLE INDEX 0:IDLINE;    10 !  0p nHyd!@4# !
0;0;TABLE vt_Номен
0;0;TABLE vt_totalrg_328_770039802 AS РегСпис
1;1;TABLE Документ.СписаниеТМЦ AS ДокСпис VIRTUAL TABLE INDEX 0:ID;    10 !  0p nHyd!(?
2;2;TABLE Журнал AS Жур VIRTUAL TABLE INDEX 0:IDDOC;    10 !  0p nHyd!(?
0;0;TABLE  AS Рег
Показать


1.0.2.6 (3.15)
1.0.2.6

SELECT 
	Рег.Номенклатура as [Номенклатура $Справочник.Номенклатура],
	Рег.НачалоПериода as [День $Дата], 
	SUM(Рег.КоличествоНачальныйОстаток)  as КолвоНачОст,
	SUM(Рег.КоличествоКонечныйОстаток) as КолвоКонОст,
	SUM(Рег.КоличествоПриход) as КолвоПриход,
	SUM(Рег.КоличествоРасход) as КолвоРасход,
	SUM(Рег.КоличествоВозврат) as КолвоВозвр,
	SUM(Рег.КоличествоНачальныйРезерв) as КолвоРезервНачОст,
	SUM(Рег.КоличествоКонечныйРезерв) as КолвоРезервКонОст,
	SUM(Рег.КоличествоСписание) as КолСпис
FROM  
	( 
	SELECT     

		Р.Номенклатура as Номенклатура,    				
		Р.НачалоПериода as НачалоПериода,  	
		Р.КоличествоНачальныйОстаток  as КоличествоНачальныйОстаток,
		Р.КоличествоКонечныйОстаток as КоличествоКонечныйОстаток,
		Р.КоличествоПриход as КоличествоПриход,		
		0 as КоличествоРасход, 
		0 as КоличествоВозврат,
		0 as КоличествоНачальныйРезерв,
		0 as КоличествоКонечныйРезерв,    		
		0 as КоличествоСписание

	FROM
		vt_totalrg_328_769799611 as Р
	UNION ALL 
  
	SELECT		
		РегРез.Номенклатура as Номенклатура,
		РегРез.НачалоПериода as НачалоПериода,
		0 as КоличествоНачальныйОстаток,
		0 as КоличествоКонечныйОстаток,
		0 as КоличествоПриход,
		0 as КоличествоРасход,
		0 as КоличествоВозврат,
		РегРез.КоличествоНачальныйОстаток  as КоличествоНачальныйРезерв,
		РегРез.КоличествоКонечныйОстаток as КоличествоКонечныйРезерв,    		
		0 as КоличествоСписание

	FROM
		vt_totalrg_4480_769799692 as РегРез

	UNION ALL 
     
	SELECT
		РегРасх.Номенклатура as Номенклатура,    				
		РегРасх.Период as НачалоПериода,
		0  as КоличествоНачальныйОстаток,
		0 as КоличествоКонечныйОстаток,
		0 as КоличествоПриход,
		РегРасх.КоличествоОборот as КоличествоРасход,
		РегРасх.КоличествоВОборот as КоличествоВозврат,
		0 as КоличествоНачальныйРезерв,
		0 as КоличествоКонечныйРезерв,    		
		0 as КоличествоСписание

FROM
		(
	SELECT
		Период
		,Номенклатура
		,SUM(КоличествоОборот) AS КоличествоОборот
		,SUM(КоличествоВОборот) AS КоличествоВОборот
		
	FROM
		(SELECT
			docjourn.DATE AS Период
			,ra_2351.Номенклатура AS Номенклатура
			,CASE WHEN ra_2351.debkred = 0 THEN ra_2351.Количество ELSE -ra_2351.Количество END AS КоличествоОборот
			,CASE WHEN ra_2351.debkred = 0 THEN ra_2351.КоличествоВ ELSE -ra_2351.КоличествоВ END AS КоличествоВОборот
			
		FROM
			[Журнал] AS docjourn
		LEFT JOIN [Регистр.Продажи] AS ra_2351
		ON ra_2351.IDDOC = docjourn.IDDOC
		WHERE (docjourn.idx_DATE_TIME_IDDOC >= '20161101     0     0   ')
		AND (docjourn.idx_DATE_TIME_IDDOC < '20161105     0     0   ')
		AND docjourn.ПродажиФр = 1
		AND
			ra_2351.Номенклатура IN (SELECT Val FROM vt_Номен)
		) AS vt_ra_2351
	GROUP BY
		Период
		,Номенклатура
	HAVING (SUM(КоличествоОборот) <> 0)
	OR (SUM(КоличествоВОборот) <> 0)
	
) as РегРасх

	UNION ALL 


	SELECT   
		РегСпис.Номенклатура as Номенклатура,
		Жур.DATE as НачалоПериода,	
		0  as КоличествоНачальныйОстаток,
		0 as КоличествоКонечныйОстаток,
		0 as КоличествоПриход,
		0 as КоличествоРасход,
		0 as КоличествоВозврат,
		0 as КоличествоНачальныйРезерв,
		0 as КоличествоКонечныйРезерв,    		
		РегСпис.КоличествоРасход as КоличествоСписание

	FROM
		vt_totalrg_328_769799694 as РегСпис

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

GROUP BY 
	Рег.Номенклатура,
	Рег.НачалоПериода
create table x(
 [IDDOC] char(9) collate _1C not null
,[ДокОснование] char(13) collate _1C not null
,[Склад] char(9) collate _1C not null
,[Контрагент] char(9) collate _1C not null
,[Валюта] char(9) collate _1C not null
,[Курс] numeric(11, 4) not null
,[Счет] char(23) collate _1C not null
,[TSP3859] char(3) collate _1C not null
,[Субконто1] char(23) collate _1C not null
,[TSP3860] char(3) collate _1C not null
,[Субконто2] char(23) collate _1C not null
,[TSP3861] char(3) collate _1C not null
,[Субконто3] char(23) collate _1C not null
,[TSP3862] char(3) collate _1C not null
,[СчетНУ] char(23) collate _1C not null
,[TSP6144] char(3) collate _1C not null
,[СубконтоНУ1] char(23) collate _1C not null
,[TSP6145] char(3) collate _1C not null
,[СубконтоНУ2] char(23) collate _1C not null
,[TSP6146] char(3) collate _1C not null
,[СубконтоНУ3] char(23) collate _1C not null
,[TSP6147] char(3) collate _1C not null
,[Сумма] numeric(16, 2) not null
,Комментарий text collate _1C default null
, idx_IDDOC char(9) collate _1C default null
)
create table x(
 [IDDOC] char(9) collate _1C not null
,[LINENO] numeric(4, 0) not null
,[ACTNO] numeric(6, 0) not null
,[DEBKRED] numeric(1, 0) not null
,[Номенклатура] char(9) collate _1C not null
,[Покупатель] char(9) collate _1C not null
,[Поставщик] char(9) collate _1C not null
,[Фирма] char(9) collate _1C not null
,[Себестоимость] numeric(16, 2) not null
,[ПродСтоимость] numeric(16, 2) not null
,[Количество] numeric(16, 5) not null
,[СебестоимостьВ] numeric(16, 2) not null
,[ПродСтоимостьВ] numeric(16, 2) not null
,[КоличествоВ] numeric(16, 5) not null
, idx_IDDOC_LINENO_ACTNO char(19) collate _1C default null
)
szName 1SJOURN
Подбор индекса для таблицы 1SJOURN :
	Ограничения: ACDATETIM[dx_DATE_TIME_IDDOC]>=; ACDATETIM[dx_DATE_TIME_IDDOC]<; RF2351[ПродажиФр]=; 
	Выбран  уникальный  индекс ACDATETIM: DTOS(DATE)+TIME+IDDOC
	Стоимость: 18
szName RA2351
Подбор индекса для таблицы RA2351 :
	Ограничения: SP2343[Номенклатура]=; IDDOC=; 
	Выбран  уникальный  индекс IDLINE: IDDOC+STR(LINENO,4)+STR(ACTNO,6)
	Стоимость: 22
szName DH1790
Подбор индекса для таблицы DH1790 :
	Ограничения: IDDOC=; 
	Выбран  уникальный  индекс ID: IDDOC
	Стоимость: 12
szName DH1790
Подбор индекса для таблицы DH1790 :
	Ограничения: 
	Индекс не выбран.
	Стоимость: 1795
szName 1SJOURN
Подбор индекса для таблицы 1SJOURN :
	Ограничения: IDDOC=; 
	Выбран  уникальный  индекс IDDOC: IDDOC
	Стоимость: 20
Время подготовки запроса: 746 мс, время выполнения запроса: 354 мс.


ПЛАН

4;0;0;SCAN TABLE vt_totalrg_328_769282807 AS Р
5;0;0;SCAN TABLE vt_totalrg_4480_769282887 AS РегРез
3;0;0;COMPOUND SUBQUERIES 4 AND 5 (UNION ALL)
6;0;0;SCAN TABLE Журнал AS docjourn VIRTUAL TABLE INDEX 1:ACDATETIM;    19 !" 0?b 0C?|?*a#dR 0&?/=
6;1;1;SCAN TABLE Регистр.Продажи AS ra_2351 VIRTUAL TABLE INDEX 0:IDLINE;    15 !  0p nHy$40d  Q :H RK2B
6;0;0;EXECUTE LIST SUBQUERY 7
7;0;0;SCAN TABLE vt_Номен
6;0;0;EXECUTE LIST SUBQUERY 8
8;0;0;SCAN TABLE vt_Номен
6;0;0;USE TEMP B-TREE FOR GROUP BY
2;0;0;COMPOUND SUBQUERIES 3 AND 6 (UNION ALL)
9;0;0;SCAN TABLE vt_totalrg_328_769282889 AS РегСпис
9;1;1;SCAN TABLE Документ.СписаниеТМЦ AS ДокСпис VIRTUAL TABLE INDEX 0:ID;    10 !  0p nHyd!0d  Q
9;2;2;SCAN TABLE Журнал AS Жур VIRTUAL TABLE INDEX 0:IDDOC;    10 !  0p nHyd!0d  Q
1;0;0;COMPOUND SUBQUERIES 2 AND 9 (UNION ALL)
0;0;0;SCAN SUBQUERY 1 AS Рег
0;0;0;USE TEMP B-TREE FOR GROUP BY
Показать
+
18. Jill 17 11.11.16 15:40 Сейчас в теме
(14) вставилось потрясающе. И поправить не дает...
+
19. Djelf 253 11.11.16 17:28 Сейчас в теме
(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 и т.п. не видать, может там что-то подтормаживает, а не в результирующем запросе.
Jill; +1
20. Djelf 253 11.11.16 18:29 Сейчас в теме
(18) Непонятненько где и почему тормозит...
Кусок SELECT docjourn.DATE AS Период ,ra_2351.Номенклатура AS Номенклатура в 3.15 в 2 раза быстрее...
Остальные куски должны вести себя так же...
А попробуй ка обернуть запрос в begin rollback, на взаимодействие с 1с это не повлияет. ВыполнятьВТранзакции это для 1с, а не sqlite...
+
21. Djelf 253 11.11.16 19:00 Сейчас в теме
(18) Ага... последний кусок вроде вообще не правильный, возможно он и тормозит
РегСпис.Номенклатура as Номенклатура,
        Жур.DATE as НачалоПериода,    
    FROM
        vt_totalrg_328_769799694 as РегСпис

    INNER JOIN
        [Документ.СписаниеТМЦ] as ДокСпис ON ДокСпис.IDDoc = РегСпис.ТекущийДокумент
    LEFT JOIN
        [Журнал] as Жур ON Жур.IDDoc = РегСпис.ТекущийДокумент) Рег
Показать

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

Мне не очень нравится что ПрямойЗапрос делает временные таблицы для sqlite, если были бы как вложенные, то движок мог бы их как то их по хитрому развернуть.
+
22. Jill 17 14.11.16 14:22 Сейчас в теме
(21) Djelf, извиняюсь за "оперативность". ПК под рукой не было...

Запрос кривой - да. Это привет из далекого прошлого. Там всю обработку желательно выкинуть и написать с нуля. Так, конечно, и поступлю, но все разом - проблемно...

Начало периода - только при переодичности отличной от документ, условие на вид документа не ставится, т.к. прямойзапрос его и итоги впихнуть пытается...


Но основные тормоза не там:
1.0.2.3
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
		(
	SELECT
		Период
		,Номенклатура
		,SUM(КоличествоОборот) AS КоличествоОборот
		,SUM(КоличествоВОборот) AS КоличествоВОборот
		
	FROM
		(SELECT
			docjourn.DATE AS Период
			,ra_2351.Номенклатура AS Номенклатура
			,CASE WHEN ra_2351.debkred = 0 THEN ra_2351.Количество ELSE -ra_2351.Количество END AS КоличествоОборот
			,CASE WHEN ra_2351.debkred = 0 THEN ra_2351.КоличествоВ ELSE -ra_2351.КоличествоВ END AS КоличествоВОборот
			
		FROM
			[Журнал] AS docjourn
		LEFT JOIN [Регистр.Продажи] AS ra_2351
		ON ra_2351.IDDOC = docjourn.IDDOC
		WHERE (docjourn.idx_DATE_TIME_IDDOC >= '20161001     0     0   ')
		AND (docjourn.idx_DATE_TIME_IDDOC < '20161101     0     0   ')
		AND docjourn.ПродажиФр = 1
		AND
			ra_2351.Номенклатура IN (SELECT Val FROM vt_Номен)
		) AS vt_ra_2351
	GROUP BY
		Период
		,Номенклатура
	HAVING (SUM(КоличествоОборот) <> 0)
	OR (SUM(КоличествоВОборот) <> 0)
	
) as РегРасх
) Рег

GROUP BY 
	Рег.Номенклатура,
	Рег.НачалоПериода
create table x(
 [IDJOURNAL] char(4) collate _1C
,[IDDOC] char(9) collate _1C
,[IDDOCDEF] char(4) collate _1C
,[APPCODE] numeric(3, 0)
,[DATE] char(8)
,[TIME] char(6) collate _1C
,[DNPREFIX] char(18) collate _1C
,[DOCNO] char(10) collate _1C
,[CLOSED] numeric(1, 0)
,[ISMARK] char(1) collate _1C
,[ACTCNT] char(6) collate _1C
,[VERSTAMP] char(6) collate _1C
,[БанкФр] numeric(1, 0)
,[ЗаказыФр] numeric(1, 0)
,[ЗаказыЗаявкиФр] numeric(1, 0)
,[ЗаявкиФр] numeric(1, 0)
,[КассаФр] numeric(1, 0)
,[КнигаПокупокФр] numeric(1, 0)
,[КнигаПродажФр] numeric(1, 0)
,[ОстаткиТМЦФр] numeric(1, 0)
,[ПартииНаличиеФр] numeric(1, 0)
,[ПартииОтданныеФр] numeric(1, 0)
,[ПодотчетныеЛицаФр] numeric(1, 0)
,[ПокупателиФр] numeric(1, 0)
,[ПоставщикиФр] numeric(1, 0)
,[ПродажиФр] numeric(1, 0)
,[РеализованныйТоварФр] numeric(1, 0)
,[РезервыТМЦФр] numeric(1, 0)
,[Автор] char(9) collate _1C
,[Проект] char(9) collate _1C
,[Фирма] char(9) collate _1C
,[ЮрЛицо] char(9) collate _1C
,[ОсновнаяПоследовательностьПс] numeric(1, 0)
,[КнигаПокупокПс] numeric(1, 0)
,[КнигаПродажПс] numeric(1, 0)
, idx_IDDOC char(9) collate _1C
, idx_DATE_TIME_IDDOC char(23) collate _1C
, idx_DNPREFIX_DOCNO char(28) collate _1C
, idx_IDDOCDEF_DATE_TIME_IDDOC char(27) collate _1C
, idx_IDJOURNAL_DATE_TIME_IDDOC char(27) collate _1C
, idx_Автор_DATE_TIME_IDDOC char(32) collate _1C
, idx_Проект_DATE_TIME_IDDOC char(32) collate _1C
, idx_Фирма_DATE_TIME_IDDOC char(32) collate _1C
, idx_ЮрЛицо_DATE_TIME_IDDOC char(32) collate _1C
, idx_ОсновнаяПоследовательностьПс_DATE_TIME_IDDOC char(24) collate _1C
, idx_КнигаПокупокПс_DATE_TIME_IDDOC char(24) collate _1C
, idx_КнигаПродажПс_DATE_TIME_IDDOC char(24) collate _1C
)
create table x(
 [IDDOC] char(9) collate _1C
,[LINENO] numeric(4, 0)
,[ACTNO] numeric(6, 0)
,[DEBKRED] numeric(1, 0)
,[Номенклатура] char(9) collate _1C
,[Покупатель] char(9) collate _1C
,[Поставщик] char(9) collate _1C
,[Фирма] char(9) collate _1C
,[Себестоимость] numeric(16, 2)
,[ПродСтоимость] numeric(16, 2)
,[Количество] numeric(16, 5)
,[СебестоимостьВ] numeric(16, 2)
,[ПродСтоимостьВ] numeric(16, 2)
,[КоличествоВ] numeric(16, 5)
, idx_IDDOC_LINENO_ACTNO char(19) collate _1C
)
Подбор индекса для таблицы 1SJOURN:
	Ограничения: ACDATETIM[dx_DATE_TIME_IDDOC]>=; ACDATETIM[dx_DATE_TIME_IDDOC]<; RF2351[ПродажиФр]=; IDDOC=; 
	В кэше не найдено
	Выбран индекс IDDOC: IDDOC
	Стоимость: 20
Подбор индекса для таблицы 1SJOURN:
	Ограничения: ACDATETIM[dx_DATE_TIME_IDDOC]>=; ACDATETIM[dx_DATE_TIME_IDDOC]<; RF2351[ПродажиФр]=; 
	В кэше не найдено
	Выбран индекс ACDATETIM: DTOS(DATE)+TIME+IDDOC
	Стоимость: 20
Подбор индекса для таблицы RA2351:
	Ограничения: IDDOC=; 
	В кэше не найдено
	Выбран индекс IDLINE: IDDOC+STR(LINENO,4)+STR(ACTNO,6)
	Стоимость: 66
Показать


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

ПЛАН:
0;0;TABLE Журнал AS docjourn VIRTUAL TABLE INDEX 1:ACDATETIM; 19 !" 0?b 0C?|?*a#dR 0& )
1;1;TABLE Регистр.Продажи AS ra_2351 VIRTUAL TABLE INDEX 0:IDLINE; 10 ! 0p nHyd!
0;0;TABLE vt_Номен
0;0;TABLE AS РегРасх

1.0.2.6
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
		(
	SELECT
		Период
		,Номенклатура
		,SUM(КоличествоОборот) AS КоличествоОборот
		,SUM(КоличествоВОборот) AS КоличествоВОборот
		
	FROM
		(SELECT
			docjourn.DATE AS Период
			,ra_2351.Номенклатура AS Номенклатура
			,CASE WHEN ra_2351.debkred = 0 THEN ra_2351.Количество ELSE -ra_2351.Количество END AS КоличествоОборот
			,CASE WHEN ra_2351.debkred = 0 THEN ra_2351.КоличествоВ ELSE -ra_2351.КоличествоВ END AS КоличествоВОборот
			
		FROM
			[Журнал] AS docjourn
		LEFT JOIN [Регистр.Продажи] AS ra_2351
		ON ra_2351.IDDOC = docjourn.IDDOC
		WHERE (docjourn.idx_DATE_TIME_IDDOC >= '20161001     0     0   ')
		AND (docjourn.idx_DATE_TIME_IDDOC < '20161101     0     0   ')
		AND docjourn.ПродажиФр = 1
		AND
			ra_2351.Номенклатура IN (SELECT Val FROM vt_Номен)
		) AS vt_ra_2351
	GROUP BY
		Период
		,Номенклатура
	HAVING (SUM(КоличествоОборот) <> 0)
	OR (SUM(КоличествоВОборот) <> 0)
	
) as РегРасх
) Рег

GROUP BY 
	Рег.Номенклатура,
	Рег.НачалоПериода
create table x(
 [IDJOURNAL] char(4) collate _1C not null
,[IDDOC] char(9) collate _1C not null
,[IDDOCDEF] char(4) collate _1C not null
,[APPCODE] numeric(3, 0) not null
,[DATE] char(8) not null
,[TIME] char(6) collate _1C not null
,[DNPREFIX] char(18) collate _1C not null
,[DOCNO] char(10) collate _1C not null
,[CLOSED] numeric(1, 0) not null
,[ISMARK] char(1) collate _1C not null
,[ACTCNT] char(6) collate _1C not null
,[VERSTAMP] char(6) collate _1C not null
,[БанкФр] numeric(1, 0) not null
,[ЗаказыФр] numeric(1, 0) not null
,[ЗаказыЗаявкиФр] numeric(1, 0) not null
,[ЗаявкиФр] numeric(1, 0) not null
,[КассаФр] numeric(1, 0) not null
,[КнигаПокупокФр] numeric(1, 0) not null
,[КнигаПродажФр] numeric(1, 0) not null
,[ОстаткиТМЦФр] numeric(1, 0) not null
,[ПартииНаличиеФр] numeric(1, 0) not null
,[ПартииОтданныеФр] numeric(1, 0) not null
,[ПодотчетныеЛицаФр] numeric(1, 0) not null
,[ПокупателиФр] numeric(1, 0) not null
,[ПоставщикиФр] numeric(1, 0) not null
,[ПродажиФр] numeric(1, 0) not null
,[РеализованныйТоварФр] numeric(1, 0) not null
,[РезервыТМЦФр] numeric(1, 0) not null
,[Автор] char(9) collate _1C not null
,[Проект] char(9) collate _1C not null
,[Фирма] char(9) collate _1C not null
,[ЮрЛицо] char(9) collate _1C not null
,[ОсновнаяПоследовательностьПс] numeric(1, 0) not null
,[КнигаПокупокПс] numeric(1, 0) not null
,[КнигаПродажПс] numeric(1, 0) not null
, idx_IDDOC char(9) collate _1C default null
, idx_DATE_TIME_IDDOC char(23) collate _1C default null
, idx_DNPREFIX_DOCNO char(28) collate _1C default null
, idx_IDDOCDEF_DATE_TIME_IDDOC char(27) collate _1C default null
, idx_IDJOURNAL_DATE_TIME_IDDOC char(27) collate _1C default null
, idx_Автор_DATE_TIME_IDDOC char(32) collate _1C default null
, idx_Проект_DATE_TIME_IDDOC char(32) collate _1C default null
, idx_Фирма_DATE_TIME_IDDOC char(32) collate _1C default null
, idx_ЮрЛицо_DATE_TIME_IDDOC char(32) collate _1C default null
, idx_ОсновнаяПоследовательностьПс_DATE_TIME_IDDOC char(24) collate _1C default null
, idx_КнигаПокупокПс_DATE_TIME_IDDOC char(24) collate _1C default null
, idx_КнигаПродажПс_DATE_TIME_IDDOC char(24) collate _1C default null
)
create table x(
 [IDDOC] char(9) collate _1C not null
,[LINENO] numeric(4, 0) not null
,[ACTNO] numeric(6, 0) not null
,[DEBKRED] numeric(1, 0) not null
,[Номенклатура] char(9) collate _1C not null
,[Покупатель] char(9) collate _1C not null
,[Поставщик] char(9) collate _1C not null
,[Фирма] char(9) collate _1C not null
,[Себестоимость] numeric(16, 2) not null
,[ПродСтоимость] numeric(16, 2) not null
,[Количество] numeric(16, 5) not null
,[СебестоимостьВ] numeric(16, 2) not null
,[ПродСтоимостьВ] numeric(16, 2) not null
,[КоличествоВ] numeric(16, 5) not null
, idx_IDDOC_LINENO_ACTNO char(19) collate _1C default null
)
szName 1SJOURN
Подбор индекса для таблицы 1SJOURN :
	Ограничения: ACDATETIM[dx_DATE_TIME_IDDOC]>=; ACDATETIM[dx_DATE_TIME_IDDOC]<; RF2351[ПродажиФр]=; 
	Выбран  уникальный  индекс ACDATETIM: DTOS(DATE)+TIME+IDDOC
	Стоимость: 18
szName RA2351
Подбор индекса для таблицы RA2351 :
	Ограничения: SP2343[Номенклатура]=; IDDOC=; 
	Выбран  уникальный  индекс IDLINE: IDDOC+STR(LINENO,4)+STR(ACTNO,6)
	Стоимость: 22
Показать


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


ПЛАН
1;0;0;SCAN TABLE Журнал AS docjourn VIRTUAL TABLE INDEX 1:ACDATETIM; 19 !" 0?b 0C?|?*a#dR 0&`4G
1;1;1;SCAN TABLE Регистр.Продажи AS ra_2351 VIRTUAL TABLE INDEX 0:IDLINE; 15 ! 0p nHy$40d Q
1;0;0;EXECUTE LIST SUBQUERY 2
2;0;0;SCAN TABLE vt_Номен
1;0;0;EXECUTE LIST SUBQUERY 3
3;0;0;SCAN TABLE vt_Номен
1;0;0;USE TEMP B-TREE FOR GROUP BY
0;0;0;SCAN SUBQUERY 1 AS РегРасх
0;0;0;USE TEMP B-TREE FOR GROUP BY
+
23. Jill 17 14.11.16 14:28 Сейчас в теме
(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 
	Рег.Номенклатура,
	Рег.НачалоПериода
Показать

+
24. Djelf 253 14.11.16 15:26 Сейчас в теме
(23) Плюсик перед Номенклатура IN поставь. Т.е.
$РегистрОбороты.Продажи(:НачПериода,:КонПериода,День,+Номенклатура  IN (SELECT


IN очень коварная штука. Есть 2 варианта выполнения запроса:
1. читаем исходную таблицу, а потом накладываем фильтр
2. читаем таблицу с условием в IN
Если в IN значений мало то быстрее 2, если много то быстрее 1
В 1.0.2.3 оптимизации в 2 нет, он просто такое не умеет. А движки повыше могут выбрать вариант 2
А тут еще получается что запрос не только к виртуальным таблицам, но и к таблице sqlite. Тестами в sqlite такой вариант не покрыт.
К сожалению прагмой такое поведение не изменить, только при компиляции или плюсом (отключение использования индекса по полю).
Jill; +1
25. Jill 17 14.11.16 16:05 Сейчас в теме
(24) Djelf, понятно. Спасибо!

1.0.2.6
Время подготовки запроса: 14 мс, время выполнения запроса: 390 мс.
+
26. Djelf 253 16.11.16 20:15 Сейчас в теме
(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";
Показать
+
27. vandalsvq 1545 17.11.16 09:38 Сейчас в теме
(25) (26) ух ребят, я смотрю вы тут вовсю его (класс) перекапываете, может потом и сборку правильную сделаете для 1С++ форума? Могу заменить и в теме здесь на Инфостарте. Хотя может даже лучше, чтобы автор кто поправит сам и сделал правильную статью, себе sm заработает. Я не против, поскольку сам уже им не занимаюсь.
+
28. Djelf 253 17.11.16 13:34 Сейчас в теме
(27) Да какое там вовсю переписываем... Сделал трассировку ОстаткоИОборотов, наткнулся на триггер, изумился его тормознутости, долго втыкал почему так.
К счастью, решение оказалось очень простое. А то я уже что-то мутное на сте стал придумывать...
В принципе в классе все хорошо, кое что можно на сте перевести, попробовать отказаться от генерации условий типа '20161001 0 0 ' тогда IN заработает ну и все вроде..
Если бы пользовался переписал бы. А так, времени на тестирование не хватит.
Я лучше luajit в sqlite как расширение встрою, а то обычный lua работать то работает, но слишком медленно.
+
3. r2d255 08.11.16 11:20 Сейчас в теме
А есть шанс что что-то подобное для восьмерки появится?

Можно-ли в восьмерке работать с какой-то внешней бд, при двух условиях:
1. Не устанавливать никаких драйверов и программ. (с пользовательскими правами на сервере)
2. выполнять в ней SQL запросы.
?
+
5. Djelf 253 08.11.16 13:39 Сейчас в теме
(3) Если с "с какой-то внешней бд" то уже есть ВК для firebird http://infostart.ru/public/168241/
+
8. ret-Phoenix 529 08.11.16 20:56 Сейчас в теме
(3) r2d255, Насколько знаю, в 8-ке можно использовать .net сборки, а значит можно использовать готовые либы для разных субд.
Таким образом можно попробовать использовать https://github.com/ret-Phoenix/oscript-sql
Там один API подобный запросам 1С для нескольких СУБД.
+
9. r2d255 08.11.16 23:46 Сейчас в теме
(8) Спасибо.
Я правда не понял, что нужно сделать чтобы стало доступно создание объекта Соединение() ?
+
10. ret-Phoenix 529 09.11.16 11:07 Сейчас в теме
(9) r2d255, А что и как пробовали? можно продолжить в ЛС, мне интересно, получится ли прикрутить мою DLL к 1С )
+
6. Djelf 253 08.11.16 13:44 Сейчас в теме
А... хотя не оно. Оно с сервером работает, а не с файлом. Можно портировать на движок sqlite... Необходимости пока не возникало, а без необходимости стимула нет.
+
7. JohnyDeath 301 08.11.16 15:10 Сейчас в теме
Помню то счастье, когда обладатели dbf-баз могли строить нормальные запросы на основе 1sqlite, а главное использовать ТабличноеПоле!
Спасибо, что не бросил такую вкуснятину.
И Саше Орефкову тоже отельное огромное спасибо.
user1754131; корум; Alister; Il19.ru; artbear; +5
15. lokis 10.11.16 15:04 Сейчас в теме
Доброго всем времени суток !
Прорабатываю такой вариант использования:
1) формируется Таблица Значений
2) "укладывается" в базу
3) запросом вытягиваю значения - это реально быстрее, нежели штатными средствами
Но "затык" - из запроса возвращается таблица с данными во внутреннем представлении - как перевести в нормальное ?
+
16. Djelf 253 10.11.16 15:16 Сейчас в теме
(15) Если укладываешь ТЗ не указывая типизацию колонки, то типизация в запросе должна быть :Неопределенный
+
29. Djelf 253 16.02.17 21:45 Сейчас в теме
Зеркало/Архивы периодически обновляется, а тема нет т.к. скачать "бесплатно" для 1sqlite слетит.
Список изменений внутри последнего архива.
+
30. CheBurator 3119 17.02.17 00:00 Сейчас в теме
ух, радует что я еще не в одиночестве!
+
31. Djelf 253 17.02.17 22:34 Сейчас в теме
(30) А куда я с клюшек? И вообще, надоело сопли вытирать тем кто сменив место работы с моей конфы перешел на УТ ;)
Да, многого в клюшках уже не хватает, в том числе и вариантов хранения данных, для этого sqlite и использую.
Не совсем же я из ума выжил чтоб засовывать 800к xml`ек в dbf базу...
+
32. klif 5 14.02.18 08:44 Сейчас в теме
Подскажите данная компонента подойдет для хранения данных в sqlite? Насколько я вижу все ее используют для запросов к самой 1с базе. Требуется хранить большой объем данных с привязкой к документу в 1с 7.7 .
+
33. Jill 17 14.02.18 12:14 Сейчас в теме
(32) да. Подойдет.
Разного рода доп данные именно так и храню (н-р. доп информация по номенклатуре со ссылками на картинки), чтобы не править конфигурацию + разного рода конфиги обработок.
+
34. klif 5 14.02.18 12:29 Сейчас в теме
(33)
А возможно посмотреть пример ?
+
35. Jill 17 14.02.18 13:57 Сейчас в теме
(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.

Если необходимо более подробно - могу чуть позже опубликовать набор обработок доп. описания.
+
36. klif 5 15.02.18 04:16 Сейчас в теме
Если можно пример записи в базу.
+
37. Djelf 253 20.02.18 12:25 Сейчас в теме
(36) В публикации есть обработка "Дерево CTE" там есть и чтение, и запись, и изменение данных в базе sqlite. Как пример - сойдет.
Jill; +1
38. klif 5 21.02.18 03:54 Сейчас в теме
Спасибо. С записью уже разобрался.
+
39. Cujoko 5 03.05.19 19:45 Сейчас в теме
Спасибо вам за ваш труд. Я-то думаю, почему у меня соединение трёх таблиц, в каждой по 10000 записей, выполняется минут пятнадцать. Я и так, и эдак пытался, индексы создавал. Думал уже, что возможно придётся осваивать C++, потому что от SQLite отказываться было бы ещё больнее.
acanta; +1
40. KHoroshulinAV 171 10.03.24 10:22 Сейчас в теме
Сэр, а на 8.3 эта штука не работает да?
+
41. JohnyDeath 301 10.03.24 10:33 Сейчас в теме
(40) Для v8 есть отдельная.
Я брал с гитхаба: https://github.com/orefkov/v8sqlite
+
42. KHoroshulinAV 171 10.03.24 10:41 Сейчас в теме
Я там dll просто не нашел
+
43. JohnyDeath 301 10.03.24 10:46 Сейчас в теме
Оставьте свое сообщение