Недавно поставила мне бух задачу: Хочу, чтобы когда я вводила расчетный счет контрагента в платежное поручение, отображался в списке для выбора расчетный счет и МФО в скобочках. Другая бухгалтерша захотела, чтобы при вводе статьи затрат та отображалась с хитрой кодировкой в списке значений. И у меня родилась идея написать универсальный обработчик события "ОкончаниеВводаТекста" элемента формы, который бы позволил при вводе по строке выводить в список значения произвольных реквизитов.
Функция универсальна для любой конфигурации.
Для использования необходимо предлагаемую функцию вставить в общий модуль.
Функция вызывается из обработчика элемента формы "ОкончаниеВводаТекста".
Пример вызова функции:
Процедура СчетКонтрагентаОкончаниеВводаТекста(Элемент, Текст, Значение, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Значение = РаботаСДиалогами.ПолучитьСписокОкончаниеВводаТекста("БанковскиеСчета",Текст,"НомерСчета","Банк.Код",,"МФО",Контрагент);
КонецПроцедуры
//==================================
//ПолучитьСписокОкончаниеВводаТекста(_НазваниеСправочника,_Текст,_НазваниеРекв1,_НазваниеРекв2 = "",_Рекв2ВСкобки = Истина,_ТекстРекв2 = "",_ВладелецСправочника = "") Экспорт
// _НазваниеСправочника - Строка с названием справочника
// _Текст - Подстрока набираемого текста
// _НазваниеРекв1 - Строка с названием реквизита, который будем показывать в списке значений
// _НазваниеРекв2 - Строка с названием реквизита, который будем показывать в списке значений в скобочках
// _Рекв2ВСкобки - Признак вывода второго реквизита в скобках, булево
//_ТекстРекв2 - В случае необходимости добавляем к значению реквизита в скобочках его имя
// _ ВладелецСправочника – Фильтр по владельцу
// Возвращает список значений; Вызывается из обработчика события "ОкончаниеВводаТекста" элемента формы
Функция ПолучитьСписокОкончаниеВводаТекста(_НазваниеСправочника,_Текст,_НазваниеРекв1,_НазваниеРекв2 = "",_Рекв2ВСкобки = Истина,_ТекстРекв2 = "",_ВладелецСправочника = "") Экспорт
Метадан = Метаданные.Справочники[_НазваниеСправочника];
ПоляВводПоСтроке = Метадан.ВводПоСтроке;
КвоСимволов = СтрДлина(СокрЛП(_Текст));
СписокЗн = Новый СписокЗначений;
Если ПоляВводПоСтроке.Количество() = 0 ИЛИ КвоСимволов = 0 Тогда
Возврат СписокЗн;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("КвоСимволов",КвоСимволов);
Запрос.УстановитьПараметр("Текст",_Текст);
Запрос.Текст = "ВЫБРАТЬ
| Спр.Ссылка,
| Спр."+_НазваниеРекв1+"";
Если _НазваниеРекв2 <> "" Тогда
Запрос.Текст = Запрос.Текст + ",
| Спр."+_НазваниеРекв2+"";
КонецЕсли;
Запрос.Текст = Запрос.Текст + "
|ИЗ
| Справочник."+_НазваниеСправочника+" КАК Спр
|ГДЕ";
Для каждого ТекСтр Из ПоляВводПоСтроке Цикл
Если (ТекСтр.Имя = "Наименование")
ИЛИ (ТекСтр.Имя = "Код" И Строка(Метадан.ТипКода) = "Строка")
ИЛИ (ТекСтр.Имя <> "Код" И ТипЗнч(Метадан.Реквизиты[ТекСтр.Имя].Имя) = Тип("Строка")) Тогда
Запрос.Текст = Запрос.Текст + "
| " + ?(ПоляВводПоСтроке.Индекс(ТекСтр) > 0," ИЛИ ","(")+ "ПОДСТРОКА(Спр." + ТекСтр.Имя + ", 1, &КвоСимволов) = &Текст"
+ ?(ПоляВводПоСтроке.Индекс(ТекСтр) = (ПоляВводПоСтроке.Количество() - 1),")","");
Иначе
Запрос.Текст = Запрос.Текст + "
| " + ?(ПоляВводПоСтроке.Индекс(ТекСтр) > 0," ИЛИ ","(")+ "Спр." + ТекСтр.Имя + " = &Текст"
+ ?(ПоляВводПоСтроке.Индекс(ТекСтр) = (ПоляВводПоСтроке.Количество() - 1),")","");
КонецЕсли;
КонецЦикла;
Если Метадан.Иерархический Тогда
Запрос.Текст = Запрос.Текст + "
| И (НЕ Спр.ЭтоГруппа)";
КонецЕсли;
Если _ВладелецСправочника <> "" Тогда
Запрос.УстановитьПараметр("ВладелецСправочника",_ВладелецСправочника);
Запрос.Текст = Запрос.Текст + "
| И Спр.Владелец = &ВладелецСправочника";
КонецЕсли;
Запрос.Текст = Запрос.Текст + "
|
|УПОРЯДОЧИТЬ ПО
| "+_НазваниеРекв1+"";
Если _НазваниеРекв2 <> "" Тогда
Запрос.Текст = Запрос.Текст + ",
| "+_НазваниеРекв2+"";
КонецЕсли;
ЗначениеРекв2 = "";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ЗначениеСсылка = Выборка.Ссылка;
ЗначениеРекв1 = СокрЛП(Выборка[_НазваниеРекв1]);
Если _НазваниеРекв2 <> "" Тогда
_НазваниеРекв2 = СтрЗаменить(_НазваниеРекв2,".","");
ЗначениеРекв2 = ?(_Рекв2ВСкобки," (",?(_ТекстРекв2 <> ""," ","")) + _ТекстРекв2 + " " + СокрЛП(Выборка[_НазваниеРекв2]) + ?(_Рекв2ВСкобки,")","");
КонецЕсли;
СписокЗн.Добавить(ЗначениеСсылка,ЗначениеРекв1 + ЗначениеРекв2);
КонецЦикла;
Возврат СписокЗн;
КонецФункции //