|
v7: Долго обновляется журнал на основе поставщика данных | ☑ | ||
---|---|---|---|---|
0
Volodja
02.12.21
✎
07:04
|
Создан журнал на основе поставщика данных,в журнале 2 вида документа Приход и продажа
При движении по списку документов происходят жуткие тормоза. До 5-7 минут на отрисовку новой порции списка документов. Ктио-нибудь с ним еще работает, Куда копать? Это инициализация Поставщика: _СЗ=Форма.Параметр; _ДокументФильтр=0; Если ТипЗначенияСтр(_СЗ)="СписокЗначений" Тогда _ДокументФильтр=_СЗ.Получить("ДокументФильтр"); КонецЕсли; ПоставщикДанных = СоздатьОбъект("ПоставщикДанных"); ПоставщикДанных.КонтейнерТабличногоПоля = "ЖурналСписокДополнительныйЖурнал"; ПоставщикДанных.КонтейнерКоманднойПанели = "ИДКоманднаяПанель"; ПоставщикДанных.ТипЗначений = "Журнал.Товары"; ТабличноеПоле = ПоставщикДанных.ТабличноеПоле; ТабличноеПоле.СтильРамки = 1; ТабличноеПоле.СтильЗаголовков = 1; ТабличноеПоле.АвтоСохранениеНастроекКолонок=1; Данные = ПоставщикДанных.Данные; Данные.СоздатьКнопкиПоУмолчанию(); Данные.РеквизитСортировки = "ДатаДокумента"; Данные.КолонкаПиктограмм = "НомерДокумента"; Данные.РежимВыбора = 0; Данные.РежимОтладки = -1; Данные.АвтоОбновление = 0; // Данные.ПериодАвтоОбновления = 60; // Данные.РазрешитьОтборПоГрафам = 1; Данные.НоваяКолонка("Организация"); Данные.НоваяКолонка("Точка"); Данные.НоваяКолонка("ДатаДокумента"); Данные.НоваяКолонка("НомерДокумента"); Данные.НоваяКолонка("ВремяДокумента"); Данные.НоваяКолонка("Клиент"); Данные.НоваяКолонка("Сумма"); Отбор = ТабличноеПоле.Отбор; ПоляНастройки = Отбор.ПолучитьДоступныеПоля(); Отбор.УстановитьДоступныеПоля(ПоляНастройки); ЭлементОтбора=Отбор.Добавить("Организация"); ЭлементОтбора.Доступность=0; ЭлементОтбора.ВидСравнения=ВидыСравнения.Равно; ЭлементОтбора.Значение = глТочкаЛомбард.Организация; ЭлементОтбора.Использование = 1; ЭлементОтбора.ИзменятьИспользование=0; Если ПустоеЗначение(_ДокументФильтр)=0 Тогда ЭлементОтбора=Отбор.Добавить("ТекущийДокумент"); ЭлементОтбора.Доступность=0; ЭлементОтбора.ВидСравнения=ВидыСравнения.Равно; ЭлементОтбора.Значение = _ДокументФильтр; ЭлементОтбора.Использование = 1; ЭлементОтбора.ИзменятьИспользование=0; Иначе Если (СокрЛП(НазваниеНабораПрав())<>"Администратор") Тогда ЭлементОтбора=Отбор.Добавить("Точка"); ЭлементОтбора.Доступность=0; ЭлементОтбора.ВидСравнения=ВидыСравнения.Равно; ЭлементОтбора.Значение = глТочкаЛомбард; ЭлементОтбора.Использование = 1; ЭлементОтбора.ИзменятьИспользование=0; КонецЕсли; ЭлементОтбора=Отбор.Добавить("ДатаДокумента"); ЭлементОтбора.Доступность=1; ЭлементОтбора.ВидСравнения=ВидыСравнения.Интервал; Интервал=глПолучитьСтандартныйИнтервалЖурналаДокументов(); ЭлементОтбора.ЗначениеС = Интервал.НачалоСтандартногоИнтервала; ЭлементОтбора.ЗначениеПо = Интервал.КонецСтандартногоИнтервала; ЭлементОтбора.Использование = 1; ЭлементОтбора.ИзменятьИспользование=1; КонецЕсли; //ЭлементОтбора = Отбор.Добавить("НаименованиеКонтрагента"); ТабличноеПоле.СтандартныйБыстрыйПоиск = 1; ТабличноеПоле.ПозиционныйБыстрыйПоиск = 0; ТабличноеПоле.ВосстановитьПозициюКолонок(); ПоставщикДанных.Обновить(); |
|||
47
Ёпрст
03.12.21
✎
09:51
|
Попробуй, короче
|
|||
48
Volodja
03.12.21
✎
10:02
|
(47)
ПоставщикДанных.КонтейнерТабличногоПоля = "ЖурналСписокДополнительныйЖурнал"; Это "КонтейнерТабличногоПоля " также оставлять? По документации у меня на его допустимые значения нет ничего. |
|||
49
АгентБезопасной Нацио
03.12.21
✎
10:03
|
(46) хм. а какой индекс подходящий для такого уже существует?
по идее надо что-то типа DTOS(Date)+Time+IDDOC+iddocdef Хотя можно указать Doctype (который DOCTYPE IDDOCDEF,DATE,TIME,IDDOC ) Ну или если журнал отдельный - то JOURNAL (IDJOURNAL,DATE,TIME,IDDOC) |
|||
50
Volodja
03.12.21
✎
10:04
|
+48
КонтейнерТабличногоПоля Синтаксис: КонтейнерТабличногоПоля Доступ: Чтение и запись Тип: Строка Описание: идентификатор элемента формы типа «Кнопка», которая будет использована в качестве контейнера для элемента управления «ТабличноеПоле». Реквизит обязателен для указания после создания объекта. Это все, что есть |
|||
51
АгентБезопасной Нацио
03.12.21
✎
10:05
|
(50) ну так контенер - это просто по сути "место для реквизита". Элемент управления типа "кнопка", котроый будет заменен на элемент управления типа "Табличное поле"
|
|||
52
Volodja
03.12.21
✎
10:07
|
(49) DTOS(Date)+Time+IDDOC+iddocdef вроде этот и подключает
пишет что попдание в индекс стоимость 20 сейчас меняю тип журанала, позже покажу отладочную информацию |
|||
53
Volodja
03.12.21
✎
10:08
|
(44) пробую сначала на Обычный.
|
|||
54
Volodja
03.12.21
✎
10:09
|
(44) стоял дополнительный
|
|||
55
Volodja
03.12.21
✎
10:12
|
(51) Точно, пардон, а я сразу подумал, что это от типа журнала. Просто он у меня так называется
|
|||
56
Volodja
03.12.21
✎
10:18
|
(47) Обычный не взлетел. Также долго при прокрутке
А Общий валится при инициализации |
|||
57
Volodja
03.12.21
✎
10:22
|
(49) Вот отладочная инфа:
Поставщик данных SQLite: Формирование запроса 'первые записи' select journ.idx_DATE_TIME_IDDOC as [КлючПорядка], journ.iddoc as [ТекущийДокумент $Документ], journ.iddocdef as [ТекущийДокумент_вид], case when journ.ismark = '*' then 7 else case when journ.closed&1 = 1 then 8 else 6 end end as [Пиктограмма], ltrim(journ.docno) as [НомерДокумента], journ.time as [ВремяДокумента $Время], journ.date as [ДатаДокумента $Дата], journ.iddocdef AS [ВидДокумента $ВидДокументаПредставление], journ.closed&1 AS [Проведен], case when journ.ismark = '*' then 1 else 0 end as [ПометкаУдаления], journ.ДокументОснование as [ДокументОснование :Документ], journ.Организация as [Организация :Справочник.Организации], journ.Точка as [Точка :Справочник.Точки], case journ.iddocdef when ' L2' then ДокПродажаТоваров.Сумма when ' L7' then ДокПриходТоваров.Сумма when ' O4' then ДокСписаниеТоваров.Сумма end as [Сумма :Число.15.2], ДокПродажаТоваров.Клиент as [Клиент :Справочник.Клиенты] from [Журнал] as journ left join [Документ.ПродажаТоваров] as ДокПродажаТоваров on journ.iddoc = ДокПродажаТоваров.iddoc left join [Документ.ПриходТоваров] as ДокПриходТоваров on journ.iddoc = ДокПриходТоваров.iddoc left join [Документ.СписаниеТоваров] as ДокСписаниеТоваров on journ.iddoc = ДокСписаниеТоваров.iddoc where ((journ.iddocdef in (' L2',' L7',' O4'))) order by journ.idx_DATE_TIME_IDDOC asc limit @sqlite_data_provider_rowcount Подбор индекса для таблицы 1SJOURN : Ограничения: IDDOCDEF=; Упорядочить: ACDATETIM[dx_DATE_TIME_IDDOC], Выбран индекс DOCTYPE: IDDOCDEF+DTOS(DATE)+TIME+IDDOC Попадает в сортировку Стоимость: 20 Подбор индекса для таблицы 1SJOURN : Ограничения: Упорядочить: ACDATETIM[dx_DATE_TIME_IDDOC], Выбран индекс ACDATETIM: DTOS(DATE)+TIME+IDDOC Попадает в сортировку Стоимость: 1 Подбор индекса для таблицы DH758 : Ограничения: IDDOC=; Выбран уникальный индекс ID: IDDOC Стоимость: 6 Подбор индекса для таблицы DH763 : Ограничения: IDDOC=; Выбран уникальный индекс ID: IDDOC Стоимость: 5 Подбор индекса для таблицы DH868 : Ограничения: IDDOC=; Выбран уникальный индекс ID: IDDOC Стоимость: 3 |
|||
58
Djelf
03.12.21
✎
10:42
|
(57) Понятно. Это моя сборка, какой версии 1sqlite? Попробуй более свежую отсюда: https://cloud.mail.ru/public/9znr/ZJ6ULE9aR
Точно не помню в какой версии добавлял подсказку оптимизатору sqlite, что при left join по iddoc выбирается только один документ, но не понял как проверять, работает или нет. При left join [Документ.ПродажаТоваров] as ДокПродажаТоваров сначала дергается индекс в ПродажаТоваров, потом сама таблица ПродажаТоваров и из нее Сумма, а при limit offset с left join sqlite не очень понимает как по быстрому прокрутить строки без выполнения все left join`ов. Отсюда и тормоза. Можно дергать сумму в событии ПриВыводеСтроки или возможно коррелирующем подзапросом, но ПД вроде не умеет коррелирующий подзапрос. |
|||
59
Ёпрст
03.12.21
✎
10:46
|
(57)
journ.closed&1 AS [Проведен] - это не работает ни в фоксе, ни в скульлайте |
|||
60
Ёпрст
03.12.21
✎
10:47
|
гораздо проще ставить фильтр на все значения closed
|
|||
61
trad
03.12.21
✎
10:49
|
(57) а есть то же, только при прокрутке?
|
|||
62
Volodja
03.12.21
✎
10:50
|
(Версия продукта 1.0.2.6/3.30.1.23)
|
|||
63
Volodja
03.12.21
✎
10:54
|
(61)Вот, когда снизу вверх пошел
Поставщик данных SQLite: Формирование запроса 'предыдущие записи' select journ.idx_DATE_TIME_IDDOC as [КлючПорядка], journ.iddoc as [ТекущийДокумент $Документ], journ.iddocdef as [ТекущийДокумент_вид], case when journ.ismark = '*' then 7 else case when journ.closed&1 = 1 then 8 else 6 end end as [Пиктограмма], ltrim(journ.docno) as [НомерДокумента], journ.time as [ВремяДокумента $Время], journ.date as [ДатаДокумента $Дата], journ.iddocdef AS [ВидДокумента $ВидДокументаПредставление], journ.closed&1 AS [Проведен], case when journ.ismark = '*' then 1 else 0 end as [ПометкаУдаления], journ.ДокументОснование as [ДокументОснование :Документ], journ.Организация as [Организация :Справочник.Организации], journ.Точка as [Точка :Справочник.Точки], case journ.iddocdef when ' L2' then ДокПродажаТоваров.Сумма when ' L7' then ДокПриходТоваров.Сумма when ' O4' then ДокСписаниеТоваров.Сумма end as [Сумма :Число.15.2], ДокПродажаТоваров.Клиент as [Клиент :Справочник.Клиенты] from [Журнал] as journ left join [Документ.ПродажаТоваров] as ДокПродажаТоваров on journ.iddoc = ДокПродажаТоваров.iddoc left join [Документ.ПриходТоваров] as ДокПриходТоваров on journ.iddoc = ДокПриходТоваров.iddoc left join [Документ.СписаниеТоваров] as ДокСписаниеТоваров on journ.iddoc = ДокСписаниеТоваров.iddoc where ((journ.iddocdef in (' L2',' L7',' O4'))) and journ.idx_DATE_TIME_IDDOC < @sqlite_data_provider_key0 order by journ.idx_DATE_TIME_IDDOC desc limit @sqlite_data_provider_rowcount Подбор индекса для таблицы 1SJOURN : Ограничения: IDDOCDEF=; ACDATETIM[dx_DATE_TIME_IDDOC]<; Упорядочить: ACDATETIM[dx_DATE_TIME_IDDOC] desc, Выбран индекс ACDATETIM: DTOS(DATE)+TIME+IDDOC Попадает в сортировку Стоимость: 20 Подбор индекса для таблицы 1SJOURN : Ограничения: ACDATETIM[dx_DATE_TIME_IDDOC]<; Упорядочить: ACDATETIM[dx_DATE_TIME_IDDOC] desc, Выбран индекс ACDATETIM: DTOS(DATE)+TIME+IDDOC Попадает в сортировку Стоимость: 20 Подбор индекса для таблицы DH758 : Ограничения: IDDOC=; Выбран уникальный индекс ID: IDDOC Стоимость: 6 Подбор индекса для таблицы DH763 : Ограничения: IDDOC=; Выбран уникальный индекс ID: IDDOC Стоимость: 5 Подбор индекса для таблицы DH868 : Ограничения: IDDOC=; Выбран уникальный индекс ID: IDDOC Стоимость: 3 |
|||
64
Ёпрст
03.12.21
✎
10:57
|
Воткни флаги итоги по.. в реквизите сумма, чтоб они были отдельным полем в журнале, тогда не нужно будет соединение с табличками доков соединение делать
|
|||
65
Djelf
03.12.21
✎
11:03
|
(62) 3.30.1.23 и тормозит! Там в движке sqlite, для виртуальных таблиц, типа 1С было сломана работа с IN(...).
|
|||
66
Volodja
03.12.21
✎
11:05
|
(64) Они есть
|
|||
67
Volodja
03.12.21
✎
11:06
|
(65) как проверить версию загруженного SQLite ?
Потому что заменил на последнюю 3-36-0-25, а все также. |
|||
68
trad
03.12.21
✎
11:09
|
(64) итогов сумм в журнале не будет, они будут в шапках, которые и цепляются
|
|||
69
Djelf
03.12.21
✎
11:10
|
(67)
Странно, на 3.30.1.23
|
|||
70
Ёпрст
03.12.21
✎
11:10
|
(68) Да ? не помню уже за структуру, но какая то шляпа вроде была, ибо "пересчет служебных данных в ТиИ" как раз и пересчитывал итоги в журнале.. не ?
|
|||
71
Ёпрст
03.12.21
✎
11:11
|
Лень клюшки искать что б проверить это
|
|||
72
trad
03.12.21
✎
11:15
|
(70) да. Пересчитывает итоги, только не в журнале а в шапках. Верь мне.
|
|||
73
Volodja
03.12.21
✎
11:16
|
(69) 3.36.0
|
|||
74
Volodja
03.12.21
✎
11:20
|
(69) Попробовать в классе заменить
((journ.iddocdef in (' L2',' L7',' O4'))) на ((journ.iddocdef = ' L2' or journ.iddocdef =' L7' or journ.iddocdef =' O4'))) ? |
|||
75
АгентБезопасной Нацио
03.12.21
✎
11:22
|
(70) не, точно в шапках. пару месяцев назад кому-то правил...
|
|||
76
Ёпрст
03.12.21
✎
11:26
|
(72) верю :)
Доставать клюшки не буду :) |
|||
77
Ёпрст
03.12.21
✎
11:28
|
+ просто помню, что что-то точно пересчитывается при установленных флагах.
Снеговик, че, забываешь уже клюшки |
|||
78
Djelf
03.12.21
✎
11:29
|
(74) Хм, с двумя документами что так, что сяк и на 3.36.0 подтормаживает. Нужно чуток покрутить...
|
|||
79
Djelf
03.12.21
✎
11:30
|
+(78) Нужно убрать нахрен индекс по Журнал.IDDOCDEF, вот таким образом +Журнал.IDDOCDEF
|
|||
80
АгентБезопасной Нацио
03.12.21
✎
11:30
|
(77) клюшки помнятся только из-за своей простоты.
|
|||
81
АгентБезопасной Нацио
03.12.21
✎
11:31
|
(79) убрать?
|
|||
82
Volodja
03.12.21
✎
11:31
|
(76) В шапке и в таб части идин и тот же именованный реквизит (с итогом)
|
|||
83
Djelf
03.12.21
✎
11:42
|
(81) Попробовать стоит...
|
|||
84
Volodja
03.12.21
✎
11:48
|
(83) А как мне в (63) это записать?
|
|||
85
АгентБезопасной Нацио
03.12.21
✎
11:48
|
"но почему???"©анекдот
по идее, запрос получается типа select ### order by КлючПорядка, а при листании - select top N ### where КлючПорядка>ЗначениеНижнегоКлючаПорядка order by КлючПорядка |
|||
86
АгентБезопасной Нацио
03.12.21
✎
11:50
|
+(85) а исключая iddocdef из ключа порядка ты увеличиваешь накладняк на выборку.
хотя могу быть и неправ... |
|||
87
Djelf
03.12.21
✎
12:08
|
(86) Так IN же и два значения, а индекс "IDDOCDEF,DATE,TIME,IDDOC", и IDDOCDEF первый, следовательно нужно перебирать таблицу 2 раза.
Тут выгоднее индекс "DATE,TIME,IDDOC" и фильтр по IDDOCDEF, во всяком случае для табличного поля. |
|||
88
trad
03.12.21
✎
12:13
|
(86) ТСу вряд ли нужно упорядочивание по виду дока
|
|||
89
АгентБезопасной Нацио
03.12.21
✎
12:14
|
(87) понял.
жалко, что DTOS(Date)+Time+iddocdef+IDDOC нету |
|||
90
trad
03.12.21
✎
12:15
|
(87) тоже так считаю
Но у автора, судя по отладке в (57)(63), работает как раз индекс "DATE,TIME,IDDOC" |
|||
91
trad
03.12.21
✎
12:17
|
(89) не помогло бы. По датевремени ограничение > <, а по виду =
|
|||
92
trad
03.12.21
✎
12:18
|
Для данной задачи придуман индекс "IDJOURNAL,DATE,TIME,IDDOC"
Почему не работает - не понятно |
|||
93
Volodja
03.12.21
✎
12:23
|
(92) наверное потому-что idjournal в запрос не включен.
Скорее всего родной журнал этот индекс и использует |
|||
94
Djelf
03.12.21
✎
12:25
|
ИМХО: Лучше выкрутится так - завести Графу отбора "ТипОтбора" или несколько таких и вот тогда взлетит, иначе для ТП использование нескольких отборов по IN противопоказано.
|
|||
95
Djelf
03.12.21
✎
12:32
|
(90) Хм, точно. Но там отладка на 3.30.1, а на 3.36.0 было бы так:
|
|||
96
trad
03.12.21
✎
12:35
|
(93) конечно на иджурнал воткнуть в запрос
|
|||
97
trad
03.12.21
✎
12:37
|
(95) индекс доктайп считаю для этой задачи не эффективным
|
|||
98
Volodja
03.12.21
✎
12:38
|
(95) Отладка на 3.36.0
Поставщик данных SQLite: Формирование запроса 'первые записи' select journ.idx_DATE_TIME_IDDOC as [КлючПорядка], journ.iddoc as [ТекущийДокумент $Документ], journ.iddocdef as [ТекущийДокумент_вид], case when journ.ismark = '*' then 7 else case when journ.closed&1 = 1 then 8 else 6 end end as [Пиктограмма], ltrim(journ.docno) as [НомерДокумента], journ.time as [ВремяДокумента $Время], journ.date as [ДатаДокумента $Дата], journ.iddocdef AS [ВидДокумента $ВидДокументаПредставление], journ.closed&1 AS [Проведен], case when journ.ismark = '*' then 1 else 0 end as [ПометкаУдаления], journ.ДокументОснование as [ДокументОснование :Документ], journ.Организация as [Организация :Справочник.Организации], journ.Точка as [Точка :Справочник.Точки], case journ.iddocdef when ' L2' then ДокПродажаТоваров.Сумма when ' L7' then ДокПриходТоваров.Сумма when ' O4' then ДокСписаниеТоваров.Сумма end as [Сумма :Число.15.2], ДокПродажаТоваров.Клиент as [Клиент :Справочник.Клиенты] from [Журнал] as journ left join [Документ.ПродажаТоваров] as ДокПродажаТоваров on journ.iddoc = ДокПродажаТоваров.iddoc left join [Документ.ПриходТоваров] as ДокПриходТоваров on journ.iddoc = ДокПриходТоваров.iddoc left join [Документ.СписаниеТоваров] as ДокСписаниеТоваров on journ.iddoc = ДокСписаниеТоваров.iddoc where (((journ.date between '20210101' and '20211203Я')) and (journ.iddocdef in (' L2',' L7',' O4'))) order by journ.idx_DATE_TIME_IDDOC asc limit @sqlite_data_provider_rowcount Подбор индекса для таблицы 1SJOURN : Ограничения: IDDOCDEF=; DATE>=; DATE<=; Упорядочить: ACDATETIM[dx_DATE_TIME_IDDOC], Выбран индекс DOCTYPE: IDDOCDEF+DTOS(DATE)+TIME+IDDOC Попадает в сортировку Стоимость: 18 Подбор индекса для таблицы 1SJOURN : Ограничения: DATE>=; DATE<=; Упорядочить: ACDATETIM[dx_DATE_TIME_IDDOC], Выбран индекс ACDATETIM: DTOS(DATE)+TIME+IDDOC Попадает в сортировку Стоимость: 20 Подбор индекса для таблицы DH758 : Ограничения: IDDOC=; Выбран уникальный индекс ID: IDDOC Стоимость: 6 Подбор индекса для таблицы DH763 : Ограничения: IDDOC=; Выбран уникальный индекс ID: IDDOC Стоимость: 5 Подбор индекса для таблицы DH868 : Ограничения: IDDOC=; Выбран уникальный индекс ID: IDDOC Стоимость: 3 |
|||
99
Djelf
03.12.21
✎
12:41
|
(96) У меня IDJOURNAL у Реализации ' 3JG', а у Счет-Фактуры ' 3JT', т.е. опять чертов IN.
|
|||
100
Volodja
03.12.21
✎
12:44
|
А ведь документ может входить в разные журналы, тогда какой ID журанала ему проставится?
|
|||
101
trad
03.12.21
✎
12:45
|
(99) оба вида должны быть в одном журнале с одном ид
|
|||
102
Djelf
03.12.21
✎
12:45
|
Это видимо надо по 1SCRDOC отбирать, вот там журналы.
|
|||
103
trad
03.12.21
✎
12:46
|
Или я туплю?.. и такого не сделать
|
|||
104
trad
03.12.21
✎
12:48
|
(102) а, да, наверно
Тоже постепенно деградирую до Ёпрст )) |
|||
105
Volodja
03.12.21
✎
12:49
|
получается нужно соединение с 1SCRDOC и условие на MDID ?
|
|||
106
trad
03.12.21
✎
13:01
|
Црдок - ведущая. По ней мддок= и ключ порядка.
К ней цеплять журнал и шапки |
|||
107
trad
03.12.21
✎
13:03
|
(106) *
мдид= |
|||
108
Ёпрст
03.12.21
✎
14:00
|
(104) Амнезия, амнезия, всё позабыл! И мне теперь не страшно! ©Гражданская Оборона
|
|||
109
Djelf
03.12.21
✎
14:15
|
(105) Не получится. Даже если бы там были ссылки на обычные журнала, а их там нет, то при левом джойне все равно Журнал перечитывался бы несколько раз.
Проверь в консоли что будет если запустить без order by, будет сначала реализация, а потом сф, т.е. для ТП не подойдет.
Только два варианта я тут вижу - графа отбора, либо отключение индекса в ПД.Журнал в конце функции ПолучитьТекстИсточникаСбора. |
|||
110
АгентБезопасной Нацио
03.12.21
✎
14:24
|
(108) "я забыл, что значит страх"©Кипелов
(109) так вроде в ПД есть возможность заменить на вручную сделаный запрос. |
|||
111
Злопчинский
03.12.21
✎
14:34
|
(110) настоящий Кипелов здесь! https://youtu.be/pQFAn_tKbu8
|
|||
112
Djelf
03.12.21
✎
15:13
|
(110) Не помню, вроде можно.
Но, ИМХО, проще слегка сам класс поправить, чтобы он по IN не использовал индекс. Это хорошо работает в обычных рапросах, но не с ПД, ПД создавался когда IN не поступал в оптимизатор sqlite и этот момент не учитывается. +(109) Не графа отбора, конечно, а общий реквизит документов ИдЖурнала Число.1.0 |
|||
113
АгентБезопасной Нацио
03.12.21
✎
15:28
|
(111) сталь! только тонкая... жесть, короче...
(112) Поправить класс - можно. Но на мой взгляд, проще использовать штатный ид журнала. Хотя я, честно говоря, не помню, как он создается. вроде как созданием дополнительного журнала. |
|||
114
Djelf
03.12.21
✎
15:48
|
(113) Видимо можно, что-то я наверное ступил ;)
https://gyazo.com/04d62ef4ec7dd72d4c524e87f8f55d43 Но там будут только документы конкретного журнала, а не произвольные виды документов. |
|||
115
Djelf
03.12.21
✎
15:54
|
+(114) Вроде еще есть "Дополнительный журнал", но он видимо не сработает с ТП по причине (108). ТП по БД ненавидит лишние сортировки.
|
|||
116
АгентБезопасной Нацио
03.12.21
✎
15:56
|
(114) ну ему и нужно по сути "дополнительный журнал". Я вот только не помню, где хранятся данные о принадлежности к дополнительному журналу. "Общий" - это просто journ. "Обычный" - поле в journ, а вот дополнительный - не помню. имхо, 1scrdoc
|
|||
117
Djelf
03.12.21
✎
16:15
|
(116) Я не очень понимаю зачем журнал в 3х вариантах, где оно спрятано и как это можно применить, так чтобы сортировка в sqlite не делала выборку всей таблицы, а потом ее сортировку.
Танцы вокруг ТП это сложно, особенно при привязке к БД. |
|||
118
АгентБезопасной Нацио
03.12.21
✎
16:22
|
(117) ну так это же штатное поведение клюшек - общий журнал, в котором все документы и отбор по общим реквизитам, обычный - это в поле в journ пишется ид обычного журнала, которому принадлежит док. соотвественно отбор только по дате. ну и дополнительный - я не помню, как он устроен
|
|||
119
Djelf
03.12.21
✎
16:25
|
Вот и я не помню. Знать "ВСЁ" это вредно для мозга...
|
|||
120
АгентБезопасной Нацио
03.12.21
✎
16:28
|
(119) а как же киножурнал? :-)
|
|||
121
Volodja
03.12.21
✎
19:04
|
(114) А где можно скачать такой Query Analizer ?
|
|||
122
Djelf
04.12.21
✎
11:32
|
(121) Это моя нетленка, там понадергано всякого кода из разных мест, поэтому так кошмар в коде, и зоопарк вк, типа Scintilla.
По факту ничего особенного переделанная на диалект sqlite обработка отсюда https://www.1cpp.ru/forum/YaBB.pl?num=1217410246/0 А с журналами все проще оказывается
Немножко времени было, ПоставщикДанных на VBCCR17 https://cloud.mail.ru/public/bQzb/PYt6TfMVM на W10 нормально работает... VBCCR17: https://www.vbforums.com/showthread.php?841929-VB6-ActiveX-CommonControls-(Replacement-of-the-MS-common-controls) |
|||
123
Volodja
04.12.21
✎
14:14
|
(122) Немного не понял. Мне просто подменить файлы из https://cloud.mail.ru/public/bQzb/PYt6TfMVM ?
Спасибо. |
|||
124
Volodja
04.12.21
✎
14:17
|
(122)
ПоставщикДанных = СоздатьОбъект("ПоставщикДанных"); ПоставщикДанных.ТипЗначений = "Журнал.ДокументыПоПокупателям"; Это при инициализации журнала у меня было. |
|||
125
Volodja
04.12.21
✎
15:19
|
+(123) Это тому у кого под Windows 10 ПД не запускается
|
|||
126
Djelf
04.12.21
✎
15:56
|
(124) Да? Тогда непонятно откуда взялся еще и фильтр на несколько видов документов.
(125) Насколько помню эти компоненты требуют лицензии на Офис. А vbccr*.ocx нет. |
|||
127
Volodja
05.12.21
✎
08:22
|
(126) Да у меня в (0) это прописано:
ПоставщикДанных = СоздатьОбъект("ПоставщикДанных"); ПоставщикДанных.КонтейнерТабличногоПоля = "ЖурналСписокДополнительныйЖурнал"; ПоставщикДанных.КонтейнерКоманднойПанели = "ИДКоманднаяПанель"; ПоставщикДанных.ТипЗначений = "Журнал.Товары"; |
|||
128
Volodja
05.12.21
✎
08:24
|
(126) Видимо ПД так устроен, что по типу журнала он просто вытаскивает состав документов и делает по ним фильтр.
|
|||
129
Volodja
05.12.21
✎
08:51
|
(109) Да этот запрос выдает что нужно.В классе попробую подменить IN() на WITH
и попробовать как он будет с порциями работать Спасибо. |
|||
130
Volodja
05.12.21
✎
08:52
|
+(129)
WITH DocDef(ID) AS (values (' L2'),(' L7'),(' O4')) /* тут ссылки на виды документов */ SELECT Журнал.DATE [Дата :Дата] ,Журнал.TIME [Время :Время] ,Журнал.IDDOCDEF||Журнал.IDDOC [Документ :Документ] FROM DocDef LEFT JOIN Журнал ON Журнал.IDDOCDEF=DocDef.ID AND Журнал.DATE BETWEEN '20190101' AND '20211201' Подбор индекса для таблицы 1SJOURN : Ограничения: IDDOCDEF=; DATE>=; DATE<=; Выбран индекс DOCTYPE: IDDOCDEF+DTOS(DATE)+TIME+IDDOC Стоимость: 20 |
|||
131
Djelf
05.12.21
✎
10:04
|
Тогда так, в ПД.Журнал
|
|||
132
Djelf
05.12.21
✎
10:10
|
+(131) Но лучше еще чуток изменить
|
|
|||
133
Volodja
05.12.21
✎
12:50
|
(132) Немного не так сделал:
... Если ЭтоSQL=1 Тогда // добавляем фильтр по виду документов КоличествоДокументов = ВидыДокументов.Количество(); Если КоличествоДокументов > 0 Тогда ТекстИсточника = ТекстИсточника + " |"+КлючевоеСлово+" (ТекущийОбъект.iddocdef "; КлючевоеСлово = "and"; КонецЕсли; СтрокаВидыДокументов = ""; ЗнакСравнения = ""; Для НомерВида = 0 По КоличествоДокументов-1 Цикл ВидДокумента = ВидыДокументов.Получить(НомерВида); ИДОбъекта = МетаДата.ИДДокумента(ВидДокумента); ИДОбъекта = ?(ЭтоSQL = 1,ИДОбъекта,"'"+Прав(_IdToStr(ИДОбъекта),4)+"'"); СтрокаВидыДокументов = СтрокаВидыДокументов + ?(НомерВида = 0,"",",") + ИДОбъекта; КонецЦикла; ТекстИсточника = ТекстИсточника + ?(КоличествоДокументов = 1,"= ","in (") + СтрокаВидыДокументов + ?(КоличествоДокументов = 1,"",")") + ")"; Иначе ТекстИсточника = ТекстИсточника + " |"+КлючевоеСлово+ " (ТекущийОбъект.idjournal = :ЖурналДокументов."+ВидЖурнала+" ) ";// добавляем использование индекса по виду журнала КонецЕсли; Возврат ТекстИсточника; КонецФункции Спасибо вам, Djelf, огромное. |
|||
134
Djelf
05.12.21
✎
13:00
|
А я лет 10 назад отказался от этого класса в журналах, именно из-за таких диких и непонятных тормозов ;)
Теперь скорость невероятно выше стала, но уже поздновато... У тебя в (133) вообще отключены фильтры на iddocdef, это не очень правильно, например у пользователя нет прав на документ, тогда такой документ выводить не стоит. И кроме того, в iddocdef может быть только один документ, тогда никаких in не будет и индекс возможно на него переключится, это будет еще быстрее. |
|||
135
Volodja
05.12.21
✎
13:04
|
(134)Я попробовал оставить in(), но тогда тормоза остаются. К условию in() добавлялся еще фильтр по журналу
|
|||
136
Volodja
05.12.21
✎
13:09
|
+(135) Возможно нужно было поменятьт местами условия IN() и филтр по журналу, но я это не попробовал
|
|||
137
Djelf
05.12.21
✎
13:43
|
(135) Я написал в (131) и (132) как отключить индекс по IN. Т.е. IN то останется, а вот индекс по ТекущийОбъект.iddocdef использоваться не будет и будет сначала чтение по индексу idjournal, а в процессе работы уже накладываться фильтр.
Вот план запроса и план выполнения: https://gyazo.com/b8b4a4b3fac3f4df9b16a3a51b46ce6b |
|||
138
Volodja
05.12.21
✎
14:07
|
(137) Тогда я чтоөто не увиде что-ли?
У меня вот так и было вначале: // добавляем фильтр по виду документов КоличествоДокументов = ВидыДокументов.Количество(); Если КоличествоДокументов > 0 Тогда ТекстИсточника = ТекстИсточника + " |"+КлючевоеСлово+" (ТекущийОбъект.iddocdef "; КлючевоеСлово = "and"; КонецЕсли; Это ваш код: // добавляем фильтр по виду документов КоличествоДокументов = ВидыДокументов.Количество(); Если КоличествоДокументов > 0 Тогда ТекстИсточника = ТекстИсточника + " |"+КлючевоеСлово+" (+ТекущийОбъект.iddocdef ";// блокируем использование индекса КлючевоеСлово = "and"; КонецЕсли; Кроме этого я не вижу различий: // блокируем использование индекса |
|||
139
Volodja
05.12.21
✎
14:13
|
Повторю, может это важно.У меня база DBF.
|
|||
140
Volodja
05.12.21
✎
14:25
|
+(139) А когда я попробовал заремарить
// ТекстИсточника = ТекстИсточника + " // |"+КлючевоеСлово+" (ТекущийОбъект.iddocdef "; ПД вывалился с ошибкой.Поэтому я сделал как в (133) |
|||
141
Volodja
05.12.21
✎
14:35
|
+(140) ТекстИсточника = ТекстИсточника + ?(КоличествоДокументов = 1,"= ","in (") + СтрокаВидыДокументов + ?(КоличествоДокументов = 1,"",")") + ")";
Скорее всего нужно было в конце убрать; + ")"; |
|||
142
Djelf
05.12.21
✎
14:54
|
Может скопировался текст неудачно. Вот картинка https://gyazo.com/337ff65bedeea0f9a7026737a58da9bc
В sqlite "+" перед полем, по которому возможно использование индекса, отключает использование такого индекса. Т.е. если КоличествоДокументов=1, то индекс в данной ситуации использовать можно, а условие будет через "=". А если КоличествоДокументов>1, то будет использовано не "=", а in(...) и для тп это нужно отключать плюсом. |
|||
143
Volodja
05.12.21
✎
15:05
|
+(142) Спасибо буду знать.
|
|||
144
Volodja
05.12.21
✎
15:17
|
(142) поправил.Работает быстро.Красота
Спасибо. |
|||
145
Ёпрст
05.12.21
✎
19:05
|
Вы всё еще кипятите ?
|
|||
146
Djelf
05.12.21
✎
20:23
|
(145) Нет! Обычно пользуемся Ёпрст`ом, но в этот раз он не помог ;(
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |