При работе с динамическими списками в управляемых формах 1С разработчики часто сталкиваются с ситуацией, когда стандартная строка поиска ведет себя непредсказуемо. Например, в списке с номенклатурой, артикулом и присоединенной ценой поиск начинает срабатывать только по полю цены, полностью игнорируя наименование и артикул.
Рассмотрим причинно-следственные связи такого поведения платформы 1С:Предприятие и разберем по шагам, как вернуть корректную работу поиска.
Стандартный механизм поиска в динамических списках управляемых форм работает по двухуровневому алгоритму:
Номенклатура).ПОДОБНО. При наличии сложного запроса с левым соединением (LEFT JOIN) к внешним таблицам (например, срезу последних регистра сведений ЦеныНоменклатуры) платформа может некорректно сформировать итоговый запрос отбора СУБД, ограничив область поиска только присоединенными полями.Проанализируем пример запроса динамического списка, при котором возникла проблема:
ВЫБРАТЬ
СправочникНоменклатура.Наименование,
СправочникНоменклатура.Артикул,
ЦеныНоменклатурыСрезПоследних.Цена,
СправочникНоменклатура.Ссылка
ИЗ
Справочник.Номенклатура КАК СправочникНоменклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
&НаДату,
Актуальность = ИСТИНА
И СтруктурнаяЕдиница = &СтруктурнаяЕдиница
И ВидЦен = &ВидЦен
И Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиНоменклатуры.ПустаяСсылка)) КАК ЦеныНоменклатурыСрезПоследних
ПО СправочникНоменклатура.Ссылка = ЦеныНоменклатурыСрезПоследних.Номенклатура
В данном запросе указана основная таблица Справочник.Номенклатура, однако из-за устаревшего или поврежденного индекса полнотекстового поиска стандартный поиск работал со сбоями.
В большинстве случаев для решения проблемы достаточно актуализировать индекс полнотекстового поиска. Разберем, как это сделать в режиме 1С:Предприятие:
Обновление индекса полнотекстового поиска).Если обновление индекса не дало результата, проанализируем настройки конфигурации:
Полнотекстовый поиск у объекта (например, справочника Номенклатура) и у конкретных реквизитов (Наименование, Артикул). Оно должно быть установлено в значение Использовать.Использовать всегда в значение Авто или Истина.Если специфическая структура запроса динамического списка не позволяет штатному полнотекстовому поиску работать корректно, разберем альтернативный вариант реализации отбора через программное текстовое поле на форме.
Для этого отключим стандартную строку поиска (свойства динамического списка ПоложениеСтрокиПоиска = Нет) и добавим на форму обычное поле ввода. В обработчике события ПриИзменении этого поля сформируем программный отбор:
&НаСервере
Процедура ПолеПоискаПриИзмененииНаСервере()
// Находим или создаем группу ИЛИ в отборе списка
ЭлементыОтбора = Список.Отбор.Элементы;
ЭлементыОтбора.Очистить();
Если Не ЗначениеЗаполнено(ТекстПоиска) Тогда
Возврат;
КонецЕсли;
ГруппаИЛИ = ЭлементыОтбора.Добавить(Тип("ГруппаЭлементовОтбораДинамическогоСписка"));
ГруппаИЛИ.ВидГруппы = ВидГруппыЭлементовОтбора.ГруппаИЛИ;
// Поиск по наименованию
ОтборНаименование = ГруппаИЛИ.Элементы.Добавить(Тип("ЭлементОтбораДинамическогоСписка"));
ОтборНаименование.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Наименование");
ОтборНаименование.ВидСравнения = ВидСравненияКомпоновкиДанных.Содержит;
ОтборНаименование.ПравоеЗначение = ТекстПоиска;
ОтборНаименование.Использование = Истина;
// Поиск по артикулу
ОтборАртикул = ГруппаИЛИ.Элементы.Добавить(Тип("ЭлементОтбораДинамическогоСписка"));
ОтборАртикул.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Артикул");
ОтборАртикул.ВидСравнения = ВидСравненияКомпоновкиДанных.Содержит;
ОтборАртикул.ПравоеЗначение = ТекстПоиска;
ОтборАртикул.Использование = Истина;
КонецПроцедуры
Такой подход обеспечивает точный поиск по любой подстроке средствами СУБД без зависимости от состояния индекса полнотекстового поиска.