Как реализовать выбор из списка для справочника в управляемой форме 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке интерфейсов на управляемых формах часто возникает задача заменить стандартное открытие тяжелой формы выбора справочника на компактный выпадающий список. Это особенно актуально для справочников с небольшим количеством элементов (например, статусы, категории или подразделения), где пользователю удобнее выбрать значение одним кликом. Рассмотрим подробно, как организовать такой выбор, чтобы в реквизит записывалась именно ссылка на объект, а не строковое представление.

Способ 1: Свойство справочника «Быстрый выбор»

Самый простой способ, не требующий написания кода, заключается в изменении настроек самого объекта метаданных. Разберем, как это работает. В конфигураторе выберем нужный нам справочник и перейдем на закладку «Редактирование». Там мы найдем флаг Быстрый выбор.

Проанализируем последствия включения этой опции:

Однако этот способ глобален. Если нам нужно, чтобы в одной форме был выпадающий список, а в другой — стандартный выбор, следует использовать настройки элементов формы.

Способ 2: Свойство элемента формы «Режим выбора из списка»

Рассмотрим ситуацию, когда поведение поля ввода нужно настроить индивидуально на конкретной форме. Для этого в редакторе управляемой формы выберем элемент, связанный с нашим справочником, и обратимся к его свойствам.

Выполним следующие шаги:

  1. Найдем свойство Режим выбора из списка (ListChoiceMode) и установим его в значение Истина.
  2. Теперь поле ввода перестанет реагировать на стандартную кнопку открытия формы выбора.
  3. Заполним свойство Список выбора (ChoiceList). Если данные статичны, это можно сделать прямо в конфигураторе, добавив элементы, где Значение — это ссылка на элемент справочника, а Представление — понятный пользователю текст.

Если данные в справочнике меняются, нам потребуется программное заполнение списка при открытии формы или при активации поля.

Способ 3: Программное заполнение через событие «Начало выбора из списка»

Разберем более гибкий вариант, который позволяет динамически обновлять список выбора перед его показом пользователю. Это гарантирует, что в списке всегда будут только актуальные ссылки. Для реализации воспользуемся событием НачалоВыбораИзСписка (StartListChoice).

Посмотрим на пример кода, который выполняет эту задачу:


&НаКлиенте
Процедура ПодразделениеНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)
    
    // Получаем актуальный список ссылок с сервера
    СписокЭлементов = ПолучитьСписокПодразделенийНаСервере();
    
    // Очищаем текущий список выбора элемента формы
    Элемент.СписокВыбора.Очистить();
    
    // Заполняем список новыми данными
    Для Каждого ЭлементСписка Из СписокЭлементов Цикл
        Элемент.СписокВыбора.Добавить(ЭлементСписка.Значение, ЭлементСписка.Представление);
    КонецЦикла;
    
КонецПроцедуры

&НаСервере
Функция ПолучитьСписокПодразделенийНаСервере()
    
    РезультатСписком = Новый СписокЗначений;
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Подразделения.Ссылка КАК Ссылка,
        |   Подразделения.Наименование КАК Наименование
        |ИЗ
        |   Справочник.Подразделения КАК Подразделения
        |ГДЕ
        |   НЕ Подразделения.ПометкаУдаления";
    
    Выборка = Запрос.Выполнить().Выбрать();
    
    Пока Выборка.Следующий() Цикл
        // Важно: в поле Значение передаем Ссылку!
        РезультатСписком.Добавить(Выборка.Ссылка, Выборка.Наименование);
    КонецЦикла;
    
    Возврат РезультатСписком;
    
КонецФункции

В данном примере мы обеспечиваем передачу Ссылка в качестве значения. Когда пользователь выберет строку из списка, реквизит формы получит именно ссылку на объект справочника, что и требовалось автору вопроса.

Способ 4: Использование метода «ВыбратьИзСписка»

Выясним причину, по которой иногда стандартных свойств недостаточно. Если нам нужно вызвать выпадающий список программно по какому-то особому условию, мы можем использовать метод ВыбратьИзСписка. Рассмотрим, как перехватить стандартное нажатие кнопки выбора:


&НаКлиенте
Процедура ИмяПоляНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    // Отменяем стандартное открытие формы выбора
    СтандартнаяОбработка = Ложь;
    
    // Формируем список значений (лучше подготовить его заранее на сервере)
    СписокДляВыбора = ПолучитьСписокНаСервере();
    
    // Вызываем выпадающее меню рядом с элементом формы
    ОписаниеОповещения = Новый ОписаниеОповещения("ПослеВыбораИзСписка", ЭтотОбъект);
    ВыбратьИзСписка(ОписаниеОповещения, СписокДляВыбора, Элемент);
    
КонецПроцедуры

&НаКлиенте
Процедура ПослеВыбораИзСписка(ВыбранныйЭлемент, ДополнительныеПараметры) Экспорт
    
    Если ВыбранныйЭлемент <> Неопределено Тогда
        // Присваиваем выбранную ссылку реквизиту
        Объект.ИмяРеквизита = ВыбранныйЭлемент.Значение;
    КонецЕсли;
    
КонецПроцедуры

Важные технические нюансы

При реализации выбора из списка стоит учитывать несколько важных моментов, влияющих на стабильность и производительность системы:

Таким образом, мы проанализировали основные инструменты платформы 1С для реализации удобного выбора элементов справочника. Выбор конкретного метода зависит от объема данных и требований к гибкости интерфейса в вашем приложении.

← На главную