В стандартные элементы формы, содержащие ссылки на объект могут быть подставлены данные подобранные по первым символам наименования или кода для справочников или же по номеру для документов. В качестве расширения указанное поле можно использовать для поиска по любому строковому содержанию в любом реквизите искомого объекта. Для этого необходимо подписаться на событие элемента формы «Окончание ввода текста» внутри обработчика которого установить передаваемому параметру «Значение» либо ссылку на соответствующий объект, либо внести в него список этих объектов. Во втором случае система предложит выбрать один вариант из заполненного списка. Если же в списке только один элемент, то система просто подставит его в указанный элемент формы.
В примере ниже я реализовал подбор контрагента. Поиск осуществляется по строке в любой части наименования. Кроме того, в случае, если контрагент не найден, то будет выдан запрос на его создание, и открыто модальное окно для заполнения реквизитов. В случае если элемент записан, он будет подставлен в элемент формы.
Процедура КонтрагентОкончаниеВводаТекста(Элемент, Текст, Значение, СтандартнаяОбработка) Значение = Новый СписокЗначений; СтандартнаяОбработка = Ложь; ТекстЗапроса = "ВЫБРАТЬ | Контрагенты.Ссылка, | Контрагенты.Наименование, | Контрагенты.РНН |ИЗ | Справочник.Контрагенты КАК Контрагенты |ГДЕ | Контрагенты.ЭтоГруппа = ЛОЖЬ"; ПостроительЗапроса = Новый ПостроительЗапроса; ПостроительЗапроса.Текст = ТекстЗапроса; ПостроительЗапроса.ЗаполнитьНастройки(); ЭлементОтбора = ПостроительЗапроса.Отбор.Добавить("Наименование"); ЭлементОтбора.ВидСравнения = ВидСравнения.Содержит; ЭлементОтбора.Использование = Истина; ЭлементОтбора.Значение = Текст; ПостроительЗапроса.Выполнить(); Выборка = ПостроительЗапроса.Результат.Выбрать(); Пока Выборка.Следующий() Цикл Значение.Добавить(Выборка.Ссылка,Выборка.Наименование+?(СокрЛП(Выборка.РНН)="",""," ("+Выборка.РНН+")")); Если Значение.Количество() >= 50 Тогда Прервать; КонецЕсли; КонецЦикла; Если Значение.Количество() = 0 Тогда Ответ = Вопрос("Контрагент с наименованием "+Текст+" не найден. |Создать?",РежимДиалогаВопрос.ДаНет); Если Ответ = КодВозвратаДиалога.Да Тогда Элемент = Справочники.Контрагенты.СоздатьЭлемент(); Элемент.Наименование = Текст; Форма = Элемент.ПолучитьФорму("ФормаЭлемента"); Форма.ОткрытьМодально(); Если НЕ Элемент.ЭтоНовый() Тогда Значение = Элемент.Ссылка; КонецЕсли; КонецЕсли; КонецЕсли; КонецПроцедуры