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

Тема в разделе "1C и всё что с ней связано", создана пользователем buralimon, 2 июн 2009.

  1. buralimon

    buralimon Гость

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

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    куда появится? Выгрузится в ТЗ для позиционирования(для одного значения), отобраться в форме списка по имени (для нескольких), вывести список товаров или как?

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

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

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

    KiR НЕ шибка опытный програмер)
    1C Team

    Регистрация:
    11 сен 2007
    Сообщения:
    1.581
    Симпатии:
    0
    вообще-то в любом справочнике вверху есть поле поиск с кнопочками вперед и назад - что мешает туда вбить слово труба или 150 и искать так?
     
  4. buralimon

    buralimon Гость

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

    KiR НЕ шибка опытный програмер)
    1C Team

    Регистрация:
    11 сен 2007
    Сообщения:
    1.581
    Симпатии:
    0
     
  6. puh14

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    Ну ТЗ это не совсем форма списка - это ТЗ. В форме подобного можно добится через УстановитьОтбор() - но там тебя ждет большой геморой с иерархией и группами. ТЗ проще.

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

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

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

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

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

    kaa Гость

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

    vitfil IT-интегратор

    Регистрация:
    2 апр 2004
    Сообщения:
    2.070
    Симпатии:
    0
    Кто мешает использовать 1С++, прямые запросы и LIKE из стандарта SQL?
     
  9. puh14

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    а like позволяет задать поиск по группе значений?
     
  10. vitfil

    vitfil IT-интегратор

    Регистрация:
    2 апр 2004
    Сообщения:
    2.070
    Симпатии:
    0
    puh14, это надо смотреть в спецификации. в любом случае, группа состоит из отдельных значений.
     
  11. perfomance

    perfomance Гость

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

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

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

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    не катит - пробелы посередине и являются разделителями строк для поиска

    таким макаром 200 тыщ наименований номенклатуры при 10 работающих пользователях обходятся 10 минут.

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

    лечится ВРЕГ()
     
  13. vbs

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    а может быть, стОит завести в справочнике реквизит типа "ПолеПоиска" и делать в справочнике выбор по совпадению первых символов этого реквизита (но ! в нем всегда должно искаться по ПЕРВЫМ символам)
    Тогда выбор по реквизиту сработает влет и создаст ТЗ или СЗ для выбора пользователем нужного. Я подобным образом искал по значению, скажем, "Иванов", однофамильцев, если необходимо было их
    дополнительно определять. Если интересно, приложу кусочек кода
     
  14. perfomance

    perfomance Гость

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

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

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

    Ок.
     
Загрузка...

Поделиться этой страницей