"Глобальный" поиск (легкая замена полнотекстовому)

09.01.10

Задачи пользователя - Поиск данных

Есть такая штука в Axapta, как "Глобальный поиск"... Правда я ее увидел после того, как сделал первый вариант своего, но... потом пришлось дорабатывать по аксаптовский, уж больно он мне понравился :-)
Но покажу только первый вариант.

Скачать файлы

Наименование Файл Версия Размер
Обработка
.epf 5,76Kb
230
.epf 5,76Kb 230 Скачать бесплатно

Впервые проблема встала в форме журнала, когда надо найти документ по части номера. Сначала сделали самое простое - вынесли текстовую составляющую номера в отдельное индексированное поле и получили значительный прирост скорости поиска.

Потом появилась задача так же быстро искать и контрагентов по частям наименований. [ООО "Континент" - Континент, ООО - Континент и т.д.]. Но не будешь же кучу полей добавлять в справочнике для каждой части наименования!

Выход напрашивается сам собой - регистр сведений с двумя полями: законченное слово из наименования и ссылка на объект...

А дальше пара глобальных функций и процедур :-)

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

P.S. есть возможность искать по нескольким словам (условие И); есть возможность искать по части строки ("слов*", "*лов", "*ло*")

P.P.S. зачем все это если есть полнотекстовый? а попробуйте на уже живой базе в 100 гиг его поднять... да и с обновлением динамическим потом намучаетесь... :-)

P.P.P.S. в принципе все это можно перенести и на 7.7... и не на 1С тоже...

См. также

Быстрый поиск дублей с четким/нечетким поиском по любому сочетанию реквизитов/реквизитов таб. частей с отбором и быстрой заменой значений в ЛЮБЫХ базах 8.1-8.3 (УТ 10.3, БП 2, ЗУП 2.5, КА 1.1, УТ 11, БП 3, УНФ 1.6/3.0, КА 2, ЗУП 3 и т.д.)

Поиск данных Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Обработки помогут Вам легко и, главное, быстро (в 5 раз и быстрее штатной обработки 1С), выполнить поиск дублирующих данных в Ваших базах 1С на платформах 8.1-8.3. Это позволит уменьшить объем лишней информации в справочниках и документах, планах видов характеристик и др., упростит работу с данными пользователям. А так же можно, одним нажатием, узнать в каких ссылочных объектах есть вообще дубли! Понятное расположение команд и настроек, в сочетании с описанием и справкой, еще упростят процесс. А так же обновления Вы получаете бесплатно в течение года с момента приобретения данных обработок! (Обновление от 27.11.2023, версия 6.12)

9600 руб.

14.05.2012    155289    326    252    

558

Журнал изменений с восстановлением состояния ссылочных объектов и архивацией по HTTP / COM (расширение + конфигурация, 8.3.14+, ЛЮБАЯ конфигурация)

Архивирование (backup) Журнал регистрации Поиск данных Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 1С:Управление торговлей 11 Платные (руб)

База данных «сама» меняет данные в документах/справочниках? Тогда данный журнал изменений для Вас! Практически не влияет на скорость записи объектов за счет быстрого алгоритма! Скорость работы почти в 2 раза выше типового механизма "История изменений"! Позволяет следить за изменениями и удалением в любых ссылочных объектах конфигурации, с возможностью архивации по HTTP(!) или COM, и сверткой данных. А так же, может восстановить состояние реквизитов (значения) до момента изменения или удаления объекта из базы. Есть ДЕМО-база где можно самостоятельно протестировать часть функционала! Работает на любых платформах выше 8.3.14+ и любых конфигурациях! Версия 3.1 от 24.08.2023!

19200 руб.

15.05.2017    42521    10    24    

38

Кто такая Мантикора?

Поиск данных Платформа 1С v8.3 Россия Абонемент ($m)

Статья об опыте развертывания и интеграции с базой данных Manticore Search для быстрого полнотекстового поиска.

1 стартмани

30.11.2023    3058    andreysidor4uk    16    

45

PowerOffice

Поиск данных Корректировка данных Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

PowerOffice - обработка для поиска, просмотра и обработки данных для пользователей. Доступ к объектам на просмотр и редактирование данных определяется правами пользователя.

1 стартмани

05.06.2023    1922    23    PowerBoy    1    

15

Получение ссылки по бинарной строке PostgreSQL или MSSQL

Поиск данных Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Получение ссылки в 1С по бинарной строке из PostgreSQL в виде строки формата bytea или из MSSQL в виде шестнадцатиричной строки. Кроме ссылочных объектов ссылки могут быть получены и для перечислений. Это может быть полезно при анализе логов журнала регистрации или СУБД.

1 стартмани

04.04.2023    2580    2    berserg    2    

12

Поиск документов с ошибками проведения, универсальный

Поиск данных Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Обработка позволяет найти проведенные документы без движений и, наоборот, НЕ проведенные документы с движениями. Подходит для любой конфигурации.

1 стартмани

18.08.2022    2986    21    KVIKS    3    

10

Поиск и замена значений + Поиск дублирующихся элементов справочников с подключением к внешней базе

Поиск данных Корректировка данных Платформа 1С v8.3 Управляемые формы Платформа 1C v8.2 Конфигурации 1cv8 Платные (руб)

Обработка предназначена для гибкого поиска и дальнейшей замены дублей справочников, документов, а также планов видов расчетов и планов видов характеристик. В обработку включена возможность проверки наличия ссылки во внешней базе (по УИДу), поиска дублей с предварительным отбором, а также произвольной обработки реквизитов перед поиском (например, возможно удалить определенные символы из наименования).

3600 руб.

30.03.2022    8586    3    0    

5
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. JohnyDeath 301 09.01.10 12:44 Сейчас в теме
А вот так:
SELECT *
FROM НужнаяТаблица
WHERE НужнаяТаблица.НужноеПоле LIKE '%ПодстрокаПоиска%'

Не лучше будет? Можно искать по любому реквизиту любой таблицы.

А в твоем варианте, если завтра бухи захотят поиск по ИНН, ты быдешь в регистр и это поле заносить? И так для каждого чиха?
2. dolter 119 09.01.10 12:50 Сейчас в теме
(1) Так и было в начале... во всех формах... но на 2 млн расходных документов в год и 0,5 млн контрагентов вешалась база намертво - никто работать не мог по человечески.
А во втором решении (скорее всего буду выкладывать как платное) добавление ИНН происходит установкой одной "галки" - и можно искать одновременно и по части наименования и по ИНН.
А то, что написали вы... попробуйте найти просто "СТО" без всяких "столица", "столичный", "астория" и пр. И самое главное - ускорение поиска в десятки раз по сравнению с вашим вариантом, т.к. поиск производится по индексу (не в случае поиска типа "*ло*" :-))...
3. CheBurator 3119 09.01.10 13:09 Сейчас в теме
такс... побежал за попкорном и колой
4. Saint 09.01.10 16:42 Сейчас в теме
А что, отборы уже отменили? Я что-то пока не улавливаю, чем принципиально лучше предложенное решение по сравнению с отборами.
5. dolter 119 09.01.10 17:12 Сейчас в теме
(4) Какие отборы? О чем речь?
Если о графах отбора, то это совершенно другое решение.
Прежде чем пользоваться отбором по графе, нужно найти сам элемент (наверное :-)).
6. Saint 09.01.10 17:40 Сейчас в теме
(5) Универсальный объект "Отбор". Отбор используется для установки и хранения условий фильтрации элементов в списках и наборах записей. Отбор элементов в списках помогает, если необходимо выбрать элементы по определенному критерию из большого списка элементов.

Это из синтакс-помошника.
7. dolter 119 09.01.10 17:52 Сейчас в теме
(6) и как он поможет мне в данной ситуации?
попробуй установить отбор по наименованию по содержит и слова не в том порядке, как они записаны в наименовании, а еще одно слово полностью, а второе с любым окончанием...
8. Valet 56 09.01.10 18:09 Сейчас в теме
(7)Что мешает добавить индекс реквизиту? И будет поиск по реквизиту с использованием индекса.
А выносить поля в регистр сведений, лишь из-за того чтобы не делать индекс по ним в реальном справочнике/документе, как то странно.

Отбор в форме списка не установишь, но ничего не мешает запрос с ПОДОБНО и со своей строкой поиска по любому реквизиту.
9. dolter 119 09.01.10 18:16 Сейчас в теме
ох-хо-хоюшки... да что за молодежь пошла такая непонятливая-то...
ладно, будет желание - потестите на скорости и нагрузки (да и на различных вариаций в возможностях поиска), а нет... так на нет и суда нет :-)
(8) при поиске по like не испольузется индекс
12. JohnyDeath 301 10.01.10 21:00 Сейчас в теме
(9)
при поиске по like не испольузется индекс

а в твоем случае поиск по '*со*' будет попадать в индекс?

А если известно начало слова, то можно построить поиск по >= и <= (или BETWEEN). Смысла выводить значения в отдельный регистр не вижу.
13. dolter 119 11.01.10 08:58 Сейчас в теме
(12) в (2) я об этом говорил (про индекс)...
не понял насчет ">= и <= (или BETWEEN") - можно пример?
14. artbear 1448 11.01.10 09:58 Сейчас в теме
(13) Регистр как и когда заполняется?
16. dolter 119 11.01.10 12:17 Сейчас в теме
(14) у меня по событию ПриЗаписи (начальное заполнение, ессесно, обработкой)
(15) о! спасибо! для поиска по началу так и сделаю (такой идеи пока не было) :-)
17. JohnyDeath 301 11.01.10 12:25 Сейчас в теме
(16) ну так зачем регистр, если можно обойтись и без него?
18. dolter 119 11.01.10 13:17 Сейчас в теме
(17) не дописал: "для поиска по началу так и сделаю" + " в регистре" :-)
потому что... я хочу (МОГУ) искать по первым символам любого слова в строке и (или) по различным сочетаниям этих слов (с учетом того, что все они ИМЕННО в регистре проиндексированы)
15. JohnyDeath 301 11.01.10 10:44 Сейчас в теме
(13) Например, надо найти всех контрагентов, которые начинаются с 'ма'.
select descr
from Справочник_Контрагенты
where descr between 'ма' and 'маЯ'

Попали в индекс "UPPER(DESCR)"

П.С. Пишу для 7.7 под 1sqlite. На другом, к сожалению проверить не могу.
П.С.2. Если уж совсем придираться, то левую часть условия лучше всего добивать буквой "Я" до полной длины. Т.е. если длина наименования = 20, то запрос выглядит так:
select descr
from Справочник_Контрагенты
where descr between 'ма' and 'маЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯ'
10. Saint 09.01.10 20:54 Сейчас в теме
(7) Не знаю, как он поможет тебе, просто я в своей практике не встречал у пользователей необходимости в таких сложных поисковых запросах. Может пользователи не самые продвинутые, но тем не менее.
(9) Ну да, куда уж нам до седобородых старцев, умудрённых опытом. :D Может твоё решение найдёт применение в определённых ситуациях, но в целом нет необходимости выдумывать новые сущности. Естественно это только моё личное мнение. :idea:
11. MRAK 723 10.01.10 11:08 Сейчас в теме
(10) ну все зависит от специфики и методологии работы конкретной конторы. Думаю, иногда сабж имеет смысл.
19. JohnyDeath 301 11.01.10 13:56 Сейчас в теме
Всё равно так и не понял, в чём смысл дублировать данные в отдельном регистре...
20. dolter 119 11.01.10 14:41 Сейчас в теме
(19) ок...
напиши как найти с использованием индекса (т.е. _быстро_) контрагента с наименованием
"ООО Континент-СТО" 

по строке
"СТО Континент"

без использования отдельного регистра...
21. JohnyDeath 301 11.01.10 14:53 Сейчас в теме
(20) да, тогда никак.
А у тебя получается, что ты в ПриЗаписи разбиваешь наименования на слова и заносишь отдельными строками в регистр?

И еще вопрос. Твой регистр состоит из 2-х колонок: "Наименование" и "Объект". Теперь бухи хотят иметь быстрый поиск не только по справочнику контрагентов, но и по справочнику сотрудников. Делаем поиск по "Мажор" в итоге выпадает "ООО Мажор" из контрагентов и "Мажоров Иван Иваныч" из сотрудников?
22. dolter 119 11.01.10 15:35 Сейчас в теме
(21) в том варианте, что я выложил, для каждого объекта необходим отдельный регистр.
в варианте платном (ели выложу) общий регистр с дополнительным полем "вид объекта" - т.е. можно указывать область поиска (см.картинки)
Прикрепленные файлы:
23. ander_ 13.01.10 13:12 Сейчас в теме
как вариант (реально работающий на 1с7.7 SQL + 1с++) на интересующий справочник/документ вешается тригер, который собирает участвующие в поиске поля в одну строку (по определенным правилам) и по ней заполняет дополнительную табличку, по которой в дальнейшем и будет идти поиск. Н.р.:
из реквизитов "ЧП Иванов" + "22-33-44" + "г.Урюпинск" получим строку
"ЧП Иванов 223344 г.Урюпинск" заполним таблицу
ид стр
' 56 ' ЧП Иванов 223344 г.Урюпинск
' 56 ' П Иванов 223344 г.Урюпинск
' 56 ' Иванов 223344 г.Урюпинск
' 56 ' Иванов 223344 г.Урюпинск
' 56 ' ванов 223344 г.Урюпинск
' 56 ' анов 223344 г.Урюпинск
' 56 ' нов 223344 г.Урюпинск
' 56 ' ов 223344 г.Урюпинск
' 56 ' в 223344 г.Урюпинск
' 56 ' 223344 г.Урюпинск
' 56 ' 223344 г.Урюпинск
' 56 ' 23344 г.Урюпинск
' 56 ' 3344 г.Урюпинск
' 56 ' 344 г.Урюпинск
' 56 ' 44 г.Урюпинск
' 56 ' 4 г.Урюпинск
' 56 ' г.Урюпинск
' 56 ' г.Урюпинск
и т.д.

потом когда пользователь вводит строку для поиска, считаем что пробел это "И", запятая "ИЛИ" и строим соответствующий запрос с использованием LIKE str+'%' (попадаем в индекс)

избыточность конечно большая, но быстродействие пока радует.
ЗЫ: Здесь вариант немного упрощенный привел.
24. dolter 119 13.01.10 14:13 Сейчас в теме
25. V.Nikonov 120 13.01.10 14:44 Сейчас в теме
Я поступил проще. Самый распространённый Поиск/Отбор это по фрагменту номера документа и по Контрагенту. Для этих двух реквизитов созданы 2 дополнительных поля фильтрации, отрабатываются процедуры изменения поля Доп.Фильтра как исправление Фильтра журнала в 1С8.хх.

С номером совсем просто, можно установить отбор с критерием отбора "Содержит".

Отбор по контрагенту у нас используется через задание ссылки, но при желании можно и отрабатывать по Списку значений.
26. dolter 119 13.01.10 15:07 Сейчас в теме
27. V.Nikonov 120 13.01.10 19:11 Сейчас в теме
Фрагмент кода обрабатывающий изменение Фильтра Номера:
//НВЮ/ Поиск заказа по части Номера
// Элемент - текстовое поле для отбора по фрагменту номера
Процедура ИскомыйНомерПриИзменении(Элемент)
    Если ЗначениеЗаполнено(Элемент.Значение) Тогда
        ЭтаФорма.Отбор.Номер.ВидСравнения = ВидСравнения.Содержит;
        ЭтаФорма.Отбор.Номер.Значение = Элемент.Значение;
        ЭтаФорма.Отбор.Номер.Использование = Истина;
        ЭтаФорма.Обновить();
    Иначе
        ЭтаФорма.Отбор.Номер.Значение = "";
        ЭтаФорма.Отбор.Номер.Использование = Ложь;
        ЭтаФорма.Обновить();
    КонецЕсли;
КонецПроцедуры
Показать
28. dolter 119 14.01.10 08:56 Сейчас в теме
29. yoyoman 06.04.12 12:00 Сейчас в теме
Я делал как то так:
сч=1;
ТекстЦикл="";
Для каждого ЭлементСписка из СписокСлов цикл
	ТекстЦикл=ТекстЦикл + "
	|	И Номенклатура.Наименование ПОДОБНО &Наименование"+сч;
	сч=сч+1;
КонецЦикла;

Запрос = Новый Запрос;
Запрос.Текст="ВЫБРАТЬ
|	Номенклатура.Наименование КАК Наименование,
|	Номенклатура.Ссылка КАК Ссылка
|ИЗ
|	Справочник.Номенклатура КАК Номенклатура
|ГДЕ
|	Номенклатура.ЭтоГруппа = ЛОЖЬ"
+ТекстЦикл+"								
|
|УПОРЯДОЧИТЬ ПО
|	Наименование";
сч=1;								 
Для каждого ЭлементСписка из СписокСлов цикл
	Запрос.УстановитьПараметр("Наименование"+сч,"%"+ЭлементСписка+"%");
	сч=сч+1;
КонецЦикла;
Показать

СписокСлов это массив, который собирался разбиванием строкового поля ввода пробелами
30. yoyoman 06.04.12 12:10 Сейчас в теме
Такм образом "ООО Континент-СТО" достаточно легко находится через "СТО Континент"
31. dolter 119 06.04.12 13:22 Сейчас в теме
(30) yoyoman,
согласен - просто и работоспособно, но(!) скорость обработки такого запроса на больших объемах просто запредельная :(
да и под каждое текстовое поле придется писать свой запрос, т.е. ненастраиваемо
32. Kosmovski 9 05.02.13 19:18 Сейчас в теме
StrMatch.dll - посмотри неплохая dll-ка для нечеткого поиска
Оставьте свое сообщение