При разработке интерфейсов на управляемых формах 1С программисты часто сталкиваются с задачей: нужно предложить пользователю выбрать одно значение из заранее подготовленного списка — в этом поможет инструментарий для ускорения разработки и отладки кода 1С. Типичная ошибка новичка заключается в создании реквизита формы с типом СписокЗначений и попытке вывести его на форму. В этом случае система воспринимает его как полноценную таблицу для редактирования списка, а не как инструмент выбора одного элемента. Рассмотрим подробнее, как сделать этот процесс удобным и корректным с точки зрения платформы 8.3.
Этот способ является наиболее стандартным и «красивым» для пользователя — сделать этот процесс удобным и корректным поможет инструмент для настройки контроля ввода и интерфейса без программирования. Он позволяет превратить обычное поле ввода в выпадающий список (Combo Box) — для этого подойдёт расширение для улучшения подбора и автоподбора в управляемых формах. Разберем этот процесс по шагам:
СправочникСсылка.Контрагенты (или другой подходящий тип), но никак не СписокЗначений. Назовем его ВыбранныйМаршрут.Истина. Также рекомендуется включить свойство КнопкаСпискаВыбора.ПриСозданииНаСервере).Проанализируем пример кода для заполнения такого списка из запроса:
&НаСервере
Процедура ЗаполнитьСписокВыбораНаСервере()
// Очищаем текущий список выбора элемента формы
Элементы.ВыбранныйМаршрут.СписокВыбора.Очистить();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| ДополнительныеЗначения.Ссылка КАК Значение
|ИЗ
| Справочник.ЗначенияСвойствОбъектов КАК ДополнительныеЗначения";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// Добавляем значение в свойство СписокВыбора конкретного элемента
Элементы.ВыбранныйМаршрут.СписокВыбора.Добавить(Выборка.Значение);
КонецЦикла;
КонецПроцедуры
Обратите внимание на использование коллекции Элементы. Важно обращаться именно к Элементы.ИмяЭлемента.СписокВыбора, а не к реквизиту формы. В этом случае при нажатии на кнопку выбора у пользователя сразу откроется список с вариантами, и выбор будет происходить в один клик или через двойной щелчок.
Бывают ситуации, когда список выбора должен формироваться динамически в момент нажатия кнопки выбора, или когда стандартный выпадающий список не подходит по дизайну. В этом случае мы используем событие НачалоВыбора.
Рассмотрим алгоритм действий:
НачалоВыбора.СтандартнаяОбработка = Ложь, чтобы система не открывала стандартную форму выбора справочника.ПоказатьВыборИзСписка. Это современный стандарт разработки для платформы 8.3, исключающий использование модальных окон.Пример реализации в модуле формы:
&НаКлиенте
Процедура ВыбранныйМаршрутНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Формируем список значений
СписокВариантов = Новый СписокЗначений;
СписокВариантов.Добавить("Склад 1", "Основной склад");
СписокВариантов.Добавить("Склад 2", "Транзитный склад");
// Описываем оповещение, которое сработает после выбора
Оповещение = Новый ОписаниеОповещения("ПослеВыбораМаршрута", ЭтотОбъект);
// Показываем список рядом с элементом
ПоказатьВыборИзСписка(Оповещение, СписокВариантов, Элемент);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораМаршрута(ВыбранныйЭлемент, ДополнительныеПараметры) Экспорт
Если ВыбранныйЭлемент <> Неопределено Тогда
// Записываем результат в реквизит формы
Объект.ВыбранныйМаршрут = ВыбранныйЭлемент.Значение;
КонецЕсли;
КонецПроцедуры
Выясним причину, по которой стоит использовать именно этот метод. Во-первых, он не блокирует интерфейс (асинхронность). Во-вторых, он позволяет передать пользователю список, который вообще не привязан к метаданным (например, массив строк или структур).
Работа со списками внутри таблиц имеет свои нюансы. Если мы просто установим режим выбора из списка для колонки, то этот список будет одинаковым для всех строк. Если же нам нужно, чтобы в каждой строке был свой уникальный набор значений, проанализируем следующий подход:
Мы должны использовать событие ПриАктивизацииЯчейки или НачалоВыбора для конкретного поля в строке таблицы. Посмотрим на пример кода:
&НаКлиенте
Процедура ТаблицаТоварыЗначениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ТекущиеДанные = Элементы.ТаблицаТовары.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
// Получаем список значений, специфичный для этой строки (например, через серверный вызов)
СписокДляСтроки = ПолучитьСписокДляТовара(ТекущиеДанные.Товар);
Оповещение = Новый ОписаниеОповещения("ОбработатьВыборВТаблице", ЭтотОбъект, ТекущиеДанные);
ПоказатьВыборИзСписка(Оповещение, СписокДляСтроки, Элемент);
КонецПроцедуры
Проанализируем часто встречающиеся проблемы при работе со списками:
Число, а вы добавляете в список выбора Строку, то при попытке выбора значение не будет сохранено в реквизит. Всегда проверяйте типы значений, добавляемых через СписокВыбора.Добавить(). Для контроля записи данных в реквизиты есть утилита для контроля заполнения и обязательности ввода реквизитов.СписокВыбора не при создании формы, а при изменении каких-то параметров (например, при выборе организации), не забывайте вызывать метод Очистить(). В противном случае новые значения будут просто дописываться в конец списка при каждом действии.Истина. Это позволит выбирать значения, просто начиная набирать текст в поле ввода, без открытия выпадающего окна.ЭлементыФормы. В современных управляемых формах (8.3) правильно писать Элементы.Рассмотрим подробнее использование свойства АвтоВыборОтметки. Если вы используете СписокЗначений именно как реквизит (например, для множественного подбора), то включение этого свойства позволяет открывать форму списка сразу в режиме выбора, что экономит клики пользователя.
Таким образом, мы разобрали основные способы программного управления выбором из списка. Выбор конкретного метода зависит от архитектуры вашей формы: если список статичен — используйте РежимВыбораИзСписка, если динамичен и сложен — используйте НачалоВыбора с асинхронным методом ПоказатьВыборИзСписка.