Универсальная обработка события ОкончаниеВводаТекста
При вводе по строке выводит в список значения произвольных реквизитов. Функция универсальна для любой конфигурации. Для использования необходимо предлагаемую функцию вставить в общий модуль. Функция вызывается из обработчика элемента формы "ОкончаниеВводаТекста".
Текст функции с примером ее вызова представлен ниже.
- Описание
- Подробнее
Описание
Недавно поставила мне бух задачу: Хочу, чтобы когда я вводила расчетный счет контрагента в платежное поручение, отображался в списке для выбора расчетный счет и МФО в скобочках. Другая бухгалтерша захотела, чтобы при вводе статьи затрат та отображалась с хитрой кодировкой в списке значений. И у меня родилась идея написать универсальный обработчик события «ОкончаниеВводаТекста» элемента формы, который бы позволил при вводе по строке выводить в список значения произвольных реквизитов.
Функция универсальна для любой конфигурации.
Для использования необходимо предлагаемую функцию вставить в общий модуль.
Функция вызывается из обработчика элемента формы «ОкончаниеВводаТекста».
Пример вызова функции:
Процедура СчетКонтрагентаОкончаниеВводаТекста(Элемент, Текст, Значение, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Значение = РаботаСДиалогами.ПолучитьСписокОкончаниеВводаТекста(«БанковскиеСчета»,Текст,«НомерСчета»,«Банк.Код»,,«МФО»,Контрагент);
КонецПроцедуры
//==================================
//ПолучитьСписокОкончаниеВводаТекста(_НазваниеСправочника,_Текст,_НазваниеРекв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);
КонецЦикла;
Возврат СписокЗн;
КонецФункции //
