Как реализовать выбор из ранее введенных значений в колонке табличной части в 1С

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

Рассмотрим распространенную задачу при разработке интерфейсов в обычных формах: пользователю необходимо вводить произвольный текст в колонку табличной части, но при этом иметь возможность быстро выбрать одно из уже ранее введенных в эту же колонку значений.

Настройка свойств элемента управления колонки

Для реализации возможности как прямого ввода текста с клавиатуры, так и выбора из выпадающего списка, проанализируем настройки элемента управления ПолеВвода в колонке табличного поля:

  1. КнопкаСпискаВыбора = Истина — включает отображение кнопки со стрелкой для вызова выпадающего списка в поле ввода.
  2. РежимВыбораИзСписка = Ложь — критически важное свойство. Если установить его в Истина, платформа заблокирует ввод произвольного текста и ограничит ввод только элементами из списка.

Способ 1. Получение уникальных значений через копирование и сворачивание таблицы

Разберем классический подход, предложенный в обсуждении. Чтобы не перебирать строки в цикле вручную, скопируем таблицу значений, свернем её по нужной колонке и выгрузим уникальные данные.

Посмотрим на пример кода в событии НачалоВыбораИзСписка элемента управления:


Процедура ТабличнаяЧастьИмяКолонкиНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)
	
	// Получаем копию табличной части
	ТаблицаКопия = ЭлементыФормы.ТабличнаяЧасть.Выгрузить();
	
	// Оставляем только уникальные значения
	ТаблицаКопия.Свернуть("ИмяКолонки");
	
	// Находим и удаляем пустые строки, если они есть
	СтрокаСПустымЗначением = ТаблицаКопия.Найти("", "ИмяКолонки");
	Если СтрокаСПустымЗначением <> Неопределено Тогда
		ТаблицаКопия.Строки.Удалить(СтрокаСПустымЗначением);
	КонецЕсли;
	
	// Заполняем список выбора элемента управления
	Элемент.СписокВыбора.ЗагрузитьЗначения(ТаблицаКопия.ВыгрузитьКолонку("ИмяКолонки"));

КонецПроцедуры

Способ 2. Использование запроса к выгруженной табличной части

Если табличная часть содержит большое количество строк, проанализируем более эффективный способ получить непустые уникальные значения — с помощью запроса к выгруженной таблице значений.

Рассмотрим пример реализации:


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

КонецПроцедуры

Важные особенности работы в обычных формах

Выясним несколько технических нюансов, о которых нужно помнить при реализации:

  1. Метод ЗагрузитьЗначения() полностью перезаписывает список выбора, поэтому нет необходимости вручную очищать Элемент.СписокВыбора перед каждым вызовом.
  2. События и параметры в обычных формах отличаются от управляемых форм. Обработчик НачалоВыбораИзСписка принимает параметры (Элемент, СтандартнаяОбработка), а сам список выпадающих значений доступен через свойство Элемент.СписокВыбора.
  3. Дополнительно можно задействовать событие АвтоПодборТекста, чтобы подставлять совпадения «на лету» прямо во время ввода текста пользователем.
← На главную