Автоматический подбор по строке

В стандартные элементы формы, содержащие ссылки на объект могут быть подставлены данные подобранные по первым символам наименования или кода для справочников или же по номеру для документов. В качестве расширения указанное поле можно использовать для поиска по любому строковому содержанию в любом реквизите искомого объекта. Для этого необходимо подписаться на событие элемента формы «Окончание ввода текста» внутри обработчика которого установить передаваемому параметру «Значение» либо ссылку на соответствующий объект, либо внести в него список этих объектов. Во втором случае система предложит выбрать один вариант из заполненного списка. Если же в списке только один элемент, то система просто подставит его в указанный элемент формы.
В примере ниже я реализовал подбор контрагента. Поиск осуществляется по строке в любой части наименования. Кроме того, в случае, если контрагент не найден, то будет выдан запрос на его создание, и открыто модальное окно для заполнения реквизитов. В случае если элемент записан, он будет подставлен в элемент формы.

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

	Выборка = ПостроительЗапроса.Результат.Выбрать();
	Пока Выборка.Следующий() Цикл
		Значение.Добавить(Выборка.Ссылка,Выборка.Наименование+?(СокрЛП(Выборка.РНН)="",""," ("+Выборка.РНН+")"));
		Если Значение.Количество() >= 50 Тогда
			Прервать;
		КонецЕсли;
	КонецЦикла;
	Если Значение.Количество() = 0 Тогда
		Ответ = Вопрос("Контрагент с наименованием "+Текст+" не найден. 
		|Создать?",РежимДиалогаВопрос.ДаНет);
		Если Ответ = КодВозвратаДиалога.Да Тогда
			Элемент = Справочники.Контрагенты.СоздатьЭлемент();
			Элемент.Наименование = Текст;
			Форма = Элемент.ПолучитьФорму("ФормаЭлемента");
			Форма.ОткрытьМодально();
			Если НЕ Элемент.ЭтоНовый() Тогда
				Значение = Элемент.Ссылка;
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры
Метки: , , , . Закладка Постоянная ссылка.