+7 495 955-25-82+7 499 990-10-21

Поиск по наименованию апгрейт

Поиск по наименованию апгрейт

Сообщение kuman » 30 апр 2017, 23:17

Нашел в просторах интернета интересный поиск по наименованию по вхождению в слово и немного его переделал под себя. Не нужно при поиске номенклатуры переключаться между раскладками РУС и ENG, а набирать все на русском. Так например

Угол 63*90° FV-plast набирать уго 63 ав,
Трубка нерж. гофрир. вода 0,4 ВВ Sandi-Flex набирать труб 0,4 ыфтвш

Предлагаю включить этот функционал в ДК.

Перем ТаблицаРезультата;

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

//Делаем выбор из выпадающего списка с клавиатуры (стрелки вверх, вниз и enter)
Процедура СтрокаПоискаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
текИндексСпискаВыбора = Элемент.СписокВыбора.Индекс(Элемент.СписокВыбора.НайтиПоЗначению(ВыбранноеЗначение));
ЭлементыФормы.СтрокаПоиска.ЦветФонаПоля = Новый Цвет(240, 255, 240);
ОчиститьСписки();
ПолучитьИнформацию(ТаблицаРезультата[текИндексСпискаВыбора].Ссылка);
КонецПроцедуры

//Кнопка очистки ещё подчистит все списки
Процедура СтрокаПоискаОчистка(Элемент, СтандартнаяОбработка)
ЭлементыФормы.СтрокаПоиска.ЦветФонаПоля = Новый Цвет(255, 255, 255);
ОчиститьСписки();
КонецПроцедуры

//Делаем выбор из таблицы выбора (при помощи мыши)
Процедура ТаблицаВыбораПриАктивизацииСтроки(Элемент)
Если НЕ ЭлементыФормы.ТаблицаВыбора.Видимость Тогда Возврат КонецЕсли;
текИндексТаблицыВыбора = ТаблицаВыбора.Индекс(Элемент.ТекущаяСтрока);
Если текИндексТаблицыВыбора = 0 Тогда Возврат КонецЕсли;
ЭлементыФормы.СтрокаПоиска.Значение = ЭлементыФормы.СтрокаПоиска.СписокВыбора[текИндексТаблицыВыбора - 1];
ЭлементыФормы.СтрокаПоиска.ЦветФонаПоля = Новый Цвет(240, 255, 240);
ОчиститьСписки();
ПолучитьИнформацию(ТаблицаРезультата[текИндексТаблицыВыбора - 1].Ссылка);
КонецПроцедуры

//По результатам запроса при необходимости заполняем список выбора, таблицу выбора
Процедура СделатьВыбор(СписокФрагментов)
//Получаем таблицу с найденными элементами
ТаблицаРезультата = ЗапросПоиска(СписокФрагментов);
ОчиститьСписки();
//Имеем три варианта:
//Элементы не найдены
Если ТаблицаРезультата.Количество() = 0 Тогда
ЭлементыФормы.СтрокаПоиска.ЦветФонаПоля = Новый Цвет(255, 216, 128);
//Найден один элемент, что и требовалось. Теперь уходим отсюда.
ИначеЕсли ТаблицаРезультата.Количество() = 1 Тогда
ЭлементыФормы.СтрокаПоиска.ЦветФонаПоля = Новый Цвет(240, 255, 240);
ЭлементыФормы.СтрокаПоиска.Значение = ТаблицаРезультата[0].Наименование;
ПолучитьИнформацию(ТаблицаРезультата[0].Ссылка);
//Найдено много элементов
Иначе
ЭлементыФормы.СтрокаПоиска.ЦветФонаПоля = Новый Цвет(255, 255, 255);
КоличествоНайденныхЭлементов = ТаблицаРезультата.Количество();
Для текСтрока = 1 По КоличествоНайденныхЭлементов Цикл
ТаблицаВыбора.Добавить();
КонецЦикла;
ТаблицаВыбора.ЗагрузитьКолонку(ТаблицаРезультата.ВыгрузитьКолонку("Наименование"), "Наименование");
ТаблицаВыбора.Вставить(0);
ЭлементыФормы.СтрокаПоиска.СписокВыбора.ЗагрузитьЗначения(ТаблицаРезультата.ВыгрузитьКолонку("Наименование"));
ЭлементыФормы.ТаблицаВыбора.ТекущаяСтрока = ТаблицаВыбора[0];
ЭлементыФормы.ТаблицаВыбора.Высота = (КоличествоНайденныхЭлементов + 1) * 19 + 2 ;
ЭлементыФормы.СтрокаПоиска.КнопкаСпискаВыбора = Истина;
ЭлементыФормы.ТаблицаВыбора.Видимость = Истина;
КонецЕсли;
КонецПроцедуры

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

//Параллельно кириллице будем искать фрагменты на латинице,
//в двух вариантах из-за различия транслитирации некоторых букв
Функция Транслит(Фрагмент)
СписокТранслита = Новый СписокЗначений;
Кириллица = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя";
Латиница1 = "f,dult`;pbqrkvyjghcnea[wxio]sm'.z";
Латиница2 = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя";
КириллицаДиграф = "ч ш ";
ЛатиницаДиграф = "chsh";
Транслит1 = "";
Транслит2 = "";
Для позиция = 1 По СтрДлина(Фрагмент) Цикл
текБуква = Сред(Фрагмент, позиция, 1);
вШаблоне = Найти(Кириллица, текБуква);
Если вШаблоне > 0 Тогда
Транслит1 = Транслит1 + Сред(Латиница1, вШаблоне, 1);
Транслит2 = Транслит2 + Сред(Латиница2, вШаблоне, 1);
Продолжить;
КонецЕсли;
вШаблоне = Найти(КириллицаДиграф, текБуква);
Если вШаблоне > 0 Тогда
Транслит1 = Транслит1 + Сред(ЛатиницаДиграф, вШаблоне, 2);
Транслит2 = Транслит2 + Сред(ЛатиницаДиграф, вШаблоне, 2);
Продолжить;
КонецЕсли;
Транслит1 = Транслит1 + текБуква;
Транслит2 = Транслит2 + текБуква;
КонецЦикла;
СписокТранслита.Добавить(Транслит1);
СписокТранслита.Добавить(Транслит2);
Возврат СписокТранслита;
КонецФункции

//Очистка списка выбора и таблицы выбора
Процедура ОчиститьСписки()
ЭлементыФормы.ТаблицаВыбора.Видимость = Ложь;
ТаблицаВыбора.Очистить();
ЭлементыФормы.СтрокаПоиска.СписокВыбора.Очистить();
ЭлементыФормы.СтрокаПоиска.КнопкаСпискаВыбора = Ложь;
КонецПроцедуры

//Здесь будет любая наша обработка результата поиска
Процедура ПолучитьИнформацию(текОбъект)
Если ТипЗнч(текОбъект) = Тип("СправочникСсылка.Контрагенты") Тогда
//Это контрагент
Иначе
//Это номенклатура
КонецЕсли;
//Например
текОбъект.ПолучитьФорму().Открыть();
КонецПроцедуры
Вложения
116690_Stroka_poiska_po_spravochnikam_Nomenklatura_i_Kontragenty.rar
(6.17 КБ) Скачиваний: 130
Ubuntu 12.04 32 bit. ДК 1.3.1 patch2_426
kuman
 
Постов: 480
Зарегистрирован: 18 апр 2011, 20:28

Вернуться в Ваши предложения

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


cron

Кто сейчас на конференции

Сейчас посетителей на конференции: 1, из них зарегистрированных: 0, скрытых: 0 и гостей: 1 (основано на активности пользователей за последние 5 минут)
Больше всего посетителей (170) здесь было 16 май 2020, 01:50

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1