Программный полнотекстовый поиск в динамическом списке

1. Serega-artem 16 26.03.20 11:02 Сейчас в теме
Добрый день, коллеги! Подскажите, пожалуйста, можно ли как-то выполнить следующую задачу:

Имеет независимый регистр сведений, с одним измерением с типом строка. В нем указан номер и наименование чертежа. Выглядит это примерно так:

254.587.57. гайка круглая

круглая гайка 254.587.57.

Шайба под гайку 254.587.57. 10 мм. круглая

и т.д. т.е. есть чертежный номер 254.587.57. и описание изделия. Никакой логики, позволяющей вытащить номер в отдельное измерение, в этих описаниях нет. написано может быть как угодно. Сам номер тоже может быть как 254.587.57. а может 254. 587. 57. и еще куча вариаций.

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

Собственно вопрос: как инициализировать поиск по ДС программно?
По теме из базы знаний
Найденные решения
4. Serega-artem 16 26.03.20 13:33 Сейчас в теме
А ларчик то ведь просто открывался)))))

Процедура ОтборПоБазеЧертежей () 
	ЭлементОтбора = БазаЧертежей.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	// Установка
	ЭлементОтбора.ЛевоеЗначение    = Новый ПолеКомпоновкиДанных("НаименованиеЧертежа");
    ЭлементОтбора.ВидСравнения     = ВидСравненияКомпоновкиДанных.Содержит;
    ЭлементОтбора.Использование    = Истина;
    ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
    ЭлементОтбора.ПравоеЗначение   = Объект.Наименование; 
	конецПроцедуры 	
Показать


Единственный минус, как-то долго выполняется. Хотя регистр не сказать что сильно большой +- 2000 записей.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. dhurricane 26.03.20 12:37 Сейчас в теме
(1) Программно вбить строку в поле поиска динамического списка вряд ли получится. Но можно попробовать осуществить полнотекстовый поиск в регистре программно, а затем самостоятельно вывести результат. У Вас типовая конфигурация? Встроена БСП?
3. Serega-artem 16 26.03.20 12:40 Сейчас в теме
(2) Самописка, без БСП.

Но можно попробовать осуществить полнотекстовый поиск в регистре программно


Это как?
5. dhurricane 26.03.20 13:58 Сейчас в теме
(3) Хотел сперва предложить Вам примерно следующее решение:
Функция ВыполнитьПоискНаСервере()
	
	РазмерПорции = 5;
	Результат = Новый Массив;

	СписокПоиска = ПолнотекстовыйПоиск.СоздатьСписок(СтрокаПоиска, РазмерПорции);
	
	СписокПоиска.ОбластьПоиска = Новый Массив;
	СписокПоиска.ОбластьПоиска.Добавить(Метаданные.РегистрыСведений.МойРегистрСНомерами);

	СписокПоиска.ПерваяЧасть();
	Если СписокПоиска.СлишкомМногоРезультатов() Тогда 
		ВызватьИсключение НСтр("ru = 'Слишком много результатов, уточните запрос'");
	КонецЕсли;
	
	ПолноеКоличество = СписокПоиска.ПолноеКоличество();
	Если ПолноеКоличество = 0 Тогда
		ВызватьИсключение НСтр("ru = 'По запросу ничего не найдено'");
	КонецЕсли;
	
	Индекс = 0;
	Пока Индекс < ПолноеКоличество Цикл
		
		Для каждого Элемент Из СписокПоиска Цикл
			Индекс = Индекс + 1;
			Результат.Добавить(Элемент.Значение.Номер);
		КонецЦикла; 
		
		Если Индекс < ПолноеКоличество Тогда
			СписокПоиска.СледующаяЧасть(Индекс);
		КонецЕсли; 
		
	КонецЦикла; 
	
	Возврат Результат;

КонецФункции
Показать

Но его проверка ни привела меня ожидаемому результату. Функция работает непредсказуемо. Извините. Быть может на ее основе Вам удастся что-нибудь получить дельное.
Serega-artem; +1 Ответить
6. Serega-artem 16 26.03.20 14:02 Сейчас в теме
(5) В любом случае большое спасибо, что потратили время! Идея, кстати, очень неплохая и может пригодится на других задачах!
4. Serega-artem 16 26.03.20 13:33 Сейчас в теме
А ларчик то ведь просто открывался)))))

Процедура ОтборПоБазеЧертежей () 
	ЭлементОтбора = БазаЧертежей.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	// Установка
	ЭлементОтбора.ЛевоеЗначение    = Новый ПолеКомпоновкиДанных("НаименованиеЧертежа");
    ЭлементОтбора.ВидСравнения     = ВидСравненияКомпоновкиДанных.Содержит;
    ЭлементОтбора.Использование    = Истина;
    ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
    ЭлементОтбора.ПравоеЗначение   = Объект.Наименование; 
	конецПроцедуры 	
Показать


Единственный минус, как-то долго выполняется. Хотя регистр не сказать что сильно большой +- 2000 записей.
7. SkrAn 1 26.03.20 15:13 Сейчас в теме
А зачем собственно в данном случае динамический список? он потому и долго отрабатывает что запрос а не полнотекстовый поиск.
Не проще и быстрее задать СписокПоиска = ПолнотекстовыйПоиск.СоздатьСписок("СтрокаПоиска");
Установить метаданные и считать порцию в ТЗ на форме? опять же всякие вкусности вроде процента соответствия и прочего?
9. Serega-artem 16 26.03.20 19:56 Сейчас в теме
(7) Там фишка в том, что запись регистра надо открывать. т.е. не просто список строк выводить, а именно как записи регистра.
8. SkrAn 1 26.03.20 15:14 Сейчас в теме
Только убедитесь что по регистру он включен и индексы обновлены)
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот