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

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

При разработке внешних обработок или модификации существующих конфигураций на платформе 1С:Предприятие 8.3 (Управляемые формы) часто возникает задача создания удобного интерфейса для выбора значения из ограниченного набора данных. Рассмотрим ситуацию, когда нам необходимо реализовать выпадающий список для выбора одного проекта, причем данные приходят в формате «идентификатор:наименование».

В этой статье мы подробно разберем, как правильно настроить элементы формы, как программно заполнить список выбора и как сделать так, чтобы пользователь видел понятные названия, а программа оперировала техническими кодами (ID).

Основные свойства элемента формы для работы со списками

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

  1. РежимВыбораИзСписка: если установить это свойство в значение Истина, поле превращается в классический «комбобокс». Пользователь сможет выбирать значения только из предложенного списка, а стандартное окно выбора (например, справочника) открываться не будет.
  2. КнопкаВыпадающегоСписка: определяет наличие маленькой стрелочки справа в поле. Если мы хотим, чтобы список открывался по нажатию, это свойство должно быть включено.
  3. СписокВыбора: это коллекция типа СписокЗначений, которая хранится непосредственно в элементе формы. Именно ее мы будем заполнять нашими проектами.

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

Программная настройка и заполнение списка

Разберем пример кода, который обычно размещается в модуле формы в процедуре ПриСозданииНаСервере. Хотя существует способ выполнить добавление реквизитов и элементов формы на управляемые формы легко и просто без кодирования, понимание базовых механизмов необходимо. Представим, что у нас есть реквизит формы ВыбранныйПроект с типом Строка (в нем мы будем хранить ID проекта).


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // 1. Получаем доступ к элементу формы
    ЭлементПроект = Элементы.ВыбранныйПроект;
    
    // 2. Настраиваем режим работы поля
    ЭлементПроект.РежимВыбораИзСписка = Истина;
    ЭлементПроект.КнопкаВыпадающегоСписка = Истина;
    
    // 3. Очищаем старые значения, если они могли там быть
    ЭлементПроект.СписокВыбора.Очистить();
    
    // 4. Заполняем список данными (в реальности данные приходят из вашего источника)
    // Допустим, у нас есть массив структур или соответствие
    ЭлементПроект.СписокВыбора.Добавить("ID_001", "Проект Альфа");
    ЭлементПроект.СписокВыбора.Добавить("ID_002", "Проект Бета");
    ЭлементПроект.СписокВыбора.Добавить("ID_003", "Проект Гамма");
    
КонецПроцедуры

Обратите внимание на метод Добавить. Мы используем два параметра: Значение и Представление. Это критически важный момент. В Значение мы передаем технический ID, а в Представление — понятное человеку имя. В итоге в поле ввода пользователь увидит «Проект Альфа», но при выборе в сам реквизит Объект.ВыбранныйПроект запишется строка «ID_001».

Разделение значения и представления: глубокий анализ

Часто начинающие разработчики совершают ошибку, записывая в список только наименования. Это приводит к проблемам, если названия проектов совпадают или если в дальнейшем нужно найти объект в базе по уникальному идентификатору. Проанализируем, как 1С обрабатывает эти данные:

Когда свойство РежимВыбораИзСписка активно, платформа автоматически сопоставляет текущее значение реквизита со значениями из СписокВыбора. Если соответствие найдено, в поле отображается Представление этого элемента. Если мы установим Объект.ВыбранныйПроект = "ID_002", пользователь увидит в интерфейсе текст «Проект Бета».

Динамическое заполнение через событие НачалоВыбора

Ситуация усложняется, если список проектов зависит от других данных на форме (например, от выбранного контрагента). В этом случае заполнение в ПриСозданииНаСервере нам не подходит. Выясним, как реализовать динамическое обновление списка.

Для этого используется клиентское событие НачалоВыбора. Рассмотрим по шагам алгоритм действий в этом обработчике:


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

Использование метода ЗагрузитьЗначения удобно, когда у вас есть готовый массив, но помните, что он заменяет только значения, игнорируя представления. Для полноценной работы с парами ID-Наименование лучше использовать цикл или метод Загрузить для копирования всей коллекции СписокЗначений.

Запрет произвольного ввода и очистка

Чтобы интерфейс был профессиональным, проанализируем еще два свойства. Во-первых, если включен РежимВыбораИзСписка, пользователь по умолчанию не может ввести текст, которого нет в списке. Однако, если вы хотите разрешить и выбор, и свободный ввод (например, поиск по списку), оставьте РежимВыбораИзСписка = Ложь, но включите КнопкаВыпадающегоСписка = Истина.

Во-вторых, полезно включить свойство КнопкаОчистки. Это добавит в поле крестик, позволяющий пользователю быстро обнулить выбор. Программно это выглядит так:

Элементы.ВыбранныйПроект.КнопкаОчистки = Истина;

Обработка результата выбора

После того как пользователь выбрал проект, нам часто нужно выполнить какое-то действие (например, пересчитать суммы в табличной части). Для этого используем событие ПриИзменении. Разберем пример:


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

Важный нюанс: если ваш список выбора содержит очень много элементов (более 50-100), использование выпадающего списка может стать неудобным для пользователя. В таких случаях рекомендуется использовать стандартное окно выбора или реализовать подбор с поиском, однако для небольших списков проектов (как в рассматриваемом случае) механизм СписокВыбора является оптимальным решением.

Подводя итог, мы выяснили, что для создания выпадающего списка в Управляемых Формах достаточно скомбинировать свойства РежимВыбораИзСписка, заполнить коллекцию СписокВыбора парами "Значение-Представление" и, при необходимости, управлять этим процессом в событии НачалоВыбора.

← На главную