Рассмотрим распространенную задачу при разработке интерфейсов в обычных формах: пользователю необходимо вводить произвольный текст в колонку табличной части, но при этом иметь возможность быстро выбрать одно из уже ранее введенных в эту же колонку значений.
Для реализации возможности как прямого ввода текста с клавиатуры, так и выбора из выпадающего списка, проанализируем настройки элемента управления ПолеВвода в колонке табличного поля:
Истина, платформа заблокирует ввод произвольного текста и ограничит ввод только элементами из списка.Разберем классический подход, предложенный в обсуждении. Чтобы не перебирать строки в цикле вручную, скопируем таблицу значений, свернем её по нужной колонке и выгрузим уникальные данные.
Посмотрим на пример кода в событии НачалоВыбораИзСписка элемента управления:
Процедура ТабличнаяЧастьИмяКолонкиНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)
// Получаем копию табличной части
ТаблицаКопия = ЭлементыФормы.ТабличнаяЧасть.Выгрузить();
// Оставляем только уникальные значения
ТаблицаКопия.Свернуть("ИмяКолонки");
// Находим и удаляем пустые строки, если они есть
СтрокаСПустымЗначением = ТаблицаКопия.Найти("", "ИмяКолонки");
Если СтрокаСПустымЗначением <> Неопределено Тогда
ТаблицаКопия.Строки.Удалить(СтрокаСПустымЗначением);
КонецЕсли;
// Заполняем список выбора элемента управления
Элемент.СписокВыбора.ЗагрузитьЗначения(ТаблицаКопия.ВыгрузитьКолонку("ИмяКолонки"));
КонецПроцедуры
Если табличная часть содержит большое количество строк, проанализируем более эффективный способ получить непустые уникальные значения — с помощью запроса к выгруженной таблице значений.
Рассмотрим пример реализации:
Процедура ТабличнаяЧастьИмяКолонкиНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)
ТаблицаДанных = ЭлементыФормы.ТабличнаяЧасть.Выгрузить();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Таблица.ИмяКолонки КАК ИмяКолонки
|ИЗ
| &ТаблицаДанных КАК Таблица
|ГДЕ
| Таблица.ИмяКолонки <> """"";
Запрос.УстановитьПараметр("ТаблицаДанных", ТаблицаДанных);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
ТаблицаЗначений = РезультатЗапроса.Выгрузить();
Элемент.СписокВыбора.ЗагрузитьЗначения(ТаблицаЗначений.ВыгрузитьКолонку("ИмяКолонки"));
КонецЕсли;
КонецПроцедуры
Выясним несколько технических нюансов, о которых нужно помнить при реализации:
ЗагрузитьЗначения() полностью перезаписывает список выбора, поэтому нет необходимости вручную очищать Элемент.СписокВыбора перед каждым вызовом.НачалоВыбораИзСписка принимает параметры (Элемент, СтандартнаяОбработка), а сам список выпадающих значений доступен через свойство Элемент.СписокВыбора.АвтоПодборТекста, чтобы подставлять совпадения «на лету» прямо во время ввода текста пользователем.