Доброго дня всем, кто еще остался на 7.7, а так же знатокам 1с++ и прекрассного класса "ПоставщикДанных" :)
Столкнулась со странным поведением класса ПоставщикДанных.Справочник во время поиска при установленных отборах: Если на ПоставщикДанных наложить несколько условий отбора (больше 2-х) - то во время поиска, неважно посимвольного по колонке, или по целому слову, происходит сбой в табличном поле и на месте найденного появляется последний элемент в списке справочника. Более того ломается весь список в табличном поле - элементы разбегаются в хаотичном порядке, последний элемент, который "встает" на место найденного по поиску дублируется множество раз . Порядок элементов восстанавливается, если сделать Ctrl+PgDn - Ctrl+PgUp и все элементы возвращаются на свои места и даже тот элемент который надо найти, перелистыванием находится на своём месте. Слом происходит именно во время поиска.
При чём, слом происходит только если искомый элемент не попадает в "окно" табличного поля, отображаемое на форме. Если элемент "виден" в списке - то поиск его проходит нормально.
Отладка показала, что поиск то работает, и элемент справочника находится, но в момент позиционирования на него
в табличном поле позиция найденного элемента заменяется последним элементом справочника!
Такое ощущение что ломаются какие то внутренние индексы класса связанные с источником данных?
(4) Тут - врят ли. Я не использовал этот класс в своё время по причине наличия своих классов на основе Перехватчика.
Так что, или топать на мисту в надежде поймать Djelf в теме, или хотя бы на форуме 1cpp запостить вопрос в репозитарии в ветке с классом.
А так, для дбф..врят ли кто копаться будет в клюшках.
Может, у вас тупо переиндексировать надо табличку и оно само пройдёт, ибо кто-там в курсе, как поставщик данных sqllite пользует базу при кривых индексах.
ТП ведет себя подобным образом когда не обеспечена уникальность ключа порядка. Копайте в эту сторону
Хм, начала копать.
Поскольку поиск делаю по наименованию - класс ставит ключом порядка ТекущийОбъект.idx_DESCR
Включила отладку, увидела что при включённых отборах по полям для которых в бд включён отбор по реквизиту - выбирается индекс с этим реквизитом... - и поиск ломается
Если в отборе поставщика не используются поля с включёнными отборами - используется индекс по наименованию, как и в ключе порядка - и поиск работает как надо.
Ушла думать
Итак да, отключение признака отбор у реквизитов справочника, которые я использую в отборе поставщика данных, проблему решило.
Интересно, а можно как то влиять на выбор индексов в ПрямомЗапросе, которым пользуется ПоставщикДанных?
Параметры:
ТекстЗапроса - тип: Строка. Текст запроса для отображения.
КлючевыеПоля - тип: Строка. Список ключевых полей запроса, однозначно идентифицирующего запись.
ИдПоле - тип: Строка. Название поля, позволяющего по его значению определить значения ключевых полей. Предназначено для работы метода ТабличноеПоле::ТекущаяСтрока. Необязательный параметр.
Возвращает: нет.
Описание: Устанавливает текст запроса поставщика данных.
Для быстрого отображения данных поставщик применяет методику частичной выборки, то есть он получает не все данные сразу, а только ту часть, которая помещается на экране. Для этого на основе переданного текста запроса по мере надобности формируются "реальные" запросы, получающие очередную порцию данных:
получить первые N записей
получить следующие N записей, начиная от заданной записи
получить последние N записей
получить предыдущие N записей, начиная от заданной записи
обновить данные в указанной записи
найти запись по заданному значению ID-поля (опционально).
Каждая запись идентифицируется по содержимому ключевых полей, их значение должно быть уникально для каждой записи. Данные выводятся упорядоченными по ключевым полям.
Также поставщик данных может менять состав получемых запросом полей, если часть полей не отображается табличным полем.
Всвязи с таким принципом работы поставщика, возникают следующие требования к тексту запроса:
Запрос должен быть запросом на выборку (sel ect'ом), без указания упорядочивания запроса (без order by).
Все поля в списке полей запроса должны быть указаны явно, указывать поля как * нельзя.
Если для какого-то поля задается алиас, то алиас должен быть заключен в []
В запросе можно применять только именованные SQL-параметры (вида @ИмяПараметра), указывать SQL-параметры как '?' нельзя.
Список ключевых полей запроса задается их перечислением через запятую.
Пример для неиерархического отображения справочника:
УстановитьТекстЗапроса("
select
idx_descr,
id [Элемент :Справочник.Номенлатура],
descr [Наименование]
fr om Справочник_Номенклатура",
"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 меня настораживает, если исходить из ваших слов, что в запросе не должно быть его. Хотя ТабличноеПоле у меня отсортировано именно по наименованию...
Ну и не находит он Вайлдберриз - тот просто после поиска исчезает из табличного поля :(, покрутить его - возвращается :(
(14)Ага... В главном запросе, который формирует ПоставщикДанных ТабличногоПоля этот реквизит присутствует!
Поставщик данных SQLite: Формирование запроса 'первые записи'
select
sc133.idx_DESCR as [КлючПорядка],
sc133.id as [ТекущийЭлемент $Справочник.Контрагенты],
...
(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то находится и на нем позиционируется, а Вайлдберрз пропадает!
В общем, плюнула я на навороты последней версии 1sqlite (1.0.2.6/3.36.0.26 by Djelf) и поставила старенькую ещё орефковскую
и все заработало так как и задумывалось автором класса