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