Управляемые формы. Настраиваем отбор в списке выбора.

Исходные данные:
Информационная база на основе конфигурации "1С:ERP Управление предприятием 2". Несколько пользователей могут создавать в базе документы "Табель учёта рабочего времени", причём у каждого пользователя есть свой перечень подразделений, по которым он может ввести табель. Список доступных подразделений для каждого пользователя хранится в регистре сведений.

Задача:
Сделать так, чтобы в форме документа "Табель учёта рабочего времени" при заполнении реквизита "Подразделение" пользователь мог выбирать только из доступных ему подразделений. То есть, нужно организовать отбор.

Реализация решения:
Можно выполнить решение непосредственно в конфигурации, а можно воспользоваться механизмом расширений конфигурации.

Итак, в режиме "Конфигуратор", в списке объектов конфигурации находим документ "Табель учёта рабочего времени" и открываем для редактирования его форму "Форма документа".

Нас интересует элемент формы "Подразделение" и его кнопка "Выбор из списка". Обработаем событие "НачалоВыбора", создав соответствующую процедуру в модуле формы.

&НаКлиенте
Процедура ПодразделениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	ДанныеДляСпискаВыбора = ПолучитьДанныеДляСпискаВыбора();
	
	Если ТипЗнч(ДанныеДляСпискаВыбора) = Тип("Массив") Тогда
		
		СтандартнаяОбработка = Ложь;
		
		ДанныеВыбора = Новый СписокЗначений;
		ДанныеВыбора.ЗагрузитьЗначения(ДанныеДляСпискаВыбора);
		
	КонецЕсли;
	
КонецПроцедуры


&НаСервере
Функция ПолучитьДанныеДляСпискаВыбора()
	
	// В этой серверной процедуре мы получаем массив подразделений, доступных пользователю.
	// Код для получения массива здесь не приводится.	
			
	Возврат(МассивПодразделений);			
						
КонецФункции

ДанныеВыбора – этим параметром мы и формируем список выбора. В итоге, пользователь, нажав кнопку выбора, увидит сформированный нами список подразделений.

Но есть ещё одна проблема: если пользователь начнёт вводить название подразделения в поле ввода, то система предложит ему список всех подразделений, а не только доступных.

Я попробовал исправить это таким образом:

Элементы.Подразделение.СписокВыбора = Истина;

Но ничего не вышло. Поле ввода вообще перестало заполняться.

После этого была ещё попытка добиться желаемого результата с помощью события "ИзменениеТекстаРедактирования", однако и она не увенчалась успехом. В синтаксис-помощнике, в описании этого события, говорится, что оно не допускает вызова серверных процедур, а получение списка нужных подразделений видится логичным именно на сервере.

Более удачной стала мысль сформировать список подразделений при создании формы. И в соответствии с этой мыслью в обработчик события "ПриСозданииНаСервере" был добавлен следующий код:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

	МассивПодразделений = // Код, который формирует массив доступных подразделений, здесь не приводится.

	НовыйПараметр = Новый ПараметрВыбора("Отбор.Ссылка", МассивПодразделений);
	НовыйМассив = Новый Массив();
	НовыйМассив.Добавить(НовыйПараметр);
	НовыеПараметры = Новый ФиксированныйМассив(НовыйМассив);
	Элементы.Подразделение.ПараметрыВыбора = НовыеПараметры;
				
КонецПроцедуры

Вот после такой настройки выбор в поле "Подразделение" стал работать так, как нам нужно.