Разработка и Конфигурация · 11 мин
Как выбрать из списка значений в 1С
Как выбрать значение из списка в 1С: методы ВыбратьИзМеню, ПоказатьВыборИзСписка, поле со списком выбора. Примеры кода, проверка результата и типичные ошибки.
Выбор из списка значений — одна из самых частых задач во встроенном языке 1С: пользователю нужно предложить несколько вариантов (вид документа, склад, способ обработки), а программа должна получить выбранное значение и продолжить работу. Способ реализации зависит от того, где выполняется код: в управляемом приложении, в обычных формах или в тонком/веб-клиенте с асинхронной моделью.
В современных конфигурациях на управляемых формах напрямую использовать модальные методы нельзя — платформа блокирует их в режиме запрета модальности. Поэтому основной рабочий инструмент — метод ПоказатьВыборИзСписка с описанием оповещения. В старых конфигурациях на обычных формах применяются синхронные ВыбратьИзСписка и ВыбратьИзМеню. Ниже разобраны все варианты с примерами кода, проверкой результата и типичными ошибками.
Список значений: что это и как его заполнить
СписокЗначений — универсальная коллекция 1С, которая хранит пары «значение + представление». Именно она передаётся в методы выбора. Представление видит пользователь, значение получает программа — они могут различаться, что удобно для ссылок и перечислений.
Заполнение выполняется методом Добавить:
Список = Новый СписокЗначений;
Список.Добавить(Перечисления.СтавкиНДС.НДС20, "НДС 20%");
Список.Добавить(Перечисления.СтавкиНДС.НДС10, "НДС 10%");
Список.Добавить(Перечисления.СтавкиНДС.БезНДС, "Без НДС", Истина);
Третий параметр Истина помечает элемент картинкой-флажком. Метод Вставить позволяет добавить элемент в нужную позицию, а СортироватьПоПредставлению — упорядочить список перед показом. Элементы можно получать по индексу через Список.Получить(0) или искать через НайтиПоЗначению.
Выбор в управляемых формах: ПоказатьВыборИзСписка
Основной метод для управляемого приложения — ПоказатьВыборИзСписка, вызываемый у объекта ОписаниеОповещения. Он открывает список и не останавливает выполнение: результат приходит в отдельную процедуру-обработчик.
&НаКлиенте
Процедура ВыбратьСтавку(Команда)
Список = Новый СписокЗначений;
Список.Добавить(ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС20"), "НДС 20%");
Список.Добавить(ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС10"), "НДС 10%");
Оповещение = Новый ОписаниеОповещения("ПослеВыбораСтавки", ЭтотОбъект);
ПоказатьВыборИзСписка(Оповещение, Список, Элементы.СтавкаНДС);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораСтавки(ВыбранныйЭлемент, ДополнительныеПараметры) Экспорт
Если ВыбранныйЭлемент = Неопределено Тогда
Возврат; // пользователь отменил выбор
КонецЕсли;
СтавкаНДС = ВыбранныйЭлемент.Значение;
КонецПроцедуры
Третий параметр метода — элемент формы, возле которого откроется список (например, кнопка или поле ввода). Четвёртым параметром можно передать элемент списка, который будет выделен по умолчанию, — это удобно, когда нужно показать текущее значение реквизита.
Обработчик обязательно объявляется с директивой &НаКлиенте и ключевым словом Экспорт, иначе платформа не сможет его вызвать. Через третий параметр ОписаниеОповещения передаются дополнительные параметры — например, имя реквизита, если один обработчик обслуживает несколько списков.
- 1Сформируйте СписокЗначений и заполните его методом Добавить
- 2Создайте ОписаниеОповещения с именем процедуры-обработчика
- 3Вызовите ПоказатьВыборИзСписка, передав оповещение, список и элемент формы
- 4В обработчике проверьте результат на Неопределено
- 5Присвойте ВыбранныйЭлемент.Значение нужному реквизиту
Выбор в обычных формах: ВыбратьИзСписка и ВыбратьИзМеню
В конфигурациях на обычных формах (режим совместимости, старые типовые решения) выбор выполняется синхронно — код останавливается до действия пользователя.
Метод ВыбратьИзСписка вызывается у самого списка значений и возвращает выбранный элемент:
ВыбранныйЭлемент = Список.ВыбратьИзСписка("Выберите ставку", ЭлементыФормы.СтавкаНДС);
Если ВыбранныйЭлемент = Неопределено Тогда
Возврат;
КонецЕсли;
СтавкаНДС = ВыбранныйЭлемент.Значение;
Метод ВыбратьИзМеню работает похоже, но отображает компактное выпадающее меню у указанного элемента формы. Он подходит для коротких списков действий — «Печать», «Отправить по почте», «Экспорт». Заголовок у меню не задаётся, поэтому смысл выбора должен быть понятен из контекста кнопки.
Сравнение вариантов
Управляемые формы, тонкий и веб-клиент. Асинхронный, требует обработчика оповещения
Обычные формы. Синхронный, показывает список с заголовком, возвращает элемент напрямую
Обычные формы. Компактное меню у элемента, подходит для коротких списков действий
Когда выбор нужен постоянно на форме, а не по команде. Не требует кода показа
Выбор без кода: список выбора у поля ввода
Если варианты нужны пользователю постоянно, а не по нажатию кнопки, программный показ списка избыточен. Достаточно заполнить свойство СписокВыбора у поля ввода — пользователь увидит выпадающий список при редактировании.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Элементы.Склад.СписокВыбора.Добавить(Справочники.Склады.НайтиПоНаименованию("Основной"));
Элементы.Склад.СписокВыбора.Добавить(Справочники.Склады.НайтиПоНаименованию("Резервный"));
КонецПроцедуры
Дополнительные свойства управляют поведением: КнопкаСпискаВыбора показывает кнопку открытия списка, РедактированиеТекста запрещает ввод произвольного значения вне списка. Для ссылочных типов часто удобнее стандартный быстрый выбор через форму выбора справочника — тогда список выбора вообще не нужен.
Проверка результата и отказ от выбора
Главная точка отказа в логике выбора — отмена действия пользователем. При закрытии списка клавишей Esc или крестиком обработчик всё равно вызывается, но получает Неопределено. Если не проверить этот случай, следующая строка обратится к ВыбранныйЭлемент.Значение и вызовет ошибку «Поле объекта не обнаружено».
Помимо отмены полезно проверять и сам выбранный элемент: представление и значение доступны как свойства, пометка — через ВыбранныйЭлемент.Пометка. Если дальнейшая логика зависит от типа значения, добавьте явную проверку через ТипЗнч — особенно когда список заполняется динамически из запроса.
Как проверить результат
Элемент списка с заполненными Значением и Представлением
Неопределено — пользователь отменил выбор
Список открывается, ранее выбранный элемент подсвечен
Список пустой или дублирует элементы — он заполняется повторно без очистки
В реквизит попадает именно Значение элемента
В реквизит записывается представление-строка или сам элемент списка
Типичные ошибки и ограничения
Самая частая ошибка — попытка использовать синхронный ВыбратьИзСписка в управляемом приложении. При включённом режиме запрета модальности (стандарт для новых конфигураций) такой вызов завершится исключением. Переносите логику на ПоказатьВыборИзСписка с оповещением.
Вторая группа ошибок связана с заполнением списка: повторное добавление элементов при каждом нажатии кнопки без Список.Очистить(), заполнение ссылок на клиенте через Справочники (недоступно в тонком клиенте — используйте серверный вызов или ПредопределенноеЗначение) и передача в реквизит представления вместо значения.
Ещё одно ограничение: ПоказатьВыборИзСписка недоступен в серверном коде и в фоновых заданиях — любой интерактивный выбор возможен только на клиенте. Если выбор нужен внутри серверной логики, сначала получите значение на клиенте, а затем передайте его параметром в серверную процедуру.
Когда список значений не подходит
Список значений — инструмент для короткого набора вариантов. Когда вариантов десятки и сотни (номенклатура, контрагенты), используйте стандартную форму выбора объекта с отбором и поиском: метод ПоказатьВводЗначения или открытие формы выбора через ОткрытьФорму с параметрами отбора. Для булева выбора «да/нет» достаточно ПоказатьВопрос — он семантически точнее списка из двух элементов.
Как выбрать действие
Частые вопросы
Как выделить в списке элемент по умолчанию?
Передайте нужный элемент списка четвёртым параметром в ПоказатьВыборИзСписка: найдите его через Список.НайтиПоЗначению(ТекущееЗначение) и подставьте в вызов. При открытии списка этот элемент будет выделен.
Почему возникает ошибка «Использование модальных окон запрещено»?
В свойствах конфигурации включён режим запрета модальности, а код вызывает синхронный метод вроде ВыбратьИзСписка. Замените его на ПоказатьВыборИзСписка с описанием оповещения — либо измените режим совместимости, если дорабатываете устаревшую конфигурацию.
Как передать в обработчик выбора дополнительные данные?
Третьим параметром конструктора ОписаниеОповещения передайте произвольное значение или структуру: Новый ОписаниеОповещения("Обработчик", ЭтотОбъект, Параметры). В обработчике оно придёт вторым аргументом.
Можно ли выбрать из списка несколько значений сразу?
Штатные методы выбора возвращают один элемент. Для множественного выбора используйте метод Список.ОтметитьЭлементы() в обычных формах, а в управляемых — собственную форму с таблицей пометок или вызов ПоказатьОтметкуЭлементов, где она доступна.
Чем представление отличается от значения элемента списка?
Значение — это данные любого типа (ссылка, число, перечисление), которые получает программа. Представление — строка, которую видит пользователь. Если представление не задано, платформа покажет строковое представление самого значения.
Как заполнить список значений на сервере и показать на клиенте?
Сформируйте массив структур или сам СписокЗначений в серверной функции, верните его на клиент, а вызов ПоказатьВыборИзСписка выполните уже в клиентской процедуре. СписокЗначений сериализуется между сервером и клиентом без дополнительных преобразований.
Что важно запомнить
В управляемых формах выбор из списка делается через ПоказатьВыборИзСписка с описанием оповещения, в обычных — синхронными ВыбратьИзСписка и ВыбратьИзМеню. Результат всегда проверяется на Неопределено, в реквизит записывается Значение элемента, а не представление. Для постоянного выбора на форме используйте свойство СписокВыбора поля ввода, а для больших наборов данных — форму выбора объекта.