При разработке интерфейсов на управляемых формах часто возникает задача заменить стандартное открытие тяжелой формы выбора справочника на компактный выпадающий список. Это особенно актуально для справочников с небольшим количеством элементов (например, статусы, категории или подразделения), где пользователю удобнее выбрать значение одним кликом. Рассмотрим подробно, как организовать такой выбор, чтобы в реквизит записывалась именно ссылка на объект, а не строковое представление.
Самый простой способ, не требующий написания кода, заключается в изменении настроек самого объекта метаданных. Разберем, как это работает. В конфигураторе выберем нужный нам справочник и перейдем на закладку «Редактирование». Там мы найдем флаг Быстрый выбор.
Проанализируем последствия включения этой опции:
Однако этот способ глобален. Если нам нужно, чтобы в одной форме был выпадающий список, а в другой — стандартный выбор, следует использовать настройки элементов формы.
Рассмотрим ситуацию, когда поведение поля ввода нужно настроить индивидуально на конкретной форме. Для этого в редакторе управляемой формы выберем элемент, связанный с нашим справочником, и обратимся к его свойствам.
Выполним следующие шаги:
Режим выбора из списка (ListChoiceMode) и установим его в значение Истина.Список выбора (ChoiceList). Если данные статичны, это можно сделать прямо в конфигураторе, добавив элементы, где Значение — это ссылка на элемент справочника, а Представление — понятный пользователю текст.Если данные в справочнике меняются, нам потребуется программное заполнение списка при открытии формы или при активации поля.
Разберем более гибкий вариант, который позволяет динамически обновлять список выбора перед его показом пользователю. Это гарантирует, что в списке всегда будут только актуальные ссылки. Для реализации воспользуемся событием НачалоВыбораИзСписка (StartListChoice).
Посмотрим на пример кода, который выполняет эту задачу:
&НаКлиенте
Процедура ПодразделениеНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)
// Получаем актуальный список ссылок с сервера
СписокЭлементов = ПолучитьСписокПодразделенийНаСервере();
// Очищаем текущий список выбора элемента формы
Элемент.СписокВыбора.Очистить();
// Заполняем список новыми данными
Для Каждого ЭлементСписка Из СписокЭлементов Цикл
Элемент.СписокВыбора.Добавить(ЭлементСписка.Значение, ЭлементСписка.Представление);
КонецЦикла;
КонецПроцедуры
&НаСервере
Функция ПолучитьСписокПодразделенийНаСервере()
РезультатСписком = Новый СписокЗначений;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Подразделения.Ссылка КАК Ссылка,
| Подразделения.Наименование КАК Наименование
|ИЗ
| Справочник.Подразделения КАК Подразделения
|ГДЕ
| НЕ Подразделения.ПометкаУдаления";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// Важно: в поле Значение передаем Ссылку!
РезультатСписком.Добавить(Выборка.Ссылка, Выборка.Наименование);
КонецЦикла;
Возврат РезультатСписком;
КонецФункции
В данном примере мы обеспечиваем передачу Ссылка в качестве значения. Когда пользователь выберет строку из списка, реквизит формы получит именно ссылку на объект справочника, что и требовалось автору вопроса.
Выясним причину, по которой иногда стандартных свойств недостаточно. Если нам нужно вызвать выпадающий список программно по какому-то особому условию, мы можем использовать метод ВыбратьИзСписка. Рассмотрим, как перехватить стандартное нажатие кнопки выбора:
&НаКлиенте
Процедура ИмяПоляНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
// Отменяем стандартное открытие формы выбора
СтандартнаяОбработка = Ложь;
// Формируем список значений (лучше подготовить его заранее на сервере)
СписокДляВыбора = ПолучитьСписокНаСервере();
// Вызываем выпадающее меню рядом с элементом формы
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеВыбораИзСписка", ЭтотОбъект);
ВыбратьИзСписка(ОписаниеОповещения, СписокДляВыбора, Элемент);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораИзСписка(ВыбранныйЭлемент, ДополнительныеПараметры) Экспорт
Если ВыбранныйЭлемент <> Неопределено Тогда
// Присваиваем выбранную ссылку реквизиту
Объект.ИмяРеквизита = ВыбранныйЭлемент.Значение;
КонецЕсли;
КонецПроцедуры
При реализации выбора из списка стоит учитывать несколько важных моментов, влияющих на стабильность и производительность системы:
Параметры выбора.Режим обновления списка выбора. Если вы заполняете список программно, установите значение Не обновлять, чтобы платформа не пыталась автоматически добавить в список историю последних введенных значений.СписокЗначений в качестве первого параметра (Значение) передается именно объект типа СправочникСсылка, а не строка. Только так будет обеспечена ссылочная целостность данных.Таким образом, мы проанализировали основные инструменты платформы 1С для реализации удобного выбора элементов справочника. Выбор конкретного метода зависит от объема данных и требований к гибкости интерфейса в вашем приложении.