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

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

Выбор из списка значений в 1С: способы и настройка

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

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

Существует несколько разных инструментов, которые часто путают: свойство «Список выбора» у поля ввода, метод ВыбратьИзСписка(), объект СписокЗначений и перечисления. У каждого своё назначение, свои ограничения и свой сценарий применения. Ниже разобраны все основные варианты с конкретными действиями и примерами кода.

Какие инструменты выбора из списка есть в 1С

Прежде чем настраивать, важно выбрать правильный механизм. В платформе 1С:Предприятие есть четыре основных подхода, и они не взаимозаменяемы в полной мере.

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

Объект СписокЗначений при этом является универсальным контейнером: он используется и для заполнения списка выбора, и как параметр диалогов, и для передачи множественного отбора в запросы и отчёты.

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

Список выбора поля

Подходит для одного поля с небольшим набором вариантов. Ограничение: значения не хранятся централизованно, при изменении нужно править форму или код.

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

Подходит для разовых интерактивных вопросов пользователю из кода. Ограничение: требует программирования и обработки результата.

Перечисление

Подходит, когда набор значений фиксирован и используется в разных объектах. Ограничение: добавление значения требует изменения конфигурации и обновления базы.

Справочник

Подходит, когда список должен пополняться пользователями без изменения конфигурации. Ограничение: избыточен для двух-трёх фиксированных вариантов.

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

Самый простой сценарий — задать выпадающий список для реквизита без единой строки кода. Порядок действий:

  1. Откройте конфигуратор и найдите нужный объект (документ, справочник, обработка).
  2. Откройте форму объекта и выделите поле ввода, для которого нужен список.
  3. В палитре свойств найдите свойство «Список выбора» и нажмите кнопку выбора (троеточие).
  4. В открывшемся редакторе добавьте строки: в колонке «Значение» укажите хранимое значение, в колонке «Представление» — текст, который увидит пользователь.
  5. Установите свойство «Режим выбора из списка» в значение «Истина», если хотите запретить ручной ввод произвольного текста.
  6. Обновите конфигурацию базы данных (F7) и проверьте форму в режиме предприятия.

Обратите внимание на связку двух свойств. Сам по себе заполненный «Список выбора» лишь предлагает варианты, но не запрещает ввести другое значение. Только включённый «Режим выбора из списка» делает ввод строго ограниченным.

Порядок действий
  1. 1
    Откройте форму объекта в конфигураторе и выделите нужное поле
  2. 2
    Заполните свойство «Список выбора» значениями и представлениями
  3. 3
    Включите «Режим выбора из списка», чтобы запретить произвольный ввод
  4. 4
    Обновите конфигурацию базы данных
  5. 5
    Откройте форму в режиме предприятия и проверьте выпадающий список

Программное заполнение списка выбора

Когда варианты зависят от контекста — например, от вида документа или прав пользователя, — список выбора заполняется кодом. В управляемой форме это делается в обработчике ПриСозданииНаСервере или при изменении связанного реквизита.

&НаСервере

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

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

Элементы.СпособДоставки.СписокВыбора.Добавить("Самовывоз", "Самовывоз со склада");

Элементы.СпособДоставки.СписокВыбора.Добавить("Курьер", "Доставка курьером");

Элементы.СпособДоставки.СписокВыбора.Добавить("ТК", "Транспортная компания");

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

Метод Добавить() принимает значение, представление и при необходимости картинку. Перед заполнением список стоит очищать методом Очистить(), иначе при повторном вызове обработчика значения продублируются — это одна из самых частых ошибок.

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

Типичные ошибки
01
Не вызван Очистить() перед заполнением — значения в списке дублируются при каждом открытии формы
02
Заполнен «Список выбора», но не включён «Режим выбора из списка» — пользователь вводит произвольный текст, и проверки в запросах перестают работать
03
Список заполняется на клиенте обращением к базе — ошибка вызова серверных методов в клиентском контексте
04
Значение из списка сохраняется в реквизит неподходящего типа — строка обрезается или не записывается

Интерактивный выбор: ВыбратьИзСписка и ПоказатьВыборИзСписка

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

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

Список.Добавить("Да", "Подтвердить операцию");

Список.Добавить("Нет", "Отменить");

Выбранное = Список.ВыбратьЭлемент("Выберите действие");

Если Выбранное <> Неопределено Тогда

Сообщить("Выбрано: " + Выбранное.Значение);

КонецЕсли;

В управляемых формах синхронные вызовы запрещены режимом использования модальности, поэтому применяется асинхронный вариант с описанием оповещения:

&НаКлиенте

Процедура ВыбратьДействие(Команда)

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

Список.Добавить("Печать", "Печать документа");

Список.Добавить("Отправка", "Отправка по почте");

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

ПоказатьВыборИзСписка(Оповещение, Список, , "Выберите действие");

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

&НаКлиенте

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

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

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

КонецЕсли;

// обработка ВыбранныйЭлемент.Значение

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

Ключевой момент — обязательная проверка результата на Неопределено: если пользователь нажал Escape или закрыл диалог, метод вернёт именно это значение, и обращение к свойствам выбранного элемента вызовет ошибку.

Когда вместо списка нужно перечисление или справочник

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

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

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

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

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

Вариантов 2–5, они не меняются и нужны в одной формеЗаполните «Список выбора» у поля и включите «Режим выбора из списка»
Набор значений фиксирован и используется в нескольких объектах и запросахСоздайте перечисление в конфигураторе
Пользователи должны сами пополнять вариантыСоздайте справочник и используйте ссылочный реквизит
Нужен разовый вопрос пользователю из кодаИспользуйте ПоказатьВыборИзСписка с описанием оповещения

Объект СписокЗначений: полезные возможности

Объект СписокЗначений — это не только источник для диалогов. Он поддерживает сортировку, поиск, пометки и загрузку массивов, что делает его удобным контейнером для передачи данных между процедурами.

  • Список.НайтиПоЗначению(Значение) — проверка, есть ли значение в списке;
  • Список.ЗагрузитьЗначения(Массив) — быстрое заполнение из массива;
  • Список.ВыгрузитьЗначения() — обратное преобразование в массив (удобно для параметра запроса с оператором В);
  • Список.СортироватьПоПредставлению() — упорядочивание перед показом пользователю;
  • пометки элементов — для диалогов с множественным выбором (метод ОтметитьЭлементы() в обычных формах).

В запросах список значений часто передают как параметр для отбора по нескольким значениям: ГДЕ Номенклатура В (&СписокНоменклатуры). Платформа автоматически разворачивает список в набор значений.

Проверка результата и частые проблемы

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

Типичная проблема — выбранное значение «теряется» после записи. Причина почти всегда в несоответствии типов: реквизит объекта имеет тип «Строка» с ограничением длины, а значение из списка длиннее, либо реквизит ссылочного типа, а список заполнен строками. Проверьте тип реквизита в конфигураторе и приведите значения списка к нему.

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

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

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

Выпадающий список у поля
Норма

При нажатии на кнопку выбора открывается список с заданными вариантами

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

Список пуст или не открывается — проверьте заполнение и тип поля

Сохранение значения
Норма

После записи и повторного открытия объекта выбранное значение на месте

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

Значение пустое или обрезанное — несоответствие типа или длины реквизита

Запрет произвольного ввода
Норма

При вводе текста не из списка платформа выдаёт сообщение о недопустимом значении

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

Произвольный текст сохраняется — не включён «Режим выбора из списка»

Отмена диалога
Норма

При нажатии Escape код корректно завершается без ошибок

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

Ошибка обращения к свойствам Неопределено — нет проверки результата выбора

Итог

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

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

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

Как запретить ввод значения, которого нет в списке?

Установите у поля формы свойство «Режим выбора из списка» в значение «Истина». Тогда платформа заблокирует ручной ввод произвольного текста и разрешит только выбор из заполненного списка. Сам по себе заполненный «Список выбора» такого запрета не даёт.

Чем отличается ВыбратьИзСписка от ПоказатьВыборИзСписка?

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

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

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

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

Код заполнения вызывается повторно (например, при каждом обновлении формы), а перед добавлением не выполняется Элемент.СписокВыбора.Очистить(). Добавьте очистку первой строкой процедуры заполнения.

Можно ли заполнить список выбора значениями из базы данных?

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

Что лучше для статусов документа — список выбора или перечисление?

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