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

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

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

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

Шаг 1. Создание и правильная типизация реквизита формы

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

Выполним правильную последовательность действий:

  1. Перейдем на вкладку Реквизиты нужной управляемой формы.
  2. Добавим новый реквизит (например, Периодичность или МоеПоле).
  3. Назначим ему простой тип: Строка (желательно фиксированной длины, например 20–50 символов) или Число. Тип данных должен соответствовать тому, какие именно значения будут храниться и обрабатываться в коде.
  4. Перетащим созданный реквизит в дерево элементов формы, чтобы создать поле ввода.

Шаг 2. Настройка выпадающего списка в свойствах элемента

Теперь настроим элемент управления так, чтобы он работал в режиме выбора из фиксированного набора:

  1. Выделим добавленный элемент в дереве элементов формы и откроем окно его свойств.
  2. Установим флажок у свойства РежимВыбораИзСписка (РежимВыбораИзСписка = Истина).
  3. Установим флажок у свойства КнопкаВыпадающегоСписка (КнопкаВыпадающегоСписка = Истина).
  4. Найдем свойство Список выбора (СписокВыбора) и откроем диалог редактирования. В левой колонке укажем фактическое значение (например, День, Месяц, Год), а в правой — понятное для пользователя Представление (например, По дням, По месяцам, По годам).

Если тип реквизита задан строго (например, Строка конкретной длины), визуальный редактор конфигуратора позволит ввести и значение, и представление без каких-либо ограничений.

Шаг 3. Решение проблемы: список не раскрывается по клику

Часто разработчики сталкиваются с ситуацией, когда по клику мыши на поле список не раскрывается, а открывается только при переходе клавишей Tab с другого поля или по горячим клавишам F4 / Alt + Стрелка вниз. Причина заключается в том, что поле по умолчанию ожидает ручной ввод текста.

Чтобы превратить поле в полноценный нередактируемый выпадающий список (аналог стандартного комбобокса), настроим следующие свойства элемента формы:

  1. Свойство Редактирование текста установим в значение Ложь (снимем флажок). Это заставит форму открывать список выбора сразу при клике мыши в любую область поля ввода.
  2. Свойство Запретить ввод некорректных значений переведем в Истина, чтобы исключить ввод сторонних данных с клавиатуры.

Шаг 4. Программное заполнение списка выбора

Если список значений формируется динамически или вы хотите хранить программный код в модуле формы, а не в визуальных настройках элемента, список выбора можно заполнить при инициализации формы. Посмотрим на пример кода в серверном обработчике:


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

Обращение к выбранному значению в коде

Проанализируем частые ошибки при обращении к значению созданного реквизита в управляемых формах:

На клиенте значение реквизита формы доступно напрямую по имени либо через контекст формы:


&НаКлиенте
Процедура ПроверитьЗначение()
    
    // Правильные варианты обращения:
    ВыбранноеЗначение = МоеПоле;
    ВыбранноеЗначение = ЭтаФорма.МоеПоле;
    
    ПоказатьОповещениеПользователя("Выбор",, ВыбранноеЗначение);
    
КонецПроцедуры

Обратите внимание: обращение ЭтотОбъект.МоеПоле на клиенте в управляемом приложении вызовет ошибку "Переменная не определена: ЭтотОбъект", так как контекст ЭтотОбъект доступен только на сервере.

Альтернативный вариант: Поле переключателя

Если вариантов для выбора немного (от 2 до 4), интерфейсно удобнее использовать не выпадающий список, а радиокнопки или тумблер. Для этого:

  1. В свойствах элемента формы меняем свойство Вид с ПолеВвода на ПолеПереключателя.
  2. Значения вариантов настраиваются точно так же — через свойство элемента Список выбора.
  3. Для современного внешнего вида свойство Вид переключателя можно установить в значение Тумблер.

Такой подход полностью снимает проблему с раскрытием выпадающего меню и делает все доступные варианты видимыми сразу при открытии формы.

← На главную