Имя: Пароль:
1C
1C 7.7
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)

Сообщить(База.НовыйЗапрос().ВыполнитьЗапрос("SELECT sqlite_version()",0));

Странно, на 3.30.1.23

AND Журнал.IDDOCDEF IN(' 1KZ') жестоко тормозит
AND Журнал.IDDOCDEF = ' 1KZ' нормально работает
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 было бы так:

Подбор индекса для таблицы 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
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, будет сначала реализация, а потом сф, т.е. для ТП не подойдет.

WITH DocDef(ID) AS (values (' 1KZ'),(' 18R')) /* тут ссылки на виды документов */
SELECT
    Журнал.DATE [Дата :Дата]
    ,Журнал.TIME [Время :Время]
    ,Журнал.IDDOCDEF||Журнал.IDDOC [Документ :Документ]
FROM DocDef
LEFT JOIN Журнал ON Журнал.IDDOCDEF=DocDef.ID AND Журнал.DATE BETWEEN :НачДата AND :КонДата

Только два варианта я тут вижу - графа отбора, либо отключение индекса в ПД.Журнал в конце функции ПолучитьТекстИсточникаСбора.
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) Видимо можно, что-то я наверное ступил ;)

SELECT DISTINCT
    Журнал.IDDOCDEF [IDDOCDEF :ВидДокумента]
    ,Журнал.IDJOURNAL [IDJOURNAL :ПредставлениеВида]
FROM Журнал

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
Тогда так, в ПД.Журнал

Функция ПолучитьТекстИсточникаСбора(ЭтоПоиск = 0,ТекстСоединения = "")

...

    // добавляем фильтр по виду документов
    КоличествоДокументов = ВидыДокументов.Количество();
    Если КоличествоДокументов > 0 Тогда
        ТекстИсточника = ТекстИсточника + "
        |"+КлючевоеСлово+" (+ТекущийОбъект.iddocdef "; // блокируем использование индекса
        КлючевоеСлово = "and";
    КонецЕсли;

...

    ТекстИсточника = ТекстИсточника + ?(КоличествоДокументов = 1,"= ","in (") + СтрокаВидыДокументов + ?(КоличествоДокументов = 1,"",")") + ")";
    
    Если ЭтоSQL = 0 Тогда
        ТекстИсточника = ТекстИсточника + "and ТекущийОбъект.idjournal = :ЖурналДокументов."+ВидЖурнала; // добавляем использование индекса по виду журнала
    КонецЕсли;
    
    Возврат ТекстИсточника;
132 Djelf
 
05.12.21
10:10
+(131) Но лучше еще чуток изменить
|
    "+КлючевоеСлово+" ("+?(КоличествоДокументов>1,"+","")+"ТекущийОбъект.iddocdef ";
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) Нет! Обычно пользуемся Ёпрст`ом, но в этот раз он не помог ;(
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан