gifts2017

Поиск данных справочников по вхождению всех слов

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

Очень многие сотрудники, пришедшие на работу в новую компанию, сталкиваются с проблемой незнания товарного ассортимента. При этом проблема возникает именно в том, что нет четкого алгоритма заведения, по которому потом возможен стандартный поиск. Ниже описано, как это можно решить простым способом.

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

Каким образом это можно реализовать? Да очень просто. Давайте по порядку.

1) Разбиваем нужную нам строку на массив слов, используя как разделитель символ пробела

2) Первым делом выбираем все элементы справочника без каких либо условий

3) Проходимся циклом по Массиву слов и делаем запрос к справочнику, но уже с условиемм ПОДОБНО "%НАШЕСЛОВО%"

4) Результат запроса выгружаем в массив значение и этот массив подставляем параметром в следующий шаг цикла

 

Т.е. по сути мы постоянно получаем результат, и из этого результата дальше ищем по второму и третьему и т.д слову.

Алгорит по безобразия прост в разработке и использовании. Можете использовать готовый кусок кода, скачав обработку, в которой можно искать по любому типу справочника.

 

Всем спасибо за внимание.

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

Наименование Файл Версия Размер Кол. Скачив.
Поиск
.epf 7,39Kb
03.11.14
15
.epf 1.0 7,39Kb 15 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. BigB (BigB) 04.11.14 19:04
Полнотекстовый поиск Вам в помощь!
KasperRWF; HiKS; ojiojiowka; +3 Ответить 1
2. Igor (Justindj) 04.11.14 20:17
(1) BigB, Разницу понимаешь между использованием полнотекстового поиска и моей идеей? Включение в режиме конфигуратора использование индексов и увеличение размера базы из за этого, постоянно обновлять индекс. Мою идею можно развить и искать по любому реквизиту в любом справочнике или документе и обрабатывать результат в удобной для пользователя форме. Сам смысл быстро подобрать товар или контрагента по набору слов и дальше его использовать для подстановки в документы или еще кудато...
3. Вячеслав Фесенко (DO_WHILE_LOOP) 06.11.14 16:14
Соглашусь с Justindj полнотекстовый поиск не всегда подходит, но предложенный алгоритм не оптимальный, я бы его оптимизировал например так:
Функция ПолучитьСписокВыбора(Текст, ВидСправочника)
	
	// Создаем список, который каждый раз будет заменятся новыми значениями
	СписокВыбора = Новый СписокЗначений;
	
	Если ЗначениеЗаполнено(Текст) Тогда 
		
		// Создадим текст условия поиска
		УсловиеПоиска = "";
		ТекстТемп = СтрЗаменить(Текст, " ", Символы.ПС);
		Для Счетчик = 1 По СтрЧислоСтрок(ТекстТемп) Цикл 
			УсловиеПоиска = УсловиеПоиска + "И Справочник.Наименование ПОДОБНО ""%" + СтрПолучитьСтроку(ТекстТемп, Счетчик) + "%""" + Символы.ПС;
		КонецЦикла;
		
		
		// А вот и сам алгоритм
		Запрос = Новый Запрос;
		Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 25
		|	Справочник.Ссылка КАК Значение
		|ИЗ
		|	Справочник." + ВидСправочника + " КАК Справочник
		|ГДЕ
		|	Справочник.ЭтоГруппа = ЛОЖЬ
		|	" + УсловиеПоиска + "
		|
		|УПОРЯДОЧИТЬ ПО
		|	Справочник.Наименование";
		
		СписокВыбора.ЗагрузитьЗначения(Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Значение"));
		
	КонецЕсли;
	
	Возврат СписокВыбора;
	
КонецФункции

...Показать Скрыть
4. Алексей Перелыгин (pereligins) 24.03.15 18:21
Исходный пример и пример в комментарии работают очень медленно, особенно на больших справочниках.
Рекомендую делать одним запросом, работает даже быстрее, причем еще и сортирует результат по наименованию:

Функция  ПолучитьСписокВыбора(Текст,ВидСправочника)
	
	// Разложили на массив нашу строку
	СписокСлов = РазложитьСтрокуВМассивПодстрок(Текст," ");
	
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ  " + ?(СписокСлов.Количество() = 1,"ПЕРВЫЕ 50","") +"
	               |	Справочник.Ссылка КАК Значение
	               |" + ?(СписокСлов.Количество() > 1,"ПОМЕСТИТЬ вт1","") +"
	               |ИЗ
	               |	Справочник.Номенклатура КАК Справочник
	               |ГДЕ
	               |	Справочник.Наименование ПОДОБНО &Текст
	               |	И Справочник.ЭтоГруппа = ЛОЖЬ
				   |" + ?(СписокСлов.Количество() = 1,"УПОРЯДОЧИТЬ ПО Справочник.Наименование","") +"
	               |;
	               |";
				   
	Запрос.УстановитьПараметр("Текст", "%"+СписокСлов[0]+"%");
	СписокСлов.Удалить(0);
				   
	сч = 1;
	Для Каждого Слово Из СписокСлов Цикл
		
		Запрос.Текст = Запрос.Текст + "ВЫБРАТЬ " + ?(сч = СписокСлов.Количество(),"ПЕРВЫЕ 50", "") +"
	               |	вт" + сч + ".Значение КАК Значение
	               |" + ?(сч < СписокСлов.Количество(),"ПОМЕСТИТЬ вт" + (сч+1), "") +"
	               |ИЗ
	               |	вт" + сч + " КАК вт" + сч + "
				   |ГДЕ
				   |	вт" + сч + ".Значение.Наименование ПОДОБНО &Текст" + сч + "
				   | " + ?(сч = СписокСлов.Количество(),"УПОРЯДОЧИТЬ ПО вт" + сч + ".Значение.Наименование", "") +";
				   |";
				   
		Запрос.УстановитьПараметр("Текст" + сч, "%"+Слово+"%");
		
		сч = сч + 1;
	КонецЦикла;
	
	РезультатЗапроса = Запрос.Выполнить();
	
	СписокВыбора = Новый СписокЗначений;
	СписокВыбора.ЗагрузитьЗначения(РезультатЗапроса.Выгрузить().ВыгрузитьКолонку("Значение"));
	
	Возврат СписокВыбора;
	
КонецФункции
...Показать Скрыть
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа