Поставщик.Данных.Справочник, ПрямыеЗапросы, 1sqlite - кто виноват?

1. zhenyat 6 14.10.22 12:18 Сейчас в теме
Доброго дня всем, кто еще остался на 7.7, а так же знатокам 1с++ и прекрассного класса "ПоставщикДанных" :)
Столкнулась со странным поведением класса ПоставщикДанных.Справочник во время поиска при установленных отборах: Если на ПоставщикДанных наложить несколько условий отбора (больше 2-х) - то во время поиска, неважно посимвольного по колонке, или по целому слову, происходит сбой в табличном поле и на месте найденного появляется последний элемент в списке справочника. Более того ломается весь список в табличном поле - элементы разбегаются в хаотичном порядке, последний элемент, который "встает" на место найденного по поиску дублируется множество раз . Порядок элементов восстанавливается, если сделать Ctrl+PgDn - Ctrl+PgUp и все элементы возвращаются на свои места и даже тот элемент который надо найти, перелистыванием находится на своём месте. Слом происходит именно во время поиска.
При чём, слом происходит только если искомый элемент не попадает в "окно" табличного поля, отображаемое на форме. Если элемент "виден" в списке - то поиск его проходит нормально.

Отладка показала, что поиск то работает, и элемент справочника находится, но в момент позиционирования на него
ТабличноеПоле.ТекущаяСтрока = ЗначенияВыборки.ПолучитьЗначение(1,1);
в табличном поле позиция найденного элемента заменяется последним элементом справочника!
Такое ощущение что ломаются какие то внутренние индексы класса связанные с источником данных?

1сpp 3.2.4.1
1sqlite 1.0.2.6/3.36.0.26 by Djelf
ПоставщикДанных 5.0.5 23.05.2014
ПрямыеЗапросы 1.8.6 22.05.2013

Может кто-то уже сталкивался и знает как исправить?
Прикрепленные файлы:
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. user1203706 13 14.10.22 13:34 Сейчас в теме
3. user1203706 13 14.10.22 13:39 Сейчас в теме
ЗЫ: и чего бы не спросить у автора класса напрямую тут?
https://www.1cpp.ru/forum/YaBB.pl?num=1285520767

Если он еще, конечно мониторит своё изделие, в чем сомневаюсь.
4. zhenyat 6 14.10.22 16:38 Сейчас в теме
(3)Да он уже давненько писал, что 7.7 больше не занимается :(, думала может тут еще кто-то возится...
5. user1203706 13 14.10.22 16:46 Сейчас в теме
(4) Тут - врят ли. Я не использовал этот класс в своё время по причине наличия своих классов на основе Перехватчика.
Так что, или топать на мисту в надежде поймать Djelf в теме, или хотя бы на форуме 1cpp запостить вопрос в репозитарии в ветке с классом.
А так, для дбф..врят ли кто копаться будет в клюшках.
Может, у вас тупо переиндексировать надо табличку и оно само пройдёт, ибо кто-там в курсе, как поставщик данных sqllite пользует базу при кривых индексах.
6. zhenyat 6 14.10.22 17:25 Сейчас в теме
(5) Эх.... таблички то у меня каждую ночь переиндексируются, так что точно не в этом дело..
7. user1203706 13 14.10.22 17:28 Сейчас в теме
(6) основной индекс какой для табличного поля выбран хоть ?
8. zhenyat 6 17.10.22 15:19 Сейчас в теме
Из обсуждения на форуме 1cpp
ТП ведет себя подобным образом когда не обеспечена уникальность ключа порядка. Копайте в эту сторону

Хм, начала копать.
Поскольку поиск делаю по наименованию - класс ставит ключом порядка ТекущийОбъект.idx_DESCR
Включила отладку, увидела что при включённых отборах по полям для которых в бд включён отбор по реквизиту - выбирается индекс с этим реквизитом... - и поиск ломается
Если в отборе поставщика не используются поля с включёнными отборами - используется индекс по наименованию, как и в ключе порядка - и поиск работает как надо.

Ушла думать

Итак да, отключение признака отбор у реквизитов справочника, которые я использую в отборе поставщика данных, проблему решило.
Интересно, а можно как то влиять на выбор индексов в ПрямомЗапросе, которым пользуется ПоставщикДанных?
9. user1203706 13 17.10.22 19:46 Сейчас в теме
(8) Что указываешь в ИдПоля вот тут:
УстановитьТекстЗапроса(ТекстЗапроса, КлючевыеПоля, [ИдПоле]) ???
Это и есть основной индекс табличного поля
10. user1203706 13 17.10.22 19:53 Сейчас в теме
Ну и в тексте запроса должно быть
idx_DESCR [КлючПорядка]
11. user1203706 13 17.10.22 20:23 Сейчас в теме
Вот, с доки по sqllite:

Синтаксис: УстановитьТекстЗапроса(ТекстЗапроса, КлючевыеПоля, [ИдПоле])

Параметры:
ТекстЗапроса - тип: Строка. Текст запроса для отображения.
КлючевыеПоля - тип: Строка. Список ключевых полей запроса, однозначно идентифицирующего запись.
ИдПоле - тип: Строка. Название поля, позволяющего по его значению определить значения ключевых полей. Предназначено для работы метода ТабличноеПоле::ТекущаяСтрока. Необязательный параметр.
Возвращает: нет.

Описание: Устанавливает текст запроса поставщика данных.

Для быстрого отображения данных поставщик применяет методику частичной выборки, то есть он получает не все данные сразу, а только ту часть, которая помещается на экране. Для этого на основе переданного текста запроса по мере надобности формируются "реальные" запросы, получающие очередную порцию данных:

получить первые N записей
получить следующие N записей, начиная от заданной записи
получить последние N записей
получить предыдущие N записей, начиная от заданной записи
обновить данные в указанной записи
найти запись по заданному значению ID-поля (опционально).
Каждая запись идентифицируется по содержимому ключевых полей, их значение должно быть уникально для каждой записи. Данные выводятся упорядоченными по ключевым полям.

Также поставщик данных может менять состав получемых запросом полей, если часть полей не отображается табличным полем.

Всвязи с таким принципом работы поставщика, возникают следующие требования к тексту запроса:

Запрос должен быть запросом на выборку (sel ect'ом), без указания упорядочивания запроса (без order by).
Все поля в списке полей запроса должны быть указаны явно, указывать поля как * нельзя.
Если для какого-то поля задается алиас, то алиас должен быть заключен в []
В запросе можно применять только именованные SQL-параметры (вида @ИмяПараметра), указывать SQL-параметры как '?' нельзя.
Список ключевых полей запроса задается их перечислением через запятую.

Пример для неиерархического отображения справочника:

УстановитьТекстЗапроса("
    select
    idx_descr,
    id [Элемент :Справочник.Номенлатура],
    descr [Наименование]
    fr om Справочник_Номенклатура",
    "idx_descr", "Элемент");


Смотри, как в твоём классе устанавливается текст запроса для поставщика данных табличного поля.
И поправь, на как нннадо.
12. zhenyat 6 18.10.22 11:54 Сейчас в теме
(11) Класс то не мой, более того он использует для запросов к бд другой класс, который уже использует sqlite...
Поискала в классе, нашла
ПоставщикДанных.УстановитьТекстЗапроса(ТекстЗапроса,"[КлючПорядка]","[ТекущийЭлемент :Справочник."+ВидСправочника+"]");
где
ПоставщикДанных = СоздатьОбъект("SQLiteDataProvider")

Как я ранее писала
КлючПорядка = ТекущийОбъект.idx_DESCR

В поиске отладка показывает такую картину (ищу "вайлд"):
sel ect 
	ТекущийОбъект.id as [ТекущийЭлемент $Справочник.Контрагенты]

fr om [Справочник.Контрагенты] as ТекущийОбъект 

where
	(((ТекущийОбъект.isfolder = 2
		and ТекущийОбъект.ismark = ' ' collate _1C)
		and ТекущийОбъект.ЗапретОтгрузки = 0
		and ТекущийОбъект.Спящий = 0
	and (ТекущийОбъект.РольПокупатель = 1)))
and ТекущийОбъект.descr >= 'вайлд' collate _1C
	and SUBSTR(ТекущийОбъект.descr,1,5) = 'вайлд' collate _1C

and ТекущийОбъект.idx_DESCR > '4Х4 УК ООО                                                                            9999'

order by
	ТекущийОбъект.idx_DESCR
limit 1
Подбор индекса для таблицы SC133 :
	Ограничения: ISFOLDER=; ISMARK=; SP48696[ЗапретОтгрузки]=; SP60405[Спящий]=; SP54021[РольПокупатель]=; DESCR>=; DESCR[dx_DESCR]>; 
	Упорядочить: DESCR[dx_DESCR], 
	Выбран индекс DESCR: UPPER(DESCR)
	Попадает в сортировку
	Стоимость: 14
Время подготовки запроса: 27 мс, время выполнения запроса: 43 мс.
Показать

Вот этот order by меня настораживает, если исходить из ваших слов, что в запросе не должно быть его. Хотя ТабличноеПоле у меня отсортировано именно по наименованию...
Ну и не находит он Вайлдберриз - тот просто после поиска исчезает из табличного поля :(, покрутить его - возвращается :(
13. user1203706 13 18.10.22 12:18 Сейчас в теме
(12) да, воткни туда явно поле
select
idx_descr [КлючПорядка]
14. user1203706 13 18.10.22 12:21 Сейчас в теме
Или сортировку выкинь хотя бы.
15. zhenyat 6 18.10.22 14:55 Сейчас в теме
(14)Ага... В главном запросе, который формирует ПоставщикДанных ТабличногоПоля этот реквизит присутствует!
Поставщик данных SQLite: Формирование запроса 'первые записи'
select
sc133.idx_DESCR as [КлючПорядка],
sc133.id as [ТекущийЭлемент $Справочник.Контрагенты],
...
попробую добавить в запрос поиска...
16. zhenyat 6 18.10.22 15:04 Сейчас в теме
(15)С добавление в запрос поиска
idx_descr as [КлючПорядка]
поиск вообще перестал работать...
17. zhenyat 6 18.10.22 15:07 Сейчас в теме
(16) а сама виновата, там же теперь два реквизита в результате поиска... Погодите ка...
18. zhenyat 6 18.10.22 15:14 Сейчас в теме
(17)Увы, ни добавление поля, ни удаление сортировки проблемы не решило :(
sel ect 
	idx_descr as [КлючПорядка],
	ТекущийОбъект.id as [ТекущийЭлемент $Справочник.Контрагенты]

fr om [Справочник.Контрагенты] as ТекущийОбъект 

where
	(((ТекущийОбъект.isfolder = 2
		and ТекущийОбъект.ismark = ' ' collate _1C)
		and ТекущийОбъект.ЗапретОтгрузки = 0
		and ТекущийОбъект.Спящий = 0
	and (ТекущийОбъект.РольПокупатель = 1)))
and ТекущийОбъект.descr >= 'вайлд' collate _1C
	and SUBSTR(ТекущийОбъект.descr,1,5) = 'вайлд' collate _1C

and ТекущийОбъект.idx_DESCR > '4Х4 УК ООО                                                                            9999'

limit 1
Подбор индекса для таблицы SC133 :
	Ограничения: ISFOLDER=; ISMARK=; SP48696[ЗапретОтгрузки]=; SP60405[Спящий]=; SP54021[РольПокупатель]=; DESCR>=; DESCR[dx_DESCR]>; 
	Выбран индекс DESCR: UPPER(DESCR)
	Стоимость: 14
Время подготовки запроса: 14 мс, время выполнения запроса: 33 мс.
Показать

Всё равно элемент находится но на месте найденного в табличном поле появляется какой то другой :(
Вернее найденный элемент исчезает из списка табличного поля. Почему то только Вайлдберриз? Даже если искать что то находящееся радом с ним в списке - это что0то находится и на нем позиционируется, а Вайлдберрз пропадает!
19. zhenyat 6 18.10.22 15:40 Сейчас в теме
Может как то влиять то что в табличном поле отключен иерархический просмотр и группы зафильтрованы отбором?
20. user1203706 13 19.10.22 00:41 Сейчас в теме
(18) это же запрос поиска конкретного элемента..там и сортировку можешь оставить и idx_descr там не нужен.

Я про запрос, который в поставщика табличного поля говорил, там что ?
21. zhenyat 6 19.10.22 12:25 Сейчас в теме
В общем, плюнула я на навороты последней версии 1sqlite (1.0.2.6/3.36.0.26 by Djelf) и поставила старенькую ещё орефковскую
и все заработало так как и задумывалось автором класса
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот