Быстрый отбор в справочнике по первой букве


В статье описан способ быстрой организации отбора в списке справочника по первой букве наименования. Механизм легко дотачивается под собственные нужды.
////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ И ФУНКЦИИ МОДУЛЯ 

&НаКлиенте
Процедура УстановитьПометку(Команда)

	Для Каждого Кнопка Из Элементы.ПанельСБуквами.ПодчиненныеЭлементы Цикл
		Кнопка.Пометка = (Команда.Имя = Кнопка.Имя);
	КонецЦикла;

КонецПроцедуры // УстановитьПометку()

&НаСервере
Процедура ПодготовитьДинамическийСписок()

	Список.ПроизвольныйЗапрос = Истина;
	ТекстЗапроса =
	"ВЫБРАТЬ *
	|ИЗ
	|	%ИмяТаблицы% КАК Т
	|{ГДЕ
	|	(ПОДСТРОКА(Т.Наименование, 1, 1) В (&СписокБукв))}";
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "%ИмяТаблицы%", Список.ОсновнаяТаблица);
	Список.ТекстЗапроса = ТекстЗапроса;

КонецПроцедуры // ПодготовитьДинамическийСписок()

&НаСервере
Процедура СоздатьПанельСБуквами()

	ПанельСБуквами = Элементы.Вставить("ПанельСБуквами", Тип("ГруппаФормы"), ЭтаФорма, Элементы.Список);
	ПанельСБуквами.Вид = ВидГруппыФормы.КоманднаяПанель;
	
	// кнопка "Все"
	КомандаФормы = Команды.Добавить("Все");
	КомандаФормы.Действие = "УдалитьФильтрПоПервойБукве";
	
	КнопкаФормы = Элементы.Добавить("Все", Тип("КнопкаФормы"), ПанельСБуквами);
	КнопкаФормы.ИмяКоманды = "Все";
	КнопкаФормы.Пометка = Истина;
	
	// кнопки А...Я
	Для Сч = КодСимвола("А") По КодСимвола("Я") Цикл
		
		ИмяКоманды = Символ(Сч);
		Если Найти("Ё,Й,Ъ,Ь", ИмяКоманды) > 0 Тогда
			Продолжить;
		КонецЕсли;
		
		КомандаФормы = Команды.Добавить(ИмяКоманды);
		КомандаФормы.Действие = "УстановитьФильтрПоПервойБукве";
		
		КнопкаФормы = Элементы.Добавить(ИмяКоманды, Тип("КнопкаФормы"), ПанельСБуквами);
		КнопкаФормы.ИмяКоманды = ИмяКоманды;
		
	КонецЦикла;

КонецПроцедуры // СоздатьПанельСКнопками()

////////////////////////////////////////////////////////////////////////////////
// КОМАНДЫ МОДУЛЯ 

&НаКлиенте
Процедура УстановитьФильтрПоПервойБукве(Команда)
	
	Буква = Команда.Имя;
	
	СписокБукв = Новый Массив;
	СписокБукв.Добавить(Буква);
	СписокБукв.Добавить(НРег(Буква));
	
	Если Буква = "Е" Тогда
		СписокБукв.Добавить("Ё");
		СписокБукв.Добавить("ё");
	КонецЕсли;
	
	Если Буква = "И" Тогда
		СписокБукв.Добавить("Й");
		СписокБукв.Добавить("й");
	КонецЕсли;
	
	Список.Параметры.УстановитьЗначениеПараметра("СписокБукв", СписокБукв);
	
	УстановитьПометку(Команда);
	
КонецПроцедуры

&НаКлиенте
Процедура УдалитьФильтрПоПервойБукве(Команда)
	
	ПараметрКомпоновкиДанных = Новый ПараметрКомпоновкиДанных("СписокБукв");
	ЗначениеПараметраКомпоновкиДанных = Список.Параметры.НайтиЗначениеПараметра(ПараметрКомпоновкиДанных);
	Если ЗначениеПараметраКомпоновкиДанных = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ЗначениеПараметраКомпоновкиДанных.Использование = Ложь;
	
	УстановитьПометку(Команда);
	
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ 

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	ПодготовитьДинамическийСписок();
	СоздатьПанельСБуквами();
	
КонецПроцедуры // ПриСозданииНаСервере()

Данный текст необходимо вставить в модуль формы списка справочника.

Процедуру "ПриСозданииНаСервере" вручную назначить обработчиком одноименного события формы.
События формы

Если данному событию уже назначен обработчик, то необходимо дополнить его строками процедуры "ПриСозданииНаСервере" из листинга.

Реквизита формы "Список" не должен содержать произвольного запроса. Если список формируется произвольным запросом, то в запрос необходимо дописать условие компоновки:
 {ГДЕ (ПОДСТРОКА(ИмяТаблицы.Наименование, 1, 1) В (&СписокБукв))}
и удалить процедуру "ПодготовитьДинамическийСписок" и все ее вызовы.

Файлы обработки:

-