Помогите в создании Процедуры Поиск в (7.7)

  • Автор темы buralimon
  • Дата начала
B

buralimon

Гость
#1
Как написать процедуру Поиска товара в Справочнике "Номенклатура" по фрагменту наименование товара,чтоб процедура вызывалось при нажатии соответствующей кнопки на форме списка справочника номенклатуры.
Например пользователь набтрает: Труба 150 и должно появится список номенклатуры поиска:
1) Труба диаметр-150
2) Труба(Сантехника)
3) Труба(Колектор)
4) Труба "Черепица"
5) Труба
6) 150
 

puh14

Well-Known Member
11.07.2008
1 412
0
НеРезиновая
#2
куда появится? Выгрузится в ТЗ для позиционирования(для одного значения), отобраться в форме списка по имени (для нескольких), вывести список товаров или как?

ДЛя поиска используй запрос с условием Найти(Товар.наименование,ВыбПоиск)>0

Где
товар - Справочник.Номенклатура.ТекущийЭлемент

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

KiR

НЕ шибка опытный програмер)
11.09.2007
1 581
0
#3
вообще-то в любом справочнике вверху есть поле поиск с кнопочками вперед и назад - что мешает туда вбить слово труба или 150 и искать так?
 
B

buralimon

Гость
#4
куда появится? Выгрузится в ТЗ для позиционирования(для одного значения), отобраться в форме списка по имени (для нескольких), вывести список товаров или как?

ДЛя поиска используй запрос с условием Найти(Товар.наименование,ВыбПоиск)>0

Где
товар - Справочник.Номенклатура.ТекущийЭлемент

а так как тебе придется бороться с пробелами - то запросы надо пускать в цикле, где на каждый круг ВыбПоиск - строка от пробела до пробела. И потом ещё проверять - есть ли у тебя подобная хрень среди ранее отобранных.
вывести список товаров или как?
Да список товаров(в Форме списка)
куда появится?Появится ТЗ,набираешь в соотвествии букв,например набрал "Тру" и должно выводится список этих значений(номенклатур) "Тру":
ТРУБа(для сантехники)
ТРУБа(для крана) и тд.
В 8-ке на сколько я знаю задаешь 2 процедуры:
ПриИзменении:
ПоискОбъектовВСпискахДанных.ЗначениеОтбораПоискаданныхПриИзменении(Элемент, ЗначениеОтбораСпискаНоменклатуры);
и автоподбор:
ПоискОбъектовВСпискахДанных.АвтоПодборТекстаПоиска(Элемент, Текст, ТекстАвтоПодбора, СтандартнаяОбработка);
в 7-ке мало приходилось работать,вот и не знаю с чего начинать.
 

puh14

Well-Known Member
11.07.2008
1 412
0
НеРезиновая
#6
Да список товаров(в Форме списка)
куда появится?Появится ТЗ,набираешь в соотвествии букв,например набрал "Тру" и должно выводится список этих значений(номенклатур) "Тру":
Ну ТЗ это не совсем форма списка - это ТЗ. В форме подобного можно добится через УстановитьОтбор() - но там тебя ждет большой геморой с иерархией и группами. ТЗ проще.

Тебе надо создать реквизит формы (К примеру ВыбПоиск), на который повесить процедуру с запросом.

Далее -
Создаешь ТЗ,запрос
цикл:кусаешь от Выбпоиск от пробела до пробела в переменную(пока пробелы не кончатся), а потом делаешь запрос
В конце запроса выгружаешь его в ТЗ ( как-то делал чтобы он предыдущие значения не очищал - щас уже не помню)

Как цикл кончился сворачиваешь ТЗ, чтобы убрать дубли товаров

потом Тз.ВыбратьСтроку() - собственно форма выбора и то что из этого вернулось

ТекущийЭлемент() = Тз.ПолучитьЗначение (То что вернулось) чтобы спозиционироваться на выбранном товаре
 
K

kaa

Гость
#7
возьми для образца ТиС 77, там во всех формах списка есть поиск
 

vitfil

IT-интегратор
02.04.2004
2 062
0
44
Минск
#8
Кто мешает использовать 1С++, прямые запросы и LIKE из стандарта SQL?
 

vitfil

IT-интегратор
02.04.2004
2 062
0
44
Минск
#10
puh14, это надо смотреть в спецификации. в любом случае, группа состоит из отдельных значений.
 
P

perfomance

Гость
#11
Всем привет!!! Пощу первый раз. Решая задачу я быть может поступил бы так.
В Форме списка элементов справочника нарисовал реквизит типа "СТРОКА" в которую будем вбивать искомый набор символов в названиях элементов справочника. А рядом можно нарисовать Кнопку которая будет производить поиск.

Процедура ПроизвестиОтборПоСовпадению() //приписываем для кнопки
СписокЗначения = СоздатьОбъект("СписокЗначений"); //создаем список значений в который пойдет вся свалка
//необходимых элементов справочника т.е. те которые будут удовлетворять значениям поиска
Спр = СоздатьОбъект("Справочник.ОсновныеСредства");//создаем переменную на определенный справочник
//в котором и будет происходить поиск (поиск в наименованиях);
ИскомыйЭлемент = СокрЛП(ПолеПоиска); //обрезаем введенные символы от пробелов
Если ПустаяСтрока(ИскомыйЭлемент) = 1 Тогда//если ничего нет то просто играем кнопкой
СтатусВозврата(0);
Иначе
Если Спр.ВыбратьЭлементы(0) = 1 Тогда //открываем выборку по справочнику
Пока Спр.ПолучитьЭлемент() = 1 Цикл
НаименованиеСправочника = СокрЛП(Спр.Наименование); //получаем реквизит
//наименование
Если Найти(НаименованиеСправочника,ИскомыйЭлемент) > 0 Тогда
//производим поиск введеной строки в наименовании справочника
СписокЗначения.ДобавитьЗначение(Спр.ТекущийЭлемент());
Иначе
Продолжить;
КонецЕсли;
КонецЦикла;
ИспользоватьСписокЭлементов(СписокЗначения); //производим фильтрацию отображаемого
//списка
КонецЕсли;
КонецЕсли;
КонецПроцедуры

Но есть кое какие траблы:
-Поиск ведется с учетом регистра вводимых символов
-Если фильтрация произашла то элементы редактировать и заводить новые уже нельзя, придется расфильтровывать
 

puh14

Well-Known Member
11.07.2008
1 412
0
НеРезиновая
#12
ИскомыйЭлемент = СокрЛП(ПолеПоиска)
не катит - пробелы посередине и являются разделителями строк для поиска

Если Спр.ВыбратьЭлементы(0) = 1 Тогда //открываем выборку по справочнику
Пока Спр.ПолучитьЭлемент() = 1 Цикл
таким макаром 200 тыщ наименований номенклатуры при 10 работающих пользователях обходятся 10 минут.

ИспользоватьСписокЭлементов(СписокЗначения); //производим фильтрацию отображаемого
если родителей не внес в фильтруемый список - будет гора папочек с знаками вопроса. Там вообще большой геморой. Либо вывод без иерарии.

Поиск ведется с учетом регистра вводимых символов
лечится ВРЕГ()
 

vbs

Well-Known Member
18.02.2007
1 708
3
Санкт-Петербург
#13
а может быть, стОит завести в справочнике реквизит типа "ПолеПоиска" и делать в справочнике выбор по совпадению первых символов этого реквизита (но ! в нем всегда должно искаться по ПЕРВЫМ символам)
Тогда выбор по реквизиту сработает влет и создаст ТЗ или СЗ для выбора пользователем нужного. Я подобным образом искал по значению, скажем, "Иванов", однофамильцев, если необходимо было их
дополнительно определять. Если интересно, приложу кусочек кода
 
P

perfomance

Гость
#14
не катит - пробелы посередине и являются разделителями строк для поиска
А ну да - согласен. Здесь используется функция Найти (Строка1,Строка2) где Строка2 ищется в Строке1, а если в Строке2 окажутся "пробелы по середине" то функции этой безразлично - она будет искать и с пробелами.
В этом коде что я написал просто Строка2 и есть поле куда вбиваем искомое. А функция СокрЛП(Строка2) просто подровняет это поле от лишних пробелов, точто длина грубо говоря может быть больше чем искомое. Я щас пробовал найти элемент типа: "Принтер FX" - находит. Т.е. по точному совпадению. Но действительно если существует элемент например "Принтер матричный FX" - то уже кукишь. По запросу "Принтер FX" уже не найдешь. Если тока действительно оттяпывать каждое слово без пробелов и искать их отдельно и уже только после этого принимать решение загонять их в ТЗ (или СЗ) или нет.

таким макаром 200 тыщ наименований номенклатуры при 10 работающих пользователях обходятся 10 минут.
Пробовал на справочнике в котором всего около 150 элементов. При том справочник одноуровневый(без родителей).
ИМХО Быть может можно просто сокращать область поиска. В любом случае при таком количестве наименований они все разделены по группам/родителям. Поэтому можно перед тем как запускать поиск указать родителя хотя бы самого старшего.

если родителей не внес в фильтруемый список - будет гора папочек с знаками вопроса. Там вообще большой геморой. Либо вывод без иерарии.
В коде в фильтруемый список и пойдут родители, точто сам выбор элементов идет без учета иерархии. Надо буит попробовать

Ок.