1С, управляемые формы. Как установить отбор в списке выбора.

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *