Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Свернуть справочник (число прочтений - 4584 )
Bagirius
Full Member
***
Отсутствует



Сообщений: 135
Зарегистрирован: 19. Февраля 2008
Пол: Мужской
Свернуть справочник
15. Января 2009 :: 21:30
Печать  
Есть справочник Номенклатуры, в котором кроме Кода и Наименования есть поля с индексами (Артикул, ОЕ), по которым работаем быстрый поиск по "первым буквам".
Стоит задача отображать только те товары которые отвечают определенным условиям (например, которые есть в наличии на выбранном складе, у выбранной фирмы).
Делал так:
1. Формировал СЗ с помощью прямого запроса и в справочнике ИспользоватьСписокЭлементов(СЗ). в этом случае, перестает работать поиск по первым символам в Наименовании, и доп. полях с индексами. Это в моем случае не приемлемо
2. Пытался разрулить с помощью
http://www.kb.mista.ru/article.php?id=361
не получилось

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

Как запасной вариант, вижу в написании обработки для справочника, с применением ТП. Но может можно как-то над справочником поизголяться.

Может кто посоветует рациональное решение.

ЗЫ: Принцип такой. В базе решили учитывать несколько фирм, у каждой фирмы может быть как общий товар, так и собственный, т.е. элемент справочника. Если в элементе справочника выбран реквизит Фирма, то элемент применим только для выбранной фирмы, если не выбран, то для всех. Так для многих справочников (Клиенты, Склады ...). Так вот, при работе, необходимо отображать только те элементы, которые привязаны к этой фирме, с которой работает пользователь. Не охото для каждого справочника писать обраьотку с ТП и переделывать все подборы в документах.
  
Наверх
ICQ  
IP записан
 
ev-kov
God Member
*****
Отсутствует



Сообщений: 694
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Свернуть справочник
Ответ #1 - 16. Января 2009 :: 02:59
Печать  
а может лучше в зависимости от значения реквизита фирма в нужную папку перемещать (родитель) тогда при подборе будет проще

ЗЫ: а если это скуль то обновление родителя повесить на триггер после  записи элемента справочника.
« Последняя редакция: 16. Января 2009 :: 06:59 - ev-kov »  

Информация - то, что снижает неопределенность в какой-либо области и очень важно не ошибиться областью в наш информационный век!
Наверх
 
IP записан
 
sadovnikov
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 420
Зарегистрирован: 06. Марта 2007
Re: Свернуть справочник
Ответ #2 - 16. Января 2009 :: 05:28
Печать  
  
Наверх
 
IP записан
 
Bagirius
Full Member
***
Отсутствует



Сообщений: 135
Зарегистрирован: 19. Февраля 2008
Пол: Мужской
Re: Свернуть справочник
Ответ #3 - 24. Января 2009 :: 22:28
Печать  
Да дополню - это SQL
  
Наверх
ICQ  
IP записан
 
Bagirius
Full Member
***
Отсутствует



Сообщений: 135
Зарегистрирован: 19. Февраля 2008
Пол: Мужской
Re: Свернуть справочник
Ответ #4 - 24. Января 2009 :: 22:39
Печать  
sadovnikov писал(а) 16. Января 2009 :: 05:28:

Я как понял там ТП надо использовать, что не совсем приемлемо, точнее мрого очень переделывать. Хотелось бы найти решение не используя ТП.
  
Наверх
ICQ  
IP записан
 
U_zer
Экс-Участник


Re: Свернуть справочник
Ответ #5 - 26. Января 2009 :: 07:02
Печать  
А если написать свой механизм быстрого поиска?
У нас около 30000 позиций - работает вполне шустро.
  
Наверх
 
IP записан
 
Chieftain
Senior Member
****
Отсутствует


___

Сообщений: 498
Местоположение: Тула
Зарегистрирован: 15. Февраля 2007
Пол: Мужской
Re: Свернуть справочник
Ответ #6 - 26. Января 2009 :: 08:39
Печать  
Bagirius писал(а) 15. Января 2009 :: 21:30:
Главная цель - сохранить возможность быстрого поиска по первым буквам, при сокращенном выводе справочника.

У меня в нескольких конторах фильтрация по остаткам как раз через "ИспользоватьСписокЗначений". Если правильно помню, если список нормально отсортирован тормозов при быстром поиске не бывает
  
Наверх
ICQ  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Свернуть справочник
Ответ #7 - 26. Января 2009 :: 13:15
Печать  
Судя по описанию задачи - оптимальным было бы индексированное представление.
Без табличного поля не обойтись.
  
Наверх
 
IP записан
 
Bagirius
Full Member
***
Отсутствует



Сообщений: 135
Зарегистрирован: 19. Февраля 2008
Пол: Мужской
Re: Свернуть справочник
Ответ #8 - 27. Января 2009 :: 21:40
Печать  
kiruha писал(а) 26. Января 2009 :: 13:15:
Судя по описанию задачи - оптимальным было бы индексированное представление.
Без табличного поля не обойтись.


Либо реализовать через заполнение из СЗ + свой быстрый поиск

А насчет своего быстрого поиска, я думаю задача не сложная.
Как я понимаю, находим по первым символам нужную позицию, в Спр, созданном через СоздатьОбъект(), и позиционируемся на найденном элементе.

Только вот как реализовать механиз, чтобы поиск срабатывал при наборе символов непосредственно в Списке справочника, как штатная процедура в быстром поиске по первым символам?

Может кто подскажет?
  
Наверх
ICQ  
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Свернуть справочник
Ответ #9 - 28. Января 2009 :: 03:44
Печать  
Bagirius писал(а) 27. Января 2009 :: 21:40:
Только вот как реализовать механиз, чтобы поиск срабатывал при наборе символов непосредственно в Списке справочника, как штатная процедура в быстром поиске по первым символам?

Может кто подскажет?

А на табличное поле переехать никак?
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
U_zer
Экс-Участник


Re: Свернуть справочник
Ответ #10 - 28. Января 2009 :: 07:01
Печать  
Bagirius писал(а) 27. Января 2009 :: 21:40:
kiruha писал(а) 26. Января 2009 :: 13:15:
Судя по описанию задачи - оптимальным было бы индексированное представление.
Без табличного поля не обойтись.


Либо реализовать через заполнение из СЗ + свой быстрый поиск

А насчет своего быстрого поиска, я думаю задача не сложная.
Как я понимаю, находим по первым символам нужную позицию, в Спр, созданном через СоздатьОбъект(), и позиционируемся на найденном элементе.

Только вот как реализовать механиз, чтобы поиск срабатывал при наборе символов непосредственно в Списке справочника, как штатная процедура в быстром поиске по первым символам?

Может кто подскажет?


Через ПриНажатииКнопкиКлавиатуры() + Прямой запрос+ АктивизироватьОбъект()
  
Наверх
 
IP записан
 
Bagirius
Full Member
***
Отсутствует



Сообщений: 135
Зарегистрирован: 19. Февраля 2008
Пол: Мужской
Re: Свернуть справочник
Ответ #11 - 28. Января 2009 :: 07:25
Печать  
Цитата:
Через ПриНажатииКнопкиКлавиатуры() + Прямой запрос+ АктивизироватьОбъект()


Спасибо, думаю это для меня оптимальное решение.
Буду реализовывать.
о результатах сообщу Улыбка
  
Наверх
ICQ  
IP записан
 
Bagirius
Full Member
***
Отсутствует



Сообщений: 135
Зарегистрирован: 19. Февраля 2008
Пол: Мужской
Re: Свернуть справочник
Ответ #12 - 29. Января 2009 :: 12:22
Печать  
Сделал СЗ прямым запросом - все ок
Сделал Поиск - ищет, но так долго, что просто пи...

Использовал такой алгоритм

Если КолонкаПоиска = "Код" Тогда
           РеквизитПоиска = "Номенклатура.CODE";
     ИначеЕсли КолонкаПоиска = "Наименование" Тогда
           РеквизитПоиска = "$Номенклатура.СортНаимАрт";
     ИначеЕсли КолонкаПоиска = "Артикул" Тогда
           РеквизитПоиска = "$Номенклатура.СортАртНаим";
     Иначе
           Возврат;
     КонецЕсли;
     
     ORDER_BY = "";
     Если Иерархия = 1 Тогда
           ORDER_BY = "Номенклатура.ISFOLDER";
     КонецЕсли;
     Если Сорт = 2 Тогда
           ORDER_BY = ORDER_BY + ?(ПустаяСтрока(ORDER_BY) = 1, "", ", ") + "$Номенклатура.СортНаимАрт";
     ИначеЕсли Сорт = 3 Тогда
           ORDER_BY = ORDER_BY + ?(ПустаяСтрока(ORDER_BY) = 1, "", ", ") + "$Номенклатура.СортАртНаим";
     Иначе
           ORDER_BY = ORDER_BY + ?(ПустаяСтрока(ORDER_BY) = 1, "", ", ") + "Номенклатура.CODE";
     КонецЕсли;
     
     RS = СоздатьОбъект("ODBCRecordset");      
     ТекстЗапроса = "
           |SELECT Номенклатура.ID [Ссылка $Справочник.Номенклатура]
           |FROM $Справочник.Номенклатура AS Номенклатура
           |WHERE (Номенклатура.ID IN (SELECT val FROM #СписТов))
           |      AND (LEFT(" +  РеквизитПоиска + ", :СтрокаДлина) = :СтрокаПоиска)"
           
           + ?(Иерархия = 1, " AND  (Номенклатура.PARENTID = :Родитель)", "") + "
     |";      
     
     ТекстЗапроса = ТекстЗапроса + "ORDER BY " + ORDER_BY;
     
     //Сообщить(ТекстЗапроса);
     
     RS.УложитьСписокОбъектов(СЗТовары, "#СписТов");
     RS.УстановитьТекстовыйПараметр("СтрокаДлина", СтрДлина(СтрокаПоиска));
     RS.УстановитьТекстовыйПараметр("СтрокаПоиска", СтрокаПоиска);
     RS.УстановитьТекстовыйПараметр("Родитель", Родитель);
     СЗ = СоздатьОбъект("СписокЗначений");
     RS.ВыполнитьИнструкцию(ТекстЗапроса, СЗ, 1);
     //СЗ.ВыбратьЗначение(,);
     
     
     
     Если СЗ.РазмерСписка() > 1 Тогда
           АктивизироватьОбъект(СЗ.ПолучитьЗначение(1));            
     КонецЕсли;

Получается, что при каждом добавлении буквы в поиск выполняется запрос, как можно ускорить мое творение, или может я не тем путем пошел.
Может кто предложит свой вариант.
  
Наверх
ICQ  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Свернуть справочник
Ответ #13 - 29. Января 2009 :: 12:43
Печать  
А зачем запрос, если все равно используешь СЗ?
Выгрузи один раз СЗ в индексированную таблицу , добавь индексы по полям поиска - и ищи в ней.
  
Наверх
 
IP записан
 
U_zer
Экс-Участник


Re: Свернуть справочник
Ответ #14 - 29. Января 2009 :: 13:04
Печать  
Используй парам. запрос, просто по условиям, по которым ты 1 раз строишь СписокТоваров, например по отбору. Результат - Это есть ВыполнитьСкалярный() там всего один товар должен быть.

Да, запрос будет срабатывать при вводе любого символа, используй Like.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать