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