gifts2017

Поиск номенклатуры по частям слов

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

Поиск любых справочников по частям слов наименования

Поиск любых справочников по частям слов наименования, при этом не важно, в каком порядке вводить части слов наименования.
Например при строке поиска "ламп 40 вт" результат будет тем же, что и при поиске по строке "вт ламп 40".
Поиск происходит очень быстро, при номенклатуре в 40 000 позиций, время работы около 1,5 - 2 сек.

Подключение к конфигурации производится путем объединения конфигураций.
В прилагаемом файле находится база данных с небольшим количеством номенклатуры для примера.
Конфигурация базы данных содержит только необходимые объекты метаданных:

1. Общий модуль с небходимыми процедурами
2. Подписка на событие "ПриЗаписи" объекта "СправочникОбъект.Номенклатура". Если необходимо выполнять поиск
    в другом справочнике, то его тип нужно добавить в список типов источника подписки.
3. Регистр сведений "_БазаСлов" хранит "огрызки" слов, составляющих наименования элементов справочника
4. Обработка "_ПереиндексацияБазыСлов" служит для первоначального заполнения регистра сведений "_БазаСлов", а 
    так же для его очистки в случае необходимости.
5. Обработка "_БыстрыйПоискЭлементовСправочника" служит для ввода поисковой строки и вызывается из формы списка
    справочника. Я в своем примере на форму списка номенклатуры добавил две кнопки "Поиск" и "ПоискОчистка", назначил
    им сочетания клавиш "F7" и "Ctrl+F7"

Не используются внешние компоненты.

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

Наименование Файл Версия Размер
Поиск номенклатуры.dt 3
.dt 2,04Mb
29.01.14
3
.dt 2,04Mb Скачать

См. также

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

Комментарии

1. Ийон Тихий (cool.vlad4) 30.01.14 01:27
3. Регистр сведений "_БазаСлов" хранит "огрызки" слов, составляющих наименования элементов справочника
4. Обработка "_ПереиндексацияБазыСлов" служит для первоначального заполнения регистра сведений "_БазаСлов", а
так же для его очистки в случае необходимости.

А зачем? когда данная задача решается просто разбиением строки и формированием запроса через ПОДОБНО? и по скорости уж точно не медленнее, чем
Поиск происходит очень быстро, при номенклатуре в 40 000 позиций, время работы около 1,5 - 2 сек.
2. Дмитрий Бухалов (Re:аниматор) 30.01.14 09:26
Подскажу вам хитрость как это легко доработать в процедуре поиске стандартных конфигураций.

На примере обработки "Подбор номенклатуры" УТ 10.3

Процедура ВыполнитьПоиск()
...

		// заменим спецсимволы
		ШаблонПоиска = СтрЗаменить(ШаблонПоиска, "~", "~~");
		ШаблонПоиска = СтрЗаменить(ШаблонПоиска, "%", "~%");
		ШаблонПоиска = СтрЗаменить(ШаблонПоиска, "_", "~_");
		ШаблонПоиска = СтрЗаменить(ШаблонПоиска, "[", "~[");
		ШаблонПоиска = СтрЗаменить(ШаблонПоиска, "-", "~-");
		ШаблонПоиска = "%" + ШаблонПоиска + "%";

		Запрос = Новый Запрос;
		Запрос.УстановитьПараметр("ШаблонПоиска", ШаблонПоиска);

...

...Показать Скрыть


Заменяем на

		// заменим спецсимволы
		ШаблонПоиска = СтрЗаменить(ШаблонПоиска, "~", "~~");
		ШаблонПоиска = СтрЗаменить(ШаблонПоиска, "%", "~%");
		ШаблонПоиска = СтрЗаменить(ШаблонПоиска, "_", "~_");
		ШаблонПоиска = СтрЗаменить(ШаблонПоиска, "[", "~[");
		ШаблонПоиска = СтрЗаменить(ШаблонПоиска, "-", "~-");
		
		ШаблонПоиска = СокрЛП(ШаблонПоиска);

		ТекстИ = "
		|	И ";
		ТекстУсловияОтбораПоШаблону = "";
		СписокПодШаблонов = Новый СписокЗначений;
		ЕстьПробелы = Найти(ШаблонПоиска, " ") > 0;
		н = 0;
		Пока ЕстьПробелы Цикл
			ПозицияПробела = Найти(ШаблонПоиска, " ");
			ПодШаблон = Лев(ШаблонПоиска, ПозицияПробела - 1);
			ПодШаблон = "%" + ПодШаблон + "%";
			СписокПодШаблонов.Добавить(ПодШаблон);
			ШаблонПоиска = СокрЛП(Прав(ШаблонПоиска, СтрДлина(ШаблонПоиска) - ПозицияПробела));
			ЕстьПробелы = Найти(ШаблонПоиска, " ") > 0;
			ТекстУсловияОтбораПоШаблону = ТекстУсловияОтбораПоШаблону +
			?(ТекстУсловияОтбораПоШаблону = "", "", ТекстИ) + "	Номенклатура." + ЭлементыФормы.СписокВидовПоиска.Значение + " ПОДОБНО &ШаблонПоиска" + н + " СПЕЦСИМВОЛ ""~""";
			н = н + 1;
		КонецЦикла;
		
		ШаблонПоиска = "%" + ШаблонПоиска + "%";

		СписокПодШаблонов.Добавить(ШаблонПоиска);
		ТекстУсловияОтбораПоШаблону = ТекстУсловияОтбораПоШаблону +
		?(ТекстУсловияОтбораПоШаблону = "", "", ТекстИ) + "	Номенклатура." + ЭлементыФормы.СписокВидовПоиска.Значение + " ПОДОБНО &ШаблонПоиска" + н + " СПЕЦСИМВОЛ ""~""";
		
		Запрос = Новый Запрос;
		Запрос.УстановитьПараметр("ШаблонПоиска", ШаблонПоиска);

...Показать Скрыть


P.S. не нужно хранить "огрызки" слов. Время работы около 0,5 - 1 сек.
3. Виталий Васильев (orfos) 17.07.15 12:56
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа