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

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

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

Метод 1. Использование режима выбора из списка в элементе формы

Этот способ является наиболее стандартным и «красивым» для пользователя — сделать этот процесс удобным и корректным поможет инструмент для настройки контроля ввода и интерфейса без программирования. Он позволяет превратить обычное поле ввода в выпадающий список (Combo Box) — для этого подойдёт расширение для улучшения подбора и автоподбора в управляемых формах. Разберем этот процесс по шагам:

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

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


&НаСервере
Процедура ЗаполнитьСписокВыбораНаСервере()
    
    // Очищаем текущий список выбора элемента формы
    Элементы.ВыбранныйМаршрут.СписокВыбора.Очистить();
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ РАЗЛИЧНЫЕ
        |	ДополнительныеЗначения.Ссылка КАК Значение
        |ИЗ
        |	Справочник.ЗначенияСвойствОбъектов КАК ДополнительныеЗначения";
    
    Выборка = Запрос.Выполнить().Выбрать();
    
    Пока Выборка.Следующий() Цикл
        // Добавляем значение в свойство СписокВыбора конкретного элемента
        Элементы.ВыбранныйМаршрут.СписокВыбора.Добавить(Выборка.Значение);
    КонецЦикла;

КонецПроцедуры

Обратите внимание на использование коллекции Элементы. Важно обращаться именно к Элементы.ИмяЭлемента.СписокВыбора, а не к реквизиту формы. В этом случае при нажатии на кнопку выбора у пользователя сразу откроется список с вариантами, и выбор будет происходить в один клик или через двойной щелчок.

Метод 2. Использование события НачалоВыбора и асинхронный вызов

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

Рассмотрим алгоритм действий:

  1. У элемента формы устанавливаем событие НачалоВыбора.
  2. В обработчике события устанавливаем СтандартнаяОбработка = Ложь, чтобы система не открывала стандартную форму выбора справочника.
  3. Используем асинхронный метод ПоказатьВыборИзСписка. Это современный стандарт разработки для платформы 8.3, исключающий использование модальных окон.

Пример реализации в модуле формы:


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

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

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

Метод 3. Выбор из списка в табличной части

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

Мы должны использовать событие ПриАктивизацииЯчейки или НачалоВыбора для конкретного поля в строке таблицы. Посмотрим на пример кода:


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

Важные замечания и типичные ошибки

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

Рассмотрим подробнее использование свойства АвтоВыборОтметки. Если вы используете СписокЗначений именно как реквизит (например, для множественного подбора), то включение этого свойства позволяет открывать форму списка сразу в режиме выбора, что экономит клики пользователя.

Таким образом, мы разобрали основные способы программного управления выбором из списка. Выбор конкретного метода зависит от архитектуры вашей формы: если список статичен — используйте РежимВыбораИзСписка, если динамичен и сложен — используйте НачалоВыбора с асинхронным методом ПоказатьВыборИзСписка.

← На главную