gifts2017

Быстрый поиск в справочниках по наименованию, с использованием svcsvc.dll

Опубликовал Роман Уничкин (unichkin) в раздел Администрирование - Поиск данных

По аналогии с http://infostart.ru/public/14286/, недавно узнал что в svcsvc.dll несколько обновился функционал, в частности был добавлен метод AddString().
В прилагаемом коде показан запрос, реализованный методами ВК 1SQlite, т.е. только для DBF.
Это только пример. Т.е. если например у справочника отсутствует поле "Наименование", то скорее всего будет ошибка.
Тем не менее критика приветствуется)))
Необходимые ВК: 1SQlite, FORMEX, svcsvc.dll (отсюда: http://www.1cpp.ru/forum/YaBB.pl?num=1373266553).

p.s.
Спасибо огромное уважаемому ADirks за все эти прекрасные плюшки, и помощь в их освоении)))
//Все вставляем в глобальный модуль
//======================================================================
Функция гв_ПоискЭлементаСправочникаВСписке_svc(ВидСправочника, Владелец = "", Элем = "") Экспорт
    

    //Эту процедуру удобно использовать и в дальнейшем, например для отчетов        
    База = СоздатьОбъект("SQLiteBase");

    База.Открыть(":memory:");
    Запрос = База.НовыйЗапрос();
    ТекстЗапроса = "
    |SELECT
    |    спр.DESCR||'|'||спр.CODE as [Поиск],
    |    спр.ID as [Ид :Справочник."
+ ВидСправочника +"]
    |FROM
    |    [Справочник."
+ ВидСправочника +"] as спр
    |WHERE
    |    1=1
    |ORDER BY спр.DESCR
    |"
;


    Условие = "
    |    спр.ISMARK <> '*'
    |"
;

    
    Если Метаданные.Справочник(ВидСправочника).КоличествоУровней > 1 Тогда
        Условие = Условие + "
        |    AND
        |    спр.ISFOLDER = 2
        |"
;

    КонецЕсли;
    
    Если ПустоеЗначение(Владелец) = 0 Тогда
        Условие = Условие + "
        |    AND
        |    спр.PARENTEXT = :Владелец
        |"
;

        Запрос.Подставлять("Владелец", Владелец);
    КонецЕсли;
    
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "1=1", Условие);
    
    тз = Запрос.ВыполнитьЗапрос(ТекстЗапроса);    

    свц = CreateObject("svcsvc.Service");

    тз.выбратьСТроки();
    Пока тз.ПолучитьСтроку() = 1 Цикл
        свц.AddString(тз.Поиск);

    КонецЦикла;

    рез = свц.FilterValue("", 1, "");

    свц = "";
    Если ПустаяСтрока(рез) = 0 Тогда
        нс = 0;

        тз.НайтиЗначение(рез, нс, "Поиск");
        Элем = тз.ПолучитьЗначение (нс, "Ид");
        Возврат 1;
    Иначе
        Возврат 0;

    КонецЕсли;
    
            
КонецФункции // гв_ПоискЭлементаСправочникаВСписке_svc        
//======================================================================
Процедура ПриНажатииКнопкиКлавиатуры(Конт, КодКлавиши, Альт, Шифт, Контрол, Символ, ФСО)

    Если Альт = 1 Тогда
        Если КодКлавиши = 116 Тогда // ALT-F5
        ФСО = 0;

        РасширениеФормы = СоздатьОбъект("РасширениеФормы");
        Попытка
            РасширениеФормы.УстановитьФорму(КонтФормы.Форма);

            ПолныйТипОбъекта = РасширениеФормы.ПолныйТипОбъекта();
            Если Найти(ПолныйТипОбъекта, "ФормаСписка") > 0 Тогда
                Владелец = "";

                Если Метаданные.Справочник(КонтФормы.Вид()).Владелец.Выбран() = 1 Тогда
                    Владелец = КонтФормы.Владелец;

                КонецЕсли;
                ДлинаНаименования = Метаданные.Справочник(КонтФормы.Вид()).ДлинаНаименования;
                ДлинаКода = Метаданные.Справочник(КонтФормы.Вид()).ДлинаКода;
                
                Если (ДлинаНаименования > 0) и (ДлинаКода > 0) Тогда
                    Элем = "";

                    Если гв_ПоискЭлементаСправочникаВСписке_svc(КонтФормы.Вид(), Владелец, Элем) = 1 Тогда
                        КонтФормы.АктивизироватьОбъект(Элем);

                        Попытка
                            КонтФормы.Активизировать("Наименование", 0);    

                        Исключение
                        КонецПопытки;

                    КонецЕсли;    
                Иначе
                    Сообщить("В справочнике вида """+ КонтФормы.Вид() +""" быстрый поиск невозможен.");

                КонецЕсли;
            КонецЕсли;
        Исключение
        КонецПопытки;

            
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры
 

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Епрст (Ёпрст) 16.07.13 14:04
пихать весь справочник в тз и потом скармливать компоненте не есть гуд.
2. Епрст (Ёпрст) 16.07.13 14:04
3. zhuravlik (unichkin) 16.07.13 14:20
На небольших справочниках работает неплохо. У меня самый большой - номенклатура - 4 тыс. элементов, время на формирование подбора ~0.3 сек.
В тз ищу одну строчку, заведомо уникальную. Но если результат запроса перед формированием списка загружать в ИТЗ, или список значений, мне кажется тормозить будет больше, нет?
4. selesta (selesta) 27.07.13 22:45
на скл можно передалть запрос? должно работать?
у меня пару справочников свыше 500 тыс. элементов (скл база) - есть шансы на нормальную работу?
или даже не пробовать?
5. zhuravlik (unichkin) 28.07.13 18:28
Текст запроса написан для sqlite, на SQL не работал, скорее всего нужно будет переписать.
Свыше 500 тыс. - нет, даже не пробуйте.
Лучше переписать поиск из типовой, и передавать в запрос часть наименования СРАЗУ, чтобы отсеивать по LIKE.
Посмотрите пример отсюда: http://www.1cpp.ru/forum/YaBB.pl?num=1373266553
6. Lena Lesnik (lelusha) 06.02.14 22:22
работает и под dbf и под скульную версию базы?
7. zhuravlik (unichkin) 07.02.14 00:04
(6) lelusha, Ток dbf, читай шапку "В прилагаемом коде показан запрос, реализованный методами ВК 1SQlite, т.е. только для DBF." Но никто не запрещает перегнать под скуль, только надо учитывать, что это для небольших справочников, пост №3: "4 тыс. элементов, время на формирование подбора ~0.3 сек". Если больше - то читаем пост №5 и идем на http://www.1cpp.ru/forum/YaBB.pl?num=1373266553.
Вот так =)