Программный полнотекстовый поиск в динамическом списке
Добрый день, коллеги! Подскажите, пожалуйста, можно ли как-то выполнить следующую задачу:
Имеет независимый регистр сведений, с одним измерением с типом строка. В нем указан номер и наименование чертежа. Выглядит это примерно так:
254.587.57. гайка круглая
круглая гайка 254.587.57.
Шайба под гайку 254.587.57. 10 мм. круглая
и т.д. т.е. есть чертежный номер 254.587.57. и описание изделия. Никакой логики, позволяющей вытащить номер в отдельное измерение, в этих описаниях нет. написано может быть как угодно. Сам номер тоже может быть как 254.587.57. а может 254. 587. 57. и еще куча вариаций.
Есть справочник, на форме которого размещен динамический список (ДС) связаны с этим регистром. Есть реквизит справочника, содержащий чертежный номер. Задача сделать в ДС отбор по всем записям, в которых фигурирует этот самый чертежный номер. Если в форме поиска ДС вбить его в ручную - результат получен. Но это надо делать автоматически, при открытии формы справочника....
Собственно вопрос: как инициализировать поиск по ДС программно?
Имеет независимый регистр сведений, с одним измерением с типом строка. В нем указан номер и наименование чертежа. Выглядит это примерно так:
254.587.57. гайка круглая
круглая гайка 254.587.57.
Шайба под гайку 254.587.57. 10 мм. круглая
и т.д. т.е. есть чертежный номер 254.587.57. и описание изделия. Никакой логики, позволяющей вытащить номер в отдельное измерение, в этих описаниях нет. написано может быть как угодно. Сам номер тоже может быть как 254.587.57. а может 254. 587. 57. и еще куча вариаций.
Есть справочник, на форме которого размещен динамический список (ДС) связаны с этим регистром. Есть реквизит справочника, содержащий чертежный номер. Задача сделать в ДС отбор по всем записям, в которых фигурирует этот самый чертежный номер. Если в форме поиска ДС вбить его в ручную - результат получен. Но это надо делать автоматически, при открытии формы справочника....
Собственно вопрос: как инициализировать поиск по ДС программно?
По теме из базы знаний
- Возвращение старого поиска в новых релизах Бухгалтерии предприятия 3.0
- Подсчёт и отображение количества строк в динамическом списке
- Полнотекстовый поиск в 1С. №1 Грабли в динамических списках
- Восстановление полнотекстового поиска в базе данных. Клиент-серверный вариант. Моя практика.
- Полнотекстовый поиск в 1С. №2 Самое основное для разработчика
Найденные решения
А ларчик то ведь просто открывался)))))
Единственный минус, как-то долго выполняется. Хотя регистр не сказать что сильно большой +- 2000 записей.
Процедура ОтборПоБазеЧертежей ()
ЭлементОтбора = БазаЧертежей.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
// Установка
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("НаименованиеЧертежа");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Содержит;
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
ЭлементОтбора.ПравоеЗначение = Объект.Наименование;
конецПроцедуры
ПоказатьЕдинственный минус, как-то долго выполняется. Хотя регистр не сказать что сильно большой +- 2000 записей.
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(3) Хотел сперва предложить Вам примерно следующее решение:
Но его проверка ни привела меня ожидаемому результату. Функция работает непредсказуемо. Извините. Быть может на ее основе Вам удастся что-нибудь получить дельное.
Функция ВыполнитьПоискНаСервере()
РазмерПорции = 5;
Результат = Новый Массив;
СписокПоиска = ПолнотекстовыйПоиск.СоздатьСписок(СтрокаПоиска, РазмерПорции);
СписокПоиска.ОбластьПоиска = Новый Массив;
СписокПоиска.ОбластьПоиска.Добавить(Метаданные.РегистрыСведений.МойРегистрСНомерами);
СписокПоиска.ПерваяЧасть();
Если СписокПоиска.СлишкомМногоРезультатов() Тогда
ВызватьИсключение НСтр("ru = 'Слишком много результатов, уточните запрос'");
КонецЕсли;
ПолноеКоличество = СписокПоиска.ПолноеКоличество();
Если ПолноеКоличество = 0 Тогда
ВызватьИсключение НСтр("ru = 'По запросу ничего не найдено'");
КонецЕсли;
Индекс = 0;
Пока Индекс < ПолноеКоличество Цикл
Для каждого Элемент Из СписокПоиска Цикл
Индекс = Индекс + 1;
Результат.Добавить(Элемент.Значение.Номер);
КонецЦикла;
Если Индекс < ПолноеКоличество Тогда
СписокПоиска.СледующаяЧасть(Индекс);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
ПоказатьНо его проверка ни привела меня ожидаемому результату. Функция работает непредсказуемо. Извините. Быть может на ее основе Вам удастся что-нибудь получить дельное.
А ларчик то ведь просто открывался)))))
Единственный минус, как-то долго выполняется. Хотя регистр не сказать что сильно большой +- 2000 записей.
Процедура ОтборПоБазеЧертежей ()
ЭлементОтбора = БазаЧертежей.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
// Установка
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("НаименованиеЧертежа");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Содержит;
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
ЭлементОтбора.ПравоеЗначение = Объект.Наименование;
конецПроцедуры
ПоказатьЕдинственный минус, как-то долго выполняется. Хотя регистр не сказать что сильно большой +- 2000 записей.
А зачем собственно в данном случае динамический список? он потому и долго отрабатывает что запрос а не полнотекстовый поиск.
Не проще и быстрее задать СписокПоиска = ПолнотекстовыйПоиск.СоздатьСписок("СтрокаПоиска");
Установить метаданные и считать порцию в ТЗ на форме? опять же всякие вкусности вроде процента соответствия и прочего?
Не проще и быстрее задать СписокПоиска = ПолнотекстовыйПоиск.СоздатьСписок("СтрокаПоиска");
Установить метаданные и считать порцию в ТЗ на форме? опять же всякие вкусности вроде процента соответствия и прочего?
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот