Управляемые формы. Настраиваем отбор в списке выбора.
Исходные данные:
Информационная база на основе конфигурации "1С:ERP Управление предприятием 2". Несколько пользователей могут создавать в базе документы "Табель учёта рабочего времени", причём у каждого пользователя есть свой перечень подразделений, по которым он может ввести табель. Список доступных подразделений для каждого пользователя хранится в регистре сведений.
Задача:
Сделать так, чтобы в форме документа "Табель учёта рабочего времени" при заполнении реквизита "Подразделение" пользователь мог выбирать только из доступных ему подразделений. То есть, нужно организовать отбор.
Реализация решения:
Можно выполнить решение непосредственно в конфигурации, а можно воспользоваться механизмом расширений конфигурации.
Итак, в режиме "Конфигуратор", в списке объектов конфигурации находим документ "Табель учёта рабочего времени" и открываем для редактирования его форму "Форма документа".
Нас интересует элемент формы "Подразделение" и его кнопка "Выбор из списка". Обработаем событие "НачалоВыбора", создав соответствующую процедуру в модуле формы.
&НаКлиенте Процедура ПодразделениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) ДанныеДляСпискаВыбора = ПолучитьДанныеДляСпискаВыбора(); Если ТипЗнч(ДанныеДляСпискаВыбора) = Тип("Массив") Тогда СтандартнаяОбработка = Ложь; ДанныеВыбора = Новый СписокЗначений; ДанныеВыбора.ЗагрузитьЗначения(ДанныеДляСпискаВыбора); КонецЕсли; КонецПроцедуры &НаСервере Функция ПолучитьДанныеДляСпискаВыбора() // В этой серверной процедуре мы получаем массив подразделений, доступных пользователю. // Код для получения массива здесь не приводится. Возврат(МассивПодразделений); КонецФункции
ДанныеВыбора – этим параметром мы и формируем список выбора. В итоге, пользователь, нажав кнопку выбора, увидит сформированный нами список подразделений.
Но есть ещё одна проблема: если пользователь начнёт вводить название подразделения в поле ввода, то система предложит ему список всех подразделений, а не только доступных.
Я попробовал исправить это таким образом:
Элементы.Подразделение.СписокВыбора = Истина;
Но ничего не вышло. Поле ввода вообще перестало заполняться.
После этого была ещё попытка добиться желаемого результата с помощью события "ИзменениеТекстаРедактирования", однако и она не увенчалась успехом. В синтаксис-помощнике, в описании этого события, говорится, что оно не допускает вызова серверных процедур, а получение списка нужных подразделений видится логичным именно на сервере.
Более удачной стала мысль сформировать список подразделений при создании формы. И в соответствии с этой мыслью в обработчик события "ПриСозданииНаСервере" был добавлен следующий код:
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) МассивПодразделений = // Код, который формирует массив доступных подразделений, здесь не приводится. НовыйПараметр = Новый ПараметрВыбора("Отбор.Ссылка", МассивПодразделений); НовыйМассив = Новый Массив(); НовыйМассив.Добавить(НовыйПараметр); НовыеПараметры = Новый ФиксированныйМассив(НовыйМассив); Элементы.Подразделение.ПараметрыВыбора = НовыеПараметры; КонецПроцедуры
Вот после такой настройки выбор в поле "Подразделение" стал работать так, как нам нужно.