Столкнулся с казалось бы простой задачей - в КА вместо стандартного поиска по первым символам сделать поиск по вхождению подстроки. Конфигурация полностью типовая, все доработки только через расширение. Стал разбираться, в менеджере объекта есть стандартная процедура
ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка) (см. Синтакс-Помощник)
В менеджере объекта (на примере справочника Контрагенты) такая процедура присутствует, и из нее в свою очередь вызывается еще одна
ПартнерыИКонтрагентыВызовСервера.КонтрагентыДанныеВыбора(Параметры)
в которой реализуется бизнес-логика конкретной конфигурации. В итоге мы получаем список, который инициализирует ДанныеВыбора, которые и видит пользователь, набирая текст.
В коде этой процедуры (и похожих, например, для справочника Номенклатура) есть такая строка:
Запрос.УстановитьПараметр("СтрокаВвода", ОбщегоНазначения.СформироватьСтрокуДляПоискаВЗапросе(СтрокаПоиска) + "%");
что подразумевает явный поиск по первым символам. Чтобы не ломать бизнес-логику и не прибегать к инъекциям типа &ИзменениеИКонтроль пришлось сделать таким образом. Заимствуем процедуру модуля менеджера:
&Перед("ОбработкаПолученияДанныхВыбора")
Процедура Расш1_ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
// поиск по вхождению (не по первым символам)
Если ЗначениеЗаполнено(Параметры.СтрокаПоиска) Тогда
Параметры.СтрокаПоиска = "%" + Параметры.СтрокаПоиска;
КонецЕсли;
КонецПроцедуры
и аккуратно модифицируем вышеназванную процедуру
ОбщегоНазначения.СформироватьСтрокуДляПоискаВЗапросе(СтрокаПоиска) так:
&Вместо("СформироватьСтрокуДляПоискаВЗапросе")
Функция Расш1_СформироватьСтрокуДляПоискаВЗапросе(Знач СтрокаПоиска)
// чтобы искать по вхождению (строка переопределеяется в расширении соотвествтующего модуля менеджера)
// если в начале строки есть символ "%", значит, мы ее уже модифицировали
// (можно вписывать в модуле менеджера в начало строки вместо "%"
// любой редкий символ или их последовательность)
Если Лев(СтрокаПоиска, 1) = "%" Тогда
Результат = Сред(СтрокаПоиска, 2);
Результат = СтрЗаменить(Результат, "~", "~~");
Результат = СтрЗаменить(Результат, "%", "~%");
Результат = СтрЗаменить(Результат, "_", "~_");
Результат = СтрЗаменить(Результат, "[", "~[");
Результат = СтрЗаменить(Результат, "]", "~]");
Результат = СтрЗаменить(Результат, "^", "~^");
Результат = "%" + Результат;
Иначе
// не изменяли строку в модуле менеджера - выполняется стандартный код типового решения
Результат = ПродолжитьВызов(СтрокаПоиска);
КонецЕсли;
Возврат Результат;
КонецФункции
И это все.