К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как выбрать из списка значений в 1С

Как выбрать значение из списка в 1С: методы ВыбратьИзМеню, ПоказатьВыборИзСписка, поле со списком выбора. Примеры кода, проверка результата и типичные ошибки.

Выбор из списка значений — одна из самых частых задач во встроенном языке 1С: пользователю нужно предложить несколько вариантов (вид документа, склад, способ обработки), а программа должна получить выбранное значение и продолжить работу. Способ реализации зависит от того, где выполняется код: в управляемом приложении, в обычных формах или в тонком/веб-клиенте с асинхронной моделью.

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

Список значений: что это и как его заполнить

СписокЗначений — универсальная коллекция 1С, которая хранит пары «значение + представление». Именно она передаётся в методы выбора. Представление видит пользователь, значение получает программа — они могут различаться, что удобно для ссылок и перечислений.

Заполнение выполняется методом Добавить:

Список = Новый СписокЗначений;

Список.Добавить(Перечисления.СтавкиНДС.НДС20, "НДС 20%");

Список.Добавить(Перечисления.СтавкиНДС.НДС10, "НДС 10%");

Список.Добавить(Перечисления.СтавкиНДС.БезНДС, "Без НДС", Истина);

Третий параметр Истина помечает элемент картинкой-флажком. Метод Вставить позволяет добавить элемент в нужную позицию, а СортироватьПоПредставлению — упорядочить список перед показом. Элементы можно получать по индексу через Список.Получить(0) или искать через НайтиПоЗначению.

Выбор в управляемых формах: ПоказатьВыборИзСписка

Основной метод для управляемого приложения — ПоказатьВыборИзСписка, вызываемый у объекта ОписаниеОповещения. Он открывает список и не останавливает выполнение: результат приходит в отдельную процедуру-обработчик.

&НаКлиенте

Процедура ВыбратьСтавку(Команда)

Список = Новый СписокЗначений;

Список.Добавить(ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС20"), "НДС 20%");

Список.Добавить(ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС10"), "НДС 10%");

Оповещение = Новый ОписаниеОповещения("ПослеВыбораСтавки", ЭтотОбъект);

ПоказатьВыборИзСписка(Оповещение, Список, Элементы.СтавкаНДС);

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

&НаКлиенте

Процедура ПослеВыбораСтавки(ВыбранныйЭлемент, ДополнительныеПараметры) Экспорт

Если ВыбранныйЭлемент = Неопределено Тогда

Возврат; // пользователь отменил выбор

КонецЕсли;

СтавкаНДС = ВыбранныйЭлемент.Значение;

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

Третий параметр метода — элемент формы, возле которого откроется список (например, кнопка или поле ввода). Четвёртым параметром можно передать элемент списка, который будет выделен по умолчанию, — это удобно, когда нужно показать текущее значение реквизита.

Обработчик обязательно объявляется с директивой &НаКлиенте и ключевым словом Экспорт, иначе платформа не сможет его вызвать. Через третий параметр ОписаниеОповещения передаются дополнительные параметры — например, имя реквизита, если один обработчик обслуживает несколько списков.

Порядок действий
  1. 1
    Сформируйте СписокЗначений и заполните его методом Добавить
  2. 2
    Создайте ОписаниеОповещения с именем процедуры-обработчика
  3. 3
    Вызовите ПоказатьВыборИзСписка, передав оповещение, список и элемент формы
  4. 4
    В обработчике проверьте результат на Неопределено
  5. 5
    Присвойте ВыбранныйЭлемент.Значение нужному реквизиту

Выбор в обычных формах: ВыбратьИзСписка и ВыбратьИзМеню

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

Метод ВыбратьИзСписка вызывается у самого списка значений и возвращает выбранный элемент:

ВыбранныйЭлемент = Список.ВыбратьИзСписка("Выберите ставку", ЭлементыФормы.СтавкаНДС);

Если ВыбранныйЭлемент = Неопределено Тогда

Возврат;

КонецЕсли;

СтавкаНДС = ВыбранныйЭлемент.Значение;

Метод ВыбратьИзМеню работает похоже, но отображает компактное выпадающее меню у указанного элемента формы. Он подходит для коротких списков действий — «Печать», «Отправить по почте», «Экспорт». Заголовок у меню не задаётся, поэтому смысл выбора должен быть понятен из контекста кнопки.

Сравнение вариантов

ПоказатьВыборИзСписка

Управляемые формы, тонкий и веб-клиент. Асинхронный, требует обработчика оповещения

ВыбратьИзСписка

Обычные формы. Синхронный, показывает список с заголовком, возвращает элемент напрямую

ВыбратьИзМеню

Обычные формы. Компактное меню у элемента, подходит для коротких списков действий

Поле ввода со списком выбора

Когда выбор нужен постоянно на форме, а не по команде. Не требует кода показа

Выбор без кода: список выбора у поля ввода

Если варианты нужны пользователю постоянно, а не по нажатию кнопки, программный показ списка избыточен. Достаточно заполнить свойство СписокВыбора у поля ввода — пользователь увидит выпадающий список при редактировании.

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Элементы.Склад.СписокВыбора.Добавить(Справочники.Склады.НайтиПоНаименованию("Основной"));

Элементы.Склад.СписокВыбора.Добавить(Справочники.Склады.НайтиПоНаименованию("Резервный"));

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

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

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

Главная точка отказа в логике выбора — отмена действия пользователем. При закрытии списка клавишей Esc или крестиком обработчик всё равно вызывается, но получает Неопределено. Если не проверить этот случай, следующая строка обратится к ВыбранныйЭлемент.Значение и вызовет ошибку «Поле объекта не обнаружено».

Помимо отмены полезно проверять и сам выбранный элемент: представление и значение доступны как свойства, пометка — через ВыбранныйЭлемент.Пометка. Если дальнейшая логика зависит от типа значения, добавьте явную проверку через ТипЗнч — особенно когда список заполняется динамически из запроса.

Контрольные точки

Как проверить результат

Значение, пришедшее в обработчик
Норма

Элемент списка с заполненными Значением и Представлением

Тревожный признак

Неопределено — пользователь отменил выбор

Поведение при повторном открытии
Норма

Список открывается, ранее выбранный элемент подсвечен

Тревожный признак

Список пустой или дублирует элементы — он заполняется повторно без очистки

Запись в реквизит
Норма

В реквизит попадает именно Значение элемента

Тревожный признак

В реквизит записывается представление-строка или сам элемент списка

Типичные ошибки и ограничения

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

Вторая группа ошибок связана с заполнением списка: повторное добавление элементов при каждом нажатии кнопки без Список.Очистить(), заполнение ссылок на клиенте через Справочники (недоступно в тонком клиенте — используйте серверный вызов или ПредопределенноеЗначение) и передача в реквизит представления вместо значения.

Типичные ошибки
01
Отсутствие проверки на Неопределено — ошибка выполнения при отмене выбора пользователем
02
Использование модальных методов в управляемых формах — исключение платформы при запрете модальности
03
Заполнение списка в обработчике команды без очистки — дублирование элементов при повторном вызове
04
Обращение к менеджерам справочников на клиенте — недоступность в тонком и веб-клиенте
05
Запись в реквизит представления вместо значения — нарушение типов данных и ошибки при проведении

Ещё одно ограничение: ПоказатьВыборИзСписка недоступен в серверном коде и в фоновых заданиях — любой интерактивный выбор возможен только на клиенте. Если выбор нужен внутри серверной логики, сначала получите значение на клиенте, а затем передайте его параметром в серверную процедуру.

Когда список значений не подходит

Список значений — инструмент для короткого набора вариантов. Когда вариантов десятки и сотни (номенклатура, контрагенты), используйте стандартную форму выбора объекта с отбором и поиском: метод ПоказатьВводЗначения или открытие формы выбора через ОткрытьФорму с параметрами отбора. Для булева выбора «да/нет» достаточно ПоказатьВопрос — он семантически точнее списка из двух элементов.

Маршрут решения

Как выбрать действие

Вариантов 2–10, они известны заранееПоказатьВыборИзСписка или список выбора у поля ввода
Нужен выбор из большого справочника с поискомОткрытие формы выбора объекта с параметрами отбора
Нужен ответ Да/Нет или подтверждениеПоказатьВопрос с РежимДиалогаВопрос
Конфигурация на обычных формахСинхронные ВыбратьИзСписка или ВыбратьИзМеню

Частые вопросы

Как выделить в списке элемент по умолчанию?

Передайте нужный элемент списка четвёртым параметром в ПоказатьВыборИзСписка: найдите его через Список.НайтиПоЗначению(ТекущееЗначение) и подставьте в вызов. При открытии списка этот элемент будет выделен.

Почему возникает ошибка «Использование модальных окон запрещено»?

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

Как передать в обработчик выбора дополнительные данные?

Третьим параметром конструктора ОписаниеОповещения передайте произвольное значение или структуру: Новый ОписаниеОповещения("Обработчик", ЭтотОбъект, Параметры). В обработчике оно придёт вторым аргументом.

Можно ли выбрать из списка несколько значений сразу?

Штатные методы выбора возвращают один элемент. Для множественного выбора используйте метод Список.ОтметитьЭлементы() в обычных формах, а в управляемых — собственную форму с таблицей пометок или вызов ПоказатьОтметкуЭлементов, где она доступна.

Чем представление отличается от значения элемента списка?

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

Как заполнить список значений на сервере и показать на клиенте?

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

Итог

Что важно запомнить

В управляемых формах выбор из списка делается через ПоказатьВыборИзСписка с описанием оповещения, в обычных — синхронными ВыбратьИзСписка и ВыбратьИзМеню. Результат всегда проверяется на Неопределено, в реквизит записывается Значение элемента, а не представление. Для постоянного выбора на форме используйте свойство СписокВыбора поля ввода, а для больших наборов данных — форму выбора объекта.