1. Serega-artem 12 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 12 26.03.20 13:33 Сейчас в теме
А ларчик то ведь просто открывался)))))

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


Единственный минус, как-то долго выполняется. Хотя регистр не сказать что сильно большой +- 2000 записей.
Остальные ответы
Избранное Подписка Сортировка: Древо развёрнутое
Свернуть все
2. dhurricane 26.03.20 12:37 Сейчас в теме
(1) Программно вбить строку в поле поиска динамического списка вряд ли получится. Но можно попробовать осуществить полнотекстовый поиск в регистре программно, а затем самостоятельно вывести результат. У Вас типовая конфигурация? Встроена БСП?
3. Serega-artem 12 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 12 26.03.20 14:02 Сейчас в теме
(5) В любом случае большое спасибо, что потратили время! Идея, кстати, очень неплохая и может пригодится на других задачах!
4. Serega-artem 12 26.03.20 13:33 Сейчас в теме
А ларчик то ведь просто открывался)))))

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


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

Вакансии

Автор новостных обзоров на тему 1С и бухучета
Санкт-Петербург
По совместительству

Специалист внедрения и сопровождения 1С
Москва
зарплата от 80 000 руб.
Полный день

Product Owner (Менеджер по продукту 1С)
Москва
зарплата от 100 000 руб. до 170 000 руб.
Полный день

Тим лид по разработке 1С (Team Lead 1С)
Москва
зарплата от 100 000 руб. до 200 000 руб.
Полный день

Программист, аналитик, эксперт 1С
Санкт-Петербург
По совместительству