Почему строка поиска в динамическом списке 1С ищет только по некоторым полям и как это исправить?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе с динамическими списками в управляемых формах 1С разработчики часто сталкиваются с ситуацией, когда стандартная строка поиска ведет себя непредсказуемо. Например, в списке с номенклатурой, артикулом и присоединенной ценой поиск начинает срабатывать только по полю цены, полностью игнорируя наименование и артикул.

Рассмотрим причинно-следственные связи такого поведения платформы 1С:Предприятие и разберем по шагам, как вернуть корректную работу поиска.

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

Стандартный механизм поиска в динамических списках управляемых форм работает по двухуровневому алгоритму:

  1. Основной механизм: платформа использует индекс полнотекстового поиска (ППС). Полнотекстовый индекс строится по объектам основной таблицы динамического списка (в нашем примере — справочнику Номенклатура).
  2. Резервный механизм: если индекс полнотекстового поиска рассинхронизирован, содержит ошибки или не обновлен, платформа пытается выполнить поиск средствами СУБД с помощью условий ПОДОБНО. При наличии сложного запроса с левым соединением (LEFT JOIN) к внешним таблицам (например, срезу последних регистра сведений ЦеныНоменклатуры) платформа может некорректно сформировать итоговый запрос отбора СУБД, ограничив область поиска только присоединенными полями.

Проанализируем пример запроса динамического списка, при котором возникла проблема:


ВЫБРАТЬ
	СправочникНоменклатура.Наименование,
	СправочникНоменклатура.Артикул,
	ЦеныНоменклатурыСрезПоследних.Цена,
	СправочникНоменклатура.Ссылка
ИЗ
	Справочник.Номенклатура КАК СправочникНоменклатура
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
				&НаДату,
				Актуальность = ИСТИНА
					И СтруктурнаяЕдиница = &СтруктурнаяЕдиница
					И ВидЦен = &ВидЦен
					И Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиНоменклатуры.ПустаяСсылка)) КАК ЦеныНоменклатурыСрезПоследних
		ПО СправочникНоменклатура.Ссылка = ЦеныНоменклатурыСрезПоследних.Номенклатура

В данном запросе указана основная таблица Справочник.Номенклатура, однако из-за устаревшего или поврежденного индекса полнотекстового поиска стандартный поиск работал со сбоями.

Шаг 1. Обновление индекса полнотекстового поиска

В большинстве случаев для решения проблемы достаточно актуализировать индекс полнотекстового поиска. Разберем, как это сделать в режиме 1С:Предприятие:

  1. Перейдем в раздел администрирования в меню программы (Администрирование -> Поддержка и обслуживание -> Полнотекстовый поиск).
  2. Выполним команду Обновить индекс (или запустим регламентное задание Обновление индекса полнотекстового поиска).
  3. Если обновление не решило проблему, выполним полную переиндексацию: нажмем Очистить индекс, а затем Обновить индекс.

Шаг 2. Проверка настроек метаданных и элементов формы

Если обновление индекса не дало результата, проанализируем настройки конфигурации:

  1. Настройка свойств объектов: откроем Конфигуратор и проверим свойство Полнотекстовый поиск у объекта (например, справочника Номенклатура) и у конкретных реквизитов (Наименование, Артикул). Оно должно быть установлено в значение Использовать.
  2. Видимость и использование реквизитов на форме: убедимся, что нужные колонки вынесены в таблицу формы. Если реквизит скрыт или удален с формы, платформа может исключать его из контекстного поиска. Чтобы гарантировать участие скрытого поля в отборах, в свойствах элемента таблицы формы установим свойство Использовать всегда в значение Авто или Истина.

Альтернативный вариант: программная организация поиска

Если специфическая структура запроса динамического списка не позволяет штатному полнотекстовому поиску работать корректно, разберем альтернативный вариант реализации отбора через программное текстовое поле на форме.

Для этого отключим стандартную строку поиска (свойства динамического списка ПоложениеСтрокиПоиска = Нет) и добавим на форму обычное поле ввода. В обработчике события ПриИзменении этого поля сформируем программный отбор:


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

Такой подход обеспечивает точный поиск по любой подстроке средствами СУБД без зависимости от состояния индекса полнотекстового поиска.

← На главную