При переходе с управляемых форм на обычные или при поддержке старых конфигураций разработчики часто сталкиваются с тем, что привычные механизмы работы с интерфейсом выглядят иначе. Одной из таких задач является создание выпадающего списка для выбора значения. В этой статье мы подробно разберем, как правильно настроить элементы управления, чтобы пользователь мог выбирать данные из заранее определенного набора значений, и выясним, почему стандартное присвоение списка значений реквизиту не дает желаемого результата в интерфейсе.
Рассмотрим ситуацию, с которой часто начинают новички: создают реквизит, программно инициализируют его как СписокЗначений и заполняют данными. Однако при нажатии на кнопку выбора в форме ничего не происходит или открывается пустое окно. Проанализируем причину: в обычных формах данные (реквизит) и способ их отображения (элемент управления на форме) разделены более жестко, чем в управляемых. Сам по себе реквизит может хранить выбранное значение, но за визуальный список вариантов отвечает специальное свойство элемента формы — СписокВыбора.
Таким образом, недостаточно просто наполнить переменную в коде. Необходимо обратиться к объекту метаданных формы, найти нужный элемент и наполнить его внутреннюю коллекцию. Разберем по шагам, как это сделать правильно для разных типов объектов.
Для начала проанализируем визуальные настройки элемента управления ПолеВвода. Чтобы список заработал, нужно правильно скомбинировать несколько свойств в палитре свойств или в коде:
КнопкаВыбора (три точки), которая обычно открывает отдельное окно справочника.СписокЗначений, которую нам и нужно заполнить.Посмотрим на пример программного заполнения списка при открытии формы:
Процедура ПриОткрытии()
// Обращаемся к элементу управления через коллекцию ЭлементыФормы
Элемент = ЭлементыФормы.МойРеквизит;
// Обязательно включаем видимость кнопки списка выбора
Элемент.КнопкаСпискаВыбора = Истина;
// Если нужно запретить ручной ввод
Элемент.РежимВыбораИзСписка = Истина;
// Очищаем и заполняем список
Элемент.СписокВыбора.Очистить();
Элемент.СписокВыбора.Добавить(1, "Первый вариант");
Элемент.СписокВыбора.Добавить(2, "Второй вариант");
Элемент.СписокВыбора.Добавить(3, "Третий вариант");
КонецПроцедуры
Если вам нужен классический выпадающий список «как в браузере», мы рекомендуем использовать вместо ПолеВвода элемент ПолеВыбора. В этом случае свойство РежимВыбораИзСписка включено по умолчанию, и элемент оптимизирован именно под этот сценарий работы. Проанализируем пример кода для этого элемента:
// В ПолеВыбора список заполняется аналогично
ЭлементыФормы.ПолеВыбора1.СписокВыбора.Добавить("Хрень", "Запрос хрени");
ЭлементыФормы.ПолеВыбора1.СписокВыбора.Добавить("Хрень2", "Запрос хрени2");
Здесь важно помнить о разнице между значением и представлением. Метод Добавить() принимает два основных параметра: само значение (которое запишется в базу) и текст представления (который увидит пользователь). Это позволяет хранить в системе, например, числовые коды или ссылки, показывая пользователю понятные названия.
Ситуация усложняется, когда нам нужно реализовать выбор из списка внутри таблицы (например, в табличной части или в динамическом списке). Если мы попытаемся обратиться напрямую к колонке, то увидим, что у объекта КолонкаТабличногоПоля нет свойства СписокВыбора. Выясним, где оно спрятано.
Доступ к списку осуществляется через свойство ЭлементУправления. Рассмотрим пошаговый алгоритм реализации для колонки ВидДокумента:
// Предположим, у нас есть ТабличноеПоле1 и колонка ВидОплаты
Колонка = ЭлементыФормы.ТабличноеПоле1.Колонки.ВидОплаты;
// 1. Устанавливаем режим редактирования для колонки
Колонка.РежимРедактирования = РежимРедактированияКолонки.ВходПриВводе;
// 2. Получаем доступ к полю ввода внутри колонки
ПолеВводаКолонки = Колонка.ЭлементУправления;
// 3. Настраиваем свойства выпадающего списка
ПолеВводаКолонки.КнопкаСпискаВыбора = Истина;
ПолеВводаКолонки.РежимВыбораИзСписка = Истина;
// 4. Заполняем данные
ПолеВводаКолонки.СписокВыбора.Очистить();
ПолеВводаКолонки.СписокВыбора.Добавить("Наличные");
ПолеВводаКолонки.СписокВыбора.Добавить("Безналичные");
ПолеВводаКолонки.СписокВыбора.Добавить("Карта");
Важное примечание: Обращение к ЭлементУправления сработает только в том случае, если для колонки в конфигураторе выбран тип «Поле ввода». Если тип колонки не определен или установлены иные настройки отображения, попытка обратиться к списку выбора вызовет ошибку во время выполнения кода.
Иногда состав списка зависит от того, что выбрано в других полях. В таких случаях заполнение при открытии формы не подходит. Разберем, как менять список «на лету». Для этого воспользуемся событием НачалоВыбора.
Процедура МойРеквизитНачалоВыбора(Элемент, СтандартнаяОбработка)
// Отменяем стандартное открытие формы выбора (если это ссылка на справочник)
СтандартнаяОбработка = Ложь;
// Формируем актуальный список
Элемент.СписокВыбора.Очистить();
Если РеквизитТипОплаты = Перечисления.ТипыОплат.Наличные Тогда
Элемент.СписокВыбора.Добавить("В кассу №1");
Иначе
Элемент.СписокВыбора.Добавить("На расчетный счет");
КонецЕсли;
// В обычных формах принудительно вызываем выпадающий список
Элемент.ВыбратьИзСписка();
КонецПроцедуры
Проанализируем еще два полезных свойства, которые часто упускают из виду при работе с обычными формами:
РежимВыбораИзСписка выключен, но список выбора заполнен, это свойство позволяет пользователю начать вводить текст, а система будет предлагать варианты из списка, подходящие под введенные символы.Посмотрим, как можно задать список выбора еще на уровне метаданных, не прибегая к программированию. В окне свойств реквизита (или элемента формы) найдите пункт Строки списка выбора. Там можно вручную прописать статичные значения, которые будут доступны всегда. Это удобно для простых статусов или настроек, которые редко меняются.
В отличие от управляемых форм, обычные формы не всегда мгновенно перерисовывают изменения в свойствах элементов. Если вы программно изменили СписокВыбора, когда фокус уже стоит в этом поле, список может не обновиться визуально до следующей активации элемента. В критических случаях можно использовать метод Активизировать() для этого элемента формы, чтобы заставить систему обновить его состояние.
Подводя итог, можно сказать, что реализация выбора из списка в обычных формах требует четкого понимания того, к какому объекту вы обращаетесь. Помните: реквизит хранит данные, а элемент управления (через ЭлементыФормы) управляет тем, как эти данные выбираются пользователем через свойство СписокВыбора. Следуя этим правилам, вы сможете создавать удобные и интуитивно понятные интерфейсы в любых конфигурациях на платформе 1С:Предприятие 8. Для быстрого поиска синтаксических конструкций и типовых приемов настройки интерфейса пригодится шпаргалка разработчика по работе с формами 1С.